目录
2.1.2.1 物理卷(Physical Volume,PV)
2.1.2.3 逻辑卷(Logical Volume,LV)
5.3 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式
5.6 使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。
1 RAID阵列
1.1 初识RAID
1.1.1 什么是RAID
廉价磁盘冗余阵列 (Redundant Arrays of Inexpensive Disks) 或独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方的方法。通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能。
1.1.2 RAID的实现方式
1.1.2.1 软件RAID
通过操作系统提供的磁盘管理功能将多块硬盘配置成逻辑盘来构建阵列。
软件阵列可以提供数据冗余功能,但是磁盘子系统的性能会有所降低。因此会影响机器的速度,不适合大数据流量的服务器。
1.1.2.2 硬件RAID
硬件RAID主要有外接式磁盘阵列柜和内接式磁盘阵列卡两种实现方式。
磁盘阵列柜主要是用在大型的服务器上,具可热交换(Hot Swap)的特性,但是价格较贵。
内接式磁盘阵列卡,也就是常说的RAID卡,有着较低的价格,能够提供在线扩容、动态修改阵列级别、自动数据恢复、驱动器漫游、超高速缓冲等功能。
1.1.3 RAID级别
1.1.3.1 RAID 0
带区卷(stripe),在所有的级别中,RAID 0的速度是最快的。在使用相同型号、相同容量的磁盘构建是,有着较好的性能。
RAID 0会将磁盘先切片出等量的数据块(chunk,一般可设置大小为4KB-1MB),在写入文件时,会将文件按照chunk的大小切片,之后再存入各个磁盘中。
虽然RAID 0读写时可以并行处理,但是其并没有冗余的功能,也就是说RAID 0不具备灾备功能,如果一个磁盘损坏,所有数据都会丢失。
1.1.3.2 RAID 1
镜像卷(marror),使用两的倍数块磁盘实现数据的完全备份。
在创建镜像卷的时候最好使用两块型号、大小完全相同的磁盘进行。如果使用不同容量的磁盘,总容量会以较小的那块磁盘的容量为主。
RAID 1再写入时,一份数据会被分为两股,分别写入各个磁盘,因此在写入时,RAID 1的表现并不好。但是在读取文件时,RAID 1却有着不错的性能。
1.1.3.3 RAID 1+0与RAID 0+1
RAID 0性能好,但是数据不安全;RAID 1数据安全,但是性能不佳。在这种情形下,RAID 0和RAID 1的组合出现了。
RAID 1+0是现组成两组RAID 1,在将两组RAID 1组成一组RAID 0。故名思意,RAID 0+1就是先组成RAID 0,在组成RAID 1。
这么做使得数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力。在提高读写速度的情况下获得了一块及以下磁盘的容错能力。
1.1.3.4 RAID 5
RAID5(分布式奇偶校验的独立磁盘结构)可以理解为是RAID 0和RAID 1的折中方案,需要三块及以上的磁盘才能组成这种磁盘阵列。
尽管RAID 5可以为数据提供灾备能力,但是其保障程度并不如RAID 1。不过RAID 的磁盘利用率比RAID 1高,每块磁盘只使用了1/n的容量用于备份。
1.1.3.5 RAID总结
项目 | RAID 0 | RAID 1 | RAID 10 | RAID 5 |
---|---|---|---|---|
最少磁盘数 | 2 | 2 | 4 | 3 |
最大容错磁盘数 | 0 | n-1 | n/2 | 1 |
理论写入性能 | n | 1 | n/2 | <n-1 |
理论读出性能 | n | n | n | <n-1 |
可用容量 | n | 1 | n/2 | n-1 |
一般应用 | 注重性能但数据不那么重要的环境 | 数据备份 | 服务器、云系统 | 数据备份 |
注:表中的n均表示磁盘数
1.2 软件RAID的实现
注:生产环境中不建议使用软件RAID
1.2.1 确认系统已安装mdadm
#系统中默认没有安装mdadm
[root@localhost ~]# rpm -qa | grep mdadm
[root@localhost ~]#
#使用dnf安装mdadm
[root@localhost ~]# dnf -y install mdadm
#ubuntu使用apt
xiao@xiao-virtual-machine:~$ sudo apt-get install mdadm -y
1.2.2 添加磁盘
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 5G 0 disk
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rl-root 253:0 0 17G 0 lvm /
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
[root@localhost ~]#
1.2.3 改变磁盘的文件系统
[root@localhost ~]# fdisk /dev/sda
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-10485759, default 10485759):
Created a new partition 1 of type 'Linux' and of size 5 GiB.
#通过l可以知道fd对应Linux raid auto
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#
#sdb、sdc同理,略,利用fdisk查看文件系统可知:
[root@localhost ~]# fdisk -l /dev/sd*
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 10485759 10483712 5G fd Linux raid autodetect
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 10485759 10483712 5G fd Linux raid autodetect
Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 10485759 10483712 5G fd Linux raid autodetect
[root@localhost ~]#
1.2.4 创建RAID阵列(以RAID 1为例)
mdadm的基本语法
[root@localhost ~]# mdadm --create /dev/md0 --level[0|1|5] --chunk=Nk --raid-devices=N --spare-devices=N
#选项与参数
--create 创建新的磁盘阵列
--level 设备的chunk大小,一般为64k或512k
--chunk 设置磁盘阵列的级别,常用的为0、1、5
--raid-devices=N 使用几个磁盘分区作为磁盘阵列的设备
--spare-devices=N 使用几个磁盘作为备用设备
#查看磁盘阵列设备的详细信息
[root@localhost ~]# mdadm --detail /dev/sda
创建名为/dev/md0的RAID 1设备,使用三个分区,其中一个作为备用设备
[root@localhost ~]# mdadm --create /dev/md0 --level=1 --raid-devices=2 --spare-devices=1 /dev/sd{a1,b1,c1}
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]#
查看创建状态
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0: #设备名
Version : 1.2
Creation Time : Thu Feb 29 07:48:18 2024 #RAID的创建时间
Raid Level : raid1 #RAID的级别
Array Size : 5236736 (4.99 GiB 5.36 GB) #可用容量
Used Dev Size : 5236736 (4.99 GiB 5.36 GB)
Raid Devices : 2 #组成RAID的磁盘数量
Total Devices : 3 #磁盘的总数
Persistence : Superblock is persistent
Update Time : Thu Feb 29 07:48:40 2024
State : clean
Active Devices : 2 #启用的设备树
Working Devices : 3 #总数
Failed Devices : 0 #损坏的设备数
Spare Devices : 1 #备份磁盘的数量
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : f4c77782:6e4a5f13:a9c6f9a0:9e45c610
Events : 14
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 - spare /dev/sdc1
[root@localhost ~]#
1.2.5 将设备添加阵列
[root@localhost ~]# mdadm --manage /dev/md0 --add /dev/sde1
mdadm: added /dev/sde1
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Feb 29 07:48:18 2024
Raid Level : raid1
Array Size : 5236736 (4.99 GiB 5.36 GB)
Used Dev Size : 5236736 (4.99 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Feb 29 07:57:58 2024
State : clean
Active Devices : 2
Working Devices : 4
Failed Devices : 0
Spare Devices : 2
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : f4c77782:6e4a5f13:a9c6f9a0:9e45c610
Events : 18
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 - spare /dev/sdc1
3 8 65 - spare /dev/sde1
[root@localhost ~]#
1.2.6 将设备从阵列中删除
[root@localhost ~]# mdadm --manage /dev/md0 --remove /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md0
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Feb 29 07:48:18 2024
Raid Level : raid1
Array Size : 5236736 (4.99 GiB 5.36 GB)
Used Dev Size : 5236736 (4.99 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Thu Feb 29 08:08:35 2024
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : f4c77782:6e4a5f13:a9c6f9a0:9e45c610
Events : 19
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
3 8 65 - spare /dev/sde1
[root@localhost ~]#
1.2.7 保存配置文件
[root@localhost ~]# mdadm --detail --scan >> /etc/mdadm.conf
2 逻辑卷管理
2.1 什么是LVM
2.1.1 LVM的简介
LVM的全称是Logical Volume Manager,中文翻译是逻辑卷管理器。它是Linux下对磁盘分区的一种管理方式。它将几个物分区或磁盘通过软件组合成一块大磁盘(VG),让后将这块大磁盘划分为可使用的分区(LV),最后将这些分区挂载、使用。
2.1.2 LVM中的术语
2.1.2.1 物理卷(Physical Volume,PV)
指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
2.1.2.2 卷组(Volume Group,VG)
类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
2.1.2.3 逻辑卷(Logical Volume,LV)
类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
2.2 LVM的实现
2.2.1 创建分区并更改文件系统
[root@localhost ~]# fdisk -l /dev/sd[a,b]
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 4196351 4194304 2G 83 Linux
/dev/sda2 4196352 10485759 6289408 3G 8e Linux LVM
Disk identifier: 0xf5bba6f7
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 83 Linux
/dev/sdb2 4196352 10485759 6289408 3G 8e Linux LVM
[root@localhost ~]#
2.2.2 将分区改为物理卷
将分区转变为物理卷
[root@localhost ~]# pvcreate /dev/sd{a,b}{1,2}
Physical volume "/dev/sda1" successfully created.
Physical volume "/dev/sda2" successfully created.
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]#
查找系统中具有的PV磁盘
[root@localhost ~]# pvscan
PV /dev/nvme0n1p2 VG rl lvm2 [<19.00 GiB / 0 free]
PV /dev/sda1 lvm2 [2.00 GiB]
PV /dev/sda2 lvm2 [<3.00 GiB]
PV /dev/sdb1 lvm2 [2.00 GiB]
PV /dev/sdb2 lvm2 [<3.00 GiB]
PV /dev/sdc lvm2 [5.00 GiB]
Total: 6 [33.99 GiB] / in use: 1 [<19.00 GiB] / in no VG: 5 [<15.00 GiB]
[root@localhost ~]#
将PV属性删除
[root@localhost ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
[root@localhost ~]#
2.3 创建卷组
创建VG
#创建一个名为vg1的卷组
[root@localhost ~]# vgcreate vg1 /dev/sda{1,2} /dev/sdb1
Volume group "vg1" successfully created
[root@localhost ~]#
查找系统中的VG
[root@localhost ~]# vgscan
Found volume group "rl" using metadata type lvm2
Found volume group "vg1" using metadata type lvm2
[root@localhost ~]#
在VG中增加PV
[root@localhost ~]# vgextend vg1 /dev/sdb2
Volume group "vg1" successfully extended
[root@localhost ~]#
在VG中删除PV
[root@localhost ~]# vgextend vg1 /dev/sdc
Volume group "vg1" successfully extended
[root@localhost ~]# vgreduce vg1 /dev/sdc
Removed "/dev/sdc" from volume group "vg1"
[root@localhost ~]#
删除VG
[root@localhost ~]# vgremove vg1
Volume group "vg1" successfully removed
[root@localhost ~]#
2.2.3 建立逻辑卷
建立LV
#在vg1中创建一个大小为3G,名为lv1的逻辑卷
[root@localhost ~]# lvcreate -L 3G -n lv1 vg1
Logical volume "lv1" created.
[root@localhost ~]#
#将vg1中剩余的空间全部用来创建一个名为lv2的逻辑卷
[root@localhost ~]# lvcreate -l 100%VG -n lv2 vg1
Reducing 100%VG to remaining free space 6.98 GiB in VG.
Logical volume "lv2" created.
[root@localhost ~]# lvscan
ACTIVE '/dev/vg1/lv1' [3.00 GiB] inherit
ACTIVE '/dev/vg1/lv2' [6.98 GiB] inherit
Found volume group "vg1" using metadata type lvm2
[root@localhost ~]# vgdisplay vg1
--- Volume group ---
......略......
VG Size 9.98 GiB
PE Size 4.00 MiB
Total PE 2556
Alloc PE / Size 2556 / 9.98 GiB
Free PE / Size 0 / 0
VG UUID SyogVT-qaL1-vP3B-QxHP-ypv2-kUzS-i4SzaQ
[root@localhost ~]#
查找系统中的LV
[root@localhost ~]# lvscan
ACTIVE '/dev/rl/swap' [2.00 GiB] inherit
ACTIVE '/dev/rl/root' [<17.00 GiB] inherit
ACTIVE '/dev/vg1/lv1' [3.00 GiB] inherit
ACTIVE '/dev/vg1/lv2' [6.98 GiB] inherit
[root@localhost ~]#
删除LV
[root@localhost ~]# lvremove /dev/vg1/lv{1,2}
Do you really want to remove active logical volume vg1/lv1? [y/n]: y
Logical volume "lv1" successfully removed.
Do you really want to remove active logical volume vg1/lv2? [y/n]: y
Logical volume "lv2" successfully removed.
[root@localhost ~]#
3 程序包管理器
3.1 软件包
3.1.1 软件包介绍
开源软件最初只提供了打包的源码文件,GNU/Linux用户必须自己编译每个想在系统上运行的软件。因此用户需要一种更加便利的方式来管理这些软件。当Debian诞生时,这样的一个管理工具——dpkg——也就应运而生,可以用来管理扩展名为deb的“包”文件。至此著名的“Package”概念第一次出现在GNU/Linux中,稍后RedHat公司才开发自己的rpm包管理系统。
3.1.2 软件包中文件的分类
软件包中的文件主要分为以下四类:
- 二进制文件
- 库文件
- 配置文件
- 帮助文件
3.2 Red Hat系
3.2.1 rpm
Usage: rpm [OPTION...] [Package]
Options:
-i 安装指定套件
-v 显示执行过程
-h 显示安装进度
-q 查找包文件
-a 查询所有套件
#安装httpd-2.4.37
[root@localhost ~]# rpm -ivh /media/AppStream/Packages/h/httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
#查询是否安装vim
[root@localhost ~]# rpm -qa | grep vim
vim-common-8.0.1763-16.el8_5.13.x86_64
vim-minimal-8.0.1763-16.el8_5.13.x86_64
vim-enhanced-8.0.1763-16.el8_5.13.x86_64
vim-filesystem-8.0.1763-16.el8_5.13.noarch
[root@localhost ~]#
#查询包的详细信息
rpm -qpi 查看未安装的包的详细信息
rpm -qi 查看安装的包的详细信息(新版的系统也能用于查询未安装的包)
#rpm包升级
rpm -Uvh <package_file> 安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
rpm -Fvh <package_file> 安装有旧版程序包,则“升级”,如果不存在旧版程序包,则不执行升级操作
3.2.2 yum
语法: yum [options] [COMMAND] [package ...]
常用选项:
yum clean all 清除缓存目录下的软件包及旧的headers
yum makecache 生成索引缓存
yum update 更新所有软件
yum list 列出所有可安装的软件
yum install <package> 安装指定的软件,若仓库中有多个相同的软件包,默认安装最新版
yum remove <package> 删除软件包
yum serch <keyword> 查找软件包
yum whatprovides 查找命令在那个安装包中
yum repolist 查看当前配置的YUM仓库
3.2.3 dnf
dnf是在CentOS8之后出现的用于替代yum的包管理工具,不过dnf保留了和yum的兼容性,配置也是通用的。
#很明显,yum和dnf的语法和参数是一样的,故此不再赘述
[root@localhost ~]# ll `which yum`
lrwxrwxrwx. 1 root root 5 May 10 2022 /usr/bin/yum -> dnf-3
[root@localhost ~]#
3.3 Debian系
3.3.1 dpkg
Usage: dpkg [options] [action] [package_name ...]
Options:
-i 安装软件包
-r 删除包,但不删除配置文件
-P 删除包,且删除被指文件
-l 列出所有已安装的包
-s 查看详细信息
-L 查看软件包安装的文件
-S 查找文件来自于那个包
3.3.2 apt
Usage: apt [options] [command] [package ...]
常用选项:
sudo apt update 列出所有可更新的软件清单
sudo apt install <package_name> 安装指定的包
sudo apt remove <package_name> 删除软件包
sudo apt search <ketword> 查找软件包
apt list --installed 列出所有已安装的包
3.4 配置私有YUM仓库
3.4.1 Server端配置
注:若使用本地源配置跳至第三步
第一步 配置server的yum仓库(此处使用上海交大镜像源)
[root@linux1 ~]# cd /etc/yum.repos.d/
[root@linux1 yum.repos.d]# mkdir bak
[root@linux1 yum.repos.d]# mv * bak
mv: cannot move 'bak' to a subdirectory of itself, 'bak/bak'
[root@linux1 yum.repos.d]# vim download.repo
[root@linux1 yum.repos.d]# cat download.repo
[AppStream]
name=Rocky Linux $releasever - AppStream
baseurl=https://mirror.sjtu.edu.cn/rocky/8/AppStream/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[BaseOS]
name=Rocky Linux $releasever - BaseOS
baseurl=https://mirror.sjtu.edu.cn/rocky/8/BaseOS/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[extras]
name=Rocky Linux $releasever - extras
baseurl=https://mirror.sjtu.edu.cn/rocky/8/extras/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[root@linux1 yum.repos.d]#
第二步 创建YUM源的存放目录
mkdir -p /var/www/html/Rocky/8
第三步
若使用的是本地源则直接复制
mount /dev/sr0 /media/Rocky
cp -r /media/Rocky/AppStream/ /var/www/html/Rocky/8
cp -r /media/Rocky/BaseOS/ /var/www/html/Rocky/8
若使用的不是本地源则将包下载到本地
dnf reposync --repoid=AppStream --download-metadata -p /var/www/html/Rocky/8
dnf reposync --repoid=BaseOS --download-metadata -p /var/www/html/Rocky/8
dnf reposync --repoid=extras --download-metadata -p /var/www/html/Rocky/8
第四步 配置http
#安装httpd
[root@linux1 yum.repos.d]# yum -y instsall httpd
#设置开机自启动
[root@linux1 yum.repos.d]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@linux1 yum.repos.d]#
#关闭selinux、防火墙放行http服务
[root@linux1 yum.repos.d]# setenforce 0
[root@linux1 yum.repos.d]# firewall-cmd --add-service=http
success
[root@linux1 yum.repos.d]# firewall-cmd --add-service=http --permanent
success
[root@linux1 yum.repos.d]# firewall-cmd --reload
success
[root@linux1 yum.repos.d]#
3.4.2 Client端配置
配置yum仓库
[root@linux2 yum.repos.d]# cd
[root@linux2 ~]# cd /etc/yum.repos.d/
[root@linux2 yum.repos.d]# mkdir bak
[root@linux2 yum.repos.d]# mv * bak
mv: cannot move 'bak' to a subdirectory of itself, 'bak/bak'
[root@linux2 yum.repos.d]# vim private.repo
[root@linux2 yum.repos.d]# cat private.repo
[AppStream]
name=Rocky Linux $releasever - AppStream
baseurl=http://192.168.2.100/Rocky/8/AppStream/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[BaseOS]
name=Rocky Linux $releasever - BaseOS
baseurl=http://192.168.2.100/Rocky/8/BaseOS/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[extras]
name=Rocky Linux $releasever - extras
baseurl=http://192.168.2.100/Rocky/8/Extras/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[root@linux2 yum.repos.d]#
测试
[root@linux2 yum.repos.d]# ls
bak private.repo
[root@linux2 yum.repos.d]# yum clean all
25 files removed
[root@linux2 yum.repos.d]# yum makecache
Rocky Linux 8 - AppStream 65 MB/s | 8.4 MB 00:00
Rocky Linux 8 - BaseOS 74 MB/s | 2.6 MB 00:00
Rocky Linux 8 - extras 1.1 MB/s | 14 kB 00:00
Metadata cache created.
[root@linux2 yum.repos.d]#
3.5 写一个一键安装脚本用于安装httpd
要求如下:
- 基于位置变量传递版本号
- 基于独立函数进行初始化步骤,禁用防火墙,安装开发依赖包
- 基于独立函数进行下载包,解压包
- 基于独立函数进行编译,安装包
- 基于独立函数完成链接包
- 启动服务,并输出自定义的语句,安装xxx服务
脚本如下:
#!/bin/bash
#输入要下载的httpd的版本
read -p "Enter the version of httpd you want to install (default is 2.4.58):" HTTP_VERSION
if [ ! -n "${VERSION}" ]; then
HTTP_VERSION=2.4.58
FILE_NAME=httpd-2.4.58.tar.gz
else
FILE_NAME=httpd-${HTTP_VERSION}.tar.gz
fi
#判断系统
. /etc/os-release
if [[ $ID =~ rhel|rocky|centos ]]; then
systemctl stop firewalld
echo "Start installing development dependency packages..."
yum -y install wget gcc make apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config && echo "The development dependency package is installed!" || { echo "fail to install!"; exit; }
elif [ $ID == ubuntu ]; then
apt update
echo "Start installing development dependency packages..."
apt -y install wget gcc make libapr1-dev libaprutil1-dev libpcre3-dev libssl-dev && echo "The development dependency package is installed!" || { echo "fail to install!"; exit; }
else
echo "The operating system is not supported!" && exit
fi
#下载和解压tar
if [ ! -f ${FILE_NAME} ]; then
echo "Start downloading and unzipping httpd..."
wget https://archive.apache.org/dist/httpd/${FILE_NAME} || { echo "fail to download!"; exit; }
fi
tar -xzf ${FILE_NAME} -C /usr/local/src
echo "Decompression complete!"
#安装httpd
echo "Start compiling and installing httpd..."
cd /usr/local/src/httpd-${HTTP_VERSION}
./configure --prefix=/apps/httpd --enable-ssl --disable-status
make
make install
if [ ! -L /usr/local/bin/apachectl ]; then
ln -s /apps/httpd/bin/apachectl /usr/local/bin
fi
apachectl start && echo "The installation was successful!" || echo "Gou fu gui wu xiang wang!!!"
4 计算机网络-基础
4.1 OSI参考模型
4.1.1 什么是OSI模型
OSI模型(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是国际标准化组织ISO在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架,即OSI开放系统互连参考模型。
4.1.2 层次划分的好处
- 各层之间相互独立,每一层都有独自的功能
- 灵活性好,各层内部操作不会影响到其他层
- 结构上可分割
- 易于实现和维护
- 便于模块化开发
4.1.3 层次结构及功能
OSI参考模型由下至上以此为:
- 物理层:在设备之间传输比特流,规定了电平、速度和电缆针脚等物理特性
- 数据链路层:将比特组合成帧,使用使用MAC地址来访问介质,并进行差错检测
- 网络层:定义了逻辑地址(IP地址),提供路由选路功能,负责将数据从源网络传输到目的网络
- 传输层:提供面向连接或非面向连接的数据传输以及进行重传前的差错检测
- 会话层:负责建立、管理、维护和终止表示层之间的会话
- 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别
- 应用层:OSI模型中的最高层,建立用户与数据之间的连接,为应用程序提供网络服务
4.2 TCP/IP参考模型
4.2.1 TCP/IP常见协议
TCP/IP协议定义了一系列的标准协议
应用层 | Telnet | FTP | TFTP | SNMP |
HTTP | SMTP | DNS | DHCP | |
传输层 | TCP | UDP | ||
网络层 | ICMP | IGMP | ||
IP | ||||
数据链路层 | PPPoE | |||
Ethernet | PPP | |||
物理层 | …… |
4.2.2 与OSI模型的对应关系
TCP/IP协议在一定的程度上参考了OSI七层模型,将其简化为四层,即应用程、传输层、网络层和链路层。我们平时说的五层模型是将链路层在划分回了数据链路层和物理层。
4.2.3 TCP和UDP协议
4.2.3.1 TCP和UDP的报文格式
TCP报文头部:
-
Source Port:源端口,标识那个应用程序发送。长度为16比特
-
Destination Port:目的端口,标识由哪个应用程序接收。长度为16比特
-
Sequence Number:序号字段。TCP链接中传输的数据流每个字节都编上一个序号。序号字段的值指的是本报文段所发送数据的第一个字节的序号。长度为32比特
-
Acknowledgment Number:确认序号,是期望收到对方下一个报文字段的第1个字节的序号,即上次已成功接收到的数据段的最后一个字节数据的序号加1。只有Ack标识为1,此字段有效.长度为32比特
-
Header Length:头部长度,指出TCP报文头部长度,以32比特(4字节)为计算单位。若无选项内容,则该字段为5,即头部为20字节
-
Reserved:保留,必填0。长度为6比特
-
Control bits:控制位,包括FIN、ACK、SYN等标志位,代表不同状态下的TCP数据段
-
Window:窗口TCP的流量控制,这个值表明当前接收端可接受的最大的数据总数(以字节为单位)。窗口最大为65535字节。长度为16比特
-
Checksum:校验字段,是一个强制性的字段,由发端计算和存储,并由收端进行验证。在计算检验和时,要包括TCP头部和TCP数据,同时在TCP报文的前面加上12字节的伪头部。长度为16比特
-
Urgent:紧急指针,指出本报文段中紧急数据有多少个字节,长度为16比特
-
Options:可选字段,长度为0-40字节
UDP报文头部:
- Source Port:源端口,标识由哪个应用程序发送。长度为16比特
- Destination Port:目的端口,标识由哪个应用程序接收。长度为16比特
- Length:指定了UDP报头和数据的总长度。可能的最小长度是8字节。长度为16比特
- Checksum:校验字段,覆盖UDP头部和UDP数据的校验和。长度为16比特
4.2.3.2 TCP的三次握手
TCP建立连接分为三步
- 客户端发送一个SYN,序列号(Seq)为a,确认序列号(Ack)为0。a和后面的b都是由设备生成的一个随机的数字。
- 服务端在收到客户端的SYN后,回复一个SYN,序列号为b,确认序列号为a+1,表示确认收到SYN。
- 客户端在收到服务端回复的SYN后,在发送一个序列号为a+1,确认序列号为b+1的SYN,表示确认收到服务端的SYN。在服务端收到该SYN后,双方成功建立连接。
之后的数据中,双方的序列号和确认序列号成等差数列递增。
4.2.3.3 TCP的四次挥手
当双方的数据传输完毕后,双方通过以下四步断开连接:
- 客户端发送一个FIN标记的包,告知数据发送已经结束,其中包含Seq为x
- 服务端收到后将回复一个ACK标记的包,Ack为x+1,告知服务端还没准备好断开连接
- 服务端准备好断开连接时也发送一个FIN标记的包,包含Seq为y
- 客户端收到后也回复一个ACK标记的包,Ack为y+1。服务器在收到后关闭连接,客户端则在等待固定时间没有收到来自服务器的ACK包后断开连接
4.3 IP地址
4.3.1 IP地址的构成
IP地址是一个32位的二进制数,通常以8为为一组,以点分十进制的形式出现在我们的视野中。
一个IP地址有一下三部分组成
- 网络号:用来标识一个网络
- 主机号:用来表示网络内不同的主机
- 子网掩码:区分一个IP地址中的网络号和主机号
4.3.2 IP地址的划分
为了方便管理和组网,IP地址被分为了A、B、C、D、E这五类,其二进制的起首分别是0、10、110、1110、1111,同过查看IP地址的前几位就可以轻松的判断这是哪类IP。
在ABCDE这五类IP中,ABC三类是单播地址,只有这三类地址才会分配给主机使用(部分特殊地址除外),此外的D类为组播IP,E类专门用于特殊的实验目的。
ABC三类IP的区分如下:
- A类IP网络号为8比特,子网掩码为255.0.0.0,地址范围为0.0.0.0~127.255.255.255
- B类IP网络号为16比特,子网掩码为255.255.0.0,地址范围为128.0.0.0~192.255.255.255
- C类IP网络号为24比特,子网掩码为255.255.255.0,地址范围为192.0.0.0~223.255.255.255
为了解决地址池枯竭的问题,私有地址和公有地址的概念被提出,在ABC三类IP中各有各一网段被划分为私网地址,分别是10.0.0.0~10.255.255.255,172.16.0.0~172.16.31.255,192.168.0.0~192.168.255.255
4.3.3 子网划分
根据有类IP划分的子网大小固定,ip的利用率不高,因此诞生了VLSM(Variable Length Subnet Mask),可变长子网划分的概念,通过加长子网掩码来获得更合适的子网。
具体方法建议去看大佬的讲解
4.3.4 小练习
4.3.4.1 练习1
题目:
201.222.200.111/18计算主机数?子网掩码?说明计算方法。
解答:
主机数=2^(32-子网掩码位数)-2=2^14-2=16382
子网掩码=11111111.11111111.11000000.00000000=255.255.192
4.3.4.2 练习2
题目:
当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
解答:
要判断它们是否在同一个网络段,需要比较它们的网络地址部分。
A 的IP地址是 10.0.1.1/16,网络地址为 10.0.0.0。
B 的IP地址是 10.0.2.2/24,网络地址为 10.0.2.0。
由于A和B的网络地址不同,它们并不在同一个网络段。在这种情况下,A 和 B 无法直接通信,需要经过路由才能实现通信
4.3.4.3 练习3
题目:
如何将10.0.0.0/8划分32个子网?求每个子网的掩码,主机数。
解答:
∵ 32=2^5
∴ 子网掩码为11111111.11111000.00000000.00000000
子网掩码:255.248.0.0
主机数:2^(3*8-5)-2=524286台
5 Linux网络配置
5.1 调整动态端口范围为20000-60000
#查看当前系统配置的动态端口范围
[root@localhost ~]# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
[root@localhost ~]#
#临时调整
[root@localhost ~]# sudo sysctl -w net.ipv4.ip_local_port_range="20000 60000"
net.ipv4.ip_local_port_range = 20000 60000
[root@localhost ~]#
#永久调整
[root@localhost ~]# echo "net.ipv4.ip_local_port_range = 20000 60000" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_local_port_range = 20000 60000
[root@localhost ~]#
5.2 通过网络配置命令,让主机可以上网
[root@localhost ~]# nmcli connection modify ens224 ipv4.addresses 192.168.2.234/24 ipv4.gateway 192.168.2.1 ipv4.dns 192.168.2.1 ipv4.method manual autoconnect yes
[root@localhost ~]# nmcli connection reload && nmcli device connect ens224
Device 'ens224' successfully activated with 'd32628d4-8a20-3001-b3ea-54c959cafea4'.
[root@localhost ~]#
5.3 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式
TYPE=Ethernet #接口类型
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none #获取IP的方法,none和static均为静态(在部分系统中有区别),dhcp为动态获取ip
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens224
UUID=d32628d4-8a20-3001-b3ea-54c959cafea4 #网络接口的唯一标识符
DEVICE=ens224 #网络设备名
ONBOOT=yes #系统启动时是否激活该接口
AUTOCONNECT_PRIORITY=-999
IPADDR=192.168.2.234 #IP地址
PREFIX=24 #子网掩码,也可以是NETMASK
GATEWAY=192.168.2.1 #网关
DNS1=192.168.2.1 #DNS1和DNS2用于指定解析域名的都武器的IP
5.4 基于配置文件或命令完成bond0配置
#创建一个名为bond0的bond0接口,模式为active-backup
[root@localhost ~]# nmcli connection add con-name bond0 type bond ifname bond0 mode active-backup
Connection 'bond0' (74398784-e4aa-4193-9f7d-e674f260e3e3) successfully added.
[root@localhost ~]#
#配置其接口IP
[root@localhost ~]# nmcli con mod bond0 ipv4.addresses 192.168.64.100/24 ipv4.gateway 192.168.64.2 ipv4.dns "114.114.114.114,8.8.8.8" ipv4.method manual autoconnect yes
[root@localhost ~]#
#将网卡eth161和eth256绑定为bond0的从属接口
[root@localhost ~]# nmcli con add type ethernet con-name bond0-slave1 ifname ens161 master bond0
Connection 'bond0-slave1' (6d2b3897-41d4-4022-8ea8-0251f9141889) successfully added.
[root@localhost ~]# nmcli con add type ethernet con-name bond0-slave2 ifname ens256 master bond0
Connection 'bond0-slave2' (6551a922-b184-454b-b831-84efe9fccf5b) successfully added.
[root@localhost ~]#
#开启bond及其从属接口
[root@localhost ~]# nmcli con up bond0
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/18)
[root@localhost ~]# nmcli con up bond0-slave1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/19)
[root@localhost ~]# nmcli con up bond0-slave2
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/20)
[root@localhost ~]#
#查看绑定状态
[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: ens161
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0
Slave Interface: ens161
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:9a:82:4c
Slave queue ID: 0
Slave Interface: ens256
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:9a:82:42
Slave queue ID: 0
[root@localhost ~]#
5.5 通过ifconfig命令结果找到ip地址
[root@localhost ~]# ifconfig | sed -n "/netmask/p"| sed "s/^[ \t]*//" | tr -s " " | cut -d" " -f2 | grep -v "127.0.0.1"
192.168.2.234
[root@localhost ~]#
5.6 使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。
#!/bin/bash
NETWORK="192.168.2."
for i in {1..254}
do
IP=${NETWORK}${i}
ping -c 2 $IP &> /dev/null
if [ $? -eq 0 ]; then
echo "${IP} is online."
fi
done