1. 总结raid 0, 1, 5, 10, 01的工作原理。总结各自的利用率,冗余性,性能,至少几个硬盘实现。
raid 0 是将多块硬盘串联在一起当做一块大硬盘使用,数据依次存储到每个硬盘中,存储容量是所有硬盘容量的总和。读写能力成倍提升,没有冗余能力和容错能力,空间利用率100%,至少需要两块硬盘。如果其中任何一块损坏则整个数据都会破坏。
raid 1 也称镜像卷,最少使用两块硬盘或2的倍数的硬盘数量。保存数据时,数据完整的保存在一块硬盘上,在另一块硬盘上生成镜像文件即以复制备份的形式保存在另一块硬盘上。存储容量是两块盘总容量的一半,利用率为50%,读性能有所提升,但写性能下降,有冗余能力,其中一块盘损坏不影响文件的完整性。
raid 5 最少使用3块硬盘,类似于raid 4,不同之处在于,raid 4是其中一块固定的硬盘用来保存校验位,而raid 5是保存在每个磁盘上,每块硬盘既有数据也有校验位。raid 5读写性能都有所提升,可用磁盘空间为磁盘总数-1,允许最多一块硬盘损坏。
raid 10不是独立的级别,是由raid 0和raid 1两个级别组合而成,需要最少4块硬盘。先将两块硬盘组成raid 1,再把两个raid 1组成raid 0。raid 10读写性能都有所提升,可用磁盘空间为总磁盘数的一半,每组镜像最多允许坏一块硬盘,即不同镜像中共允许坏2块硬盘。
raid 01类似于raid 10,需要最少4块硬盘,先将两块硬盘组成raid 0,再把两个raid 0组成raid 1。
raid 10和raid 01在数据安全上raid 10要更可靠一些,而且在磁盘发生故障后,raid 10的读取速度要高于raid 01,因为raid 01底层是raid 0,一旦坏一块硬盘则与其同一组的另一块磁盘也将无法读取数据,而raid 10 底层是raid 1,一组内坏一块另一块依然可以使用,所以更推荐使用 raid 10。
2. 完成对LVM磁盘扩容及缩容示例。
扩展LV时,分两种情况:
情况一,当VG有足够空间时可直接扩展LV
例:扩展LV并重置文件系统大小 lvextend -r -l +100%free /dev/testvg/log_lv
情况二,当VG没有足够空间,需要先扩展VG,再扩展LV。
例:(1)添加硬盘 /dev/sdc并创建PV
pvcreate /dev/sdc
(2)扩展VG
vgextend testvg /dev/sdc
(3)扩展LV并重置文件系统大小
lvextend -r -L +5G /dev/testvg/log_lv
缩容
例:(1)卸载
umont /log
(2)检测文件系统
fsck -f /dev/testvg/log_lv
(3)缩减文件系统(只支持ext4,不支持xfs)
resize2fs /dev/testvg/log_lv 10G
(4)缩减LV
lvreduce -L 10G /dev/testvg/log_lv(会提示有风险,输入y确定后才能完成)
(5)重新挂载
mount -a
df -h
3. 总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取? yum/dnf/apt总结程序包获取途径,以及rpm, yum, apt命令选项示例。
主流的程序包管理器
redhat:rpm文件, rpm 包管理器 debian:deb文件, dpkg 包管理器
包文件组成
(1)包内的文件 (2)元数据,如:包的名称,版本,依赖性,描述等 (3)可能会有包安装或卸载时运行的脚本
程序包获取途径
(1)系统发行的光盘或官网 (2)第三方组织提供 (3)软件项目官方站点 (4)搜索引擎
(5)自己制作,将源码文件,利用工具如rpmbuild,fpm等工具制作成rpm包文件
rpm 常用命令选项:
-i 安装软件 -V 验证模式 -v 显示附加信息 -U 安装或升级 -F 升级软件 -e 卸载 -q 查询模式
-h 以###显示程序包管理执行进度
适用于查询模式(-q)的常用子选项
-a:列出所有通过rpm或yum安装在本机的软件名称 -f:查看该文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的软件包文件做查询操作 -c:列出已安装在本机的指定软件的配置文件
-d:列出已安装在本机的指定软件包含的文档 -i:列出已安装在本机的指定软件的详细信息
-l:列出指定的程序包安装后生成的所有文件
yum常用命令选项
-h 帮助 -y 当安装过程提示选择全部为yes -q 不显示安装过程
yum install 安装软件 yum info 查看包信息 yum remove 卸载包
yum history 查看yum包管理历史 yum list 查看包列表
yum provides | whatprovides feature1 [feature2] 查看指定的特性(可以是某文件)是由哪个程序包所提供,文件要写全路径,而不只是文件名,否则可能无法查询到
apt常用命令选项
apt install 安装软件包 apt remove 移除软件包 apt purge 移除软件包及配置文件
apt update 刷新存储库索引 apt upgrade 升级所有可升级的软件包
apt search 搜索应用程序 apt show 显示安装细节
apt depends 查询软件依赖那些包 apt rdepends 查询软件被那些包所依赖
4. 简要总结yum/dnf工作原理。并搭建私有yum仓库(base, epel源)给另一个虚拟机使用。
工作原理:yum/dnf是基于C/S模式,yum服务器存放rpm包和相关包的元数据库,yum客户端访问yum服务器进行查询或安装等。
实现过程:现在yum服务器上创建yum repository,在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。
#搭建仓库内部服务器
yum install httpd -y —— systemctl enable --now httpd ——
mkdir -p /var/www/html/rockylinux/8/{BaseOS,AppStream} —— ls /misc/cd ——
cp -r /misc/cd/AppStream/ var/www/html/rockylinux/8/ ——
cp -r /misc/cd/BaseOS/ var/www/html/rockylinux/8/
#yum客户端配置
vim test.repo
[BaseOS]
name=BaseOS
baseurl=file:///var/www/html/rockylinux/8/BaseOS
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///var/www/html/rockylinux/8/AppStream
gpgcheck=0
#从阿里云上下载extras源和epel源
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/rockylinux/8/extras/x86_64/os/
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
gpgcheck=0
yum clean all 更新缓存
yum reposync --repoid=extras --download-metadata -p /var/www/html/rockylinux/8/
yum reposync --repoid=epel --download-metadata -p /var/www/html/rockylinux/8/
#在另一台虚拟机上搭建仓库供公司内部使用
vim test.repo
[BaseOS]
name=BaseOS
baseurl=http://10.0.0.150/rockylinux/8/BaseOS/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=http://10.0.0.150/rockylinux/8/AppStream/
gpgcheck=0
[extras]
name=extras
baseurl=http://10.0.0.150/rockylinux/8/extras/
gpgcheck=0
[epel]
name=epel
baseurl=http://10.0.0.150/rockylinux/8/epel/
gpgcheck=0
5. 总结系统安装之后的常用初始化步骤。rocky/ubuntu
最小化安装——关闭防火墙和SELINUX——配置YUM源——安装常用软件——快照
6. 解读一键安装httpd脚本,并自行实现一个一键安装脚本,要求
1)基于位置变量传递版本号
2)基于独立函数进行初始化步骤,禁用防火墙,安装开发依赖包。
3)基于独立函数进行下载包,解压包。
4)基于独立函数进行编译,安装包。
5)基于独立函数完成链接包。
6)启动服务,并输出自定义的语句,安装xxx服务
CPUS=`grep -c processor /proc/cpuinfo`
HTTPD_VERSION=2.4.59
HTTPD_FILE=http-${HTTPD_VERSION}.tar.gz
INSTALL_DIR=/apps/httpd
./etc/os-release
if [[ $ID =~ rhel|rocky|centos ]];then
systemctl disable --now firewalld
yum -y install gcc make apr-devel apr-util-devel openssl=devel pcre-devel reahat-rpm-config bzip2 wget
elif [ $ID = 'ubuntu' ];then
apt update
apt -y install gcc make libapr1-dev libaprutil1-dev libpcre3-dev libssl-dev
fi
if [ ! -f ${HTTPD_FILE} ];then
wget https://dlcdn.apache.org/httpd/${HTTPD_FILE} || { echo "下载失败!" ; exit 20; }
fi
tar xf ${HTTPD_FILE} -C /usr/local/src
cd /usr/local/src/httpd-${HTTPD_VERSION}
./configue --prefix={INSTALL_DIR} --enable-ssl --disable-status
make -j $CPUS && make install
ln -s /apps/https/bin/apachectl /usr/local/bin
apachectl start && echo "安装成功!"
7. 总结开放系统互联OSI模型,每层作用及对应的协议。
应用层 常见的一些服务应用程序产生或接收到的数据都是在应用层。
表示层 为应用层产生的数据提供数据转换类的服务,如编码、格式转换,数据压缩、加密与解密等。
会话层 负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。
传输层 管理两个节点之间的数据传输,确保数据被可靠地传输到目标地址。在传输层有两种协议,UDP和TCP协议。
网络层 决定数据的路径选择和转寄,将网络表头加至数据包(加上源IP和目标IP地址),以形成报文。因为数据包有了目标IP地址,根据路由规则,可知道将这个数据包怎么传递出去以及怎么找到目标主机。另一方面,数据包中还有源IP地址,使得对方主机回应的时候,可以将对方产生的数据根据这个源IP地址路由回来,使得自己能够收到对方的响应数据。
数据链路层 互连设备之间传送和识别数据帧,负责网络寻址、错误侦测和改错。
物理层 负责管理电脑通信设备和网络媒体之间的互通。在物理层,网卡会将数字信号转变成电信号传递给网线(或其它数据传输介质),物理层处理后得到的数据是二进制数据。
8. 调整动态端口范围为20000-60000
#cat /proc/sys/net/ipv4/ip_local_port_range
#echo 20000 60000 > /proc/sys/net/ipv4/ip_local_port_range
#cat /proc/sys/net/ipv4/ip_local_port_range
9. 总结TCP包头结构,TCP三次握手,4次挥手。
(1)TCP包头结构
TCP协议首部前20个字节是固定的一些字段,20字节之后有一段可选字段,长度可变。
1,前4个字节是源端口字段和目标端口字段,每个字段2字节。源端口和目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536。
2,序号占用4字节,表示本报文段所发送数据的第一个字节的编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始。
3,确认号占用4字节,它是等待发送方发送下个数据包的起始字节。
4,数据偏移表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。由于数据偏移最大是4比特位,它能描述的范围是0-15,所以最大值是60字节,去掉固定的20字节,也就说明可选字段的长度最多只能是40字节。
5,保留字段,目前还未定义功能的字段,占用6个比特位。
6,URG位,占用1个比特位,其值为0或1,当为1时表示这是紧急数据,需要尽快发送,而不是按原来的编号顺序传输。
7,ACK位,占用1个比特位,其值为0或1,当为1时才表明前面的ack确认号字段是有效的,当ACK=0时,确认号字段无效。TCP要求当连接建立完成之后,ACK字段总是设置为1.
8,PSH位,占用1个比特位,其值为0或1。当为1时则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。
9,RST位,占用1个比特位,其值为0或1。当为1时表明需要重新建立TCP连接,所以这会导致先释放连接。这可能是因为连接出线了差错,或者其它原因。
10,SYN位,占用1个比特位,其值为0或1。在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文,此时结合ACK即可判断是请求还是响应。
11,FIN位,占用1个比特位,其值为0或1。当为1时表明请求释放TCP连接。
12,窗口,2字节,表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据。这个字段的意义是为了保证接收速度较慢时,让发送速度也缓下来,否则接收方的Recv Buffer存放不下。接收方可能随时会动态调整窗口值,从而让发送方也能动态按需发送一定量的数据。
13,校验和,2字节。该字段会对TCP首部和TCP数据部分都做校验。
14,紧急指针,2字节,只有在URG=1时才有意义,该字段指出紧急数据的字节数。
15,可选字段,这部分是固定20字节之后的,长度可变。
根据网络层IP数据包最大长度是1500字节,IP首部固定部分20字节,TCP首部固定20字节,剩下的就是TCP数据部分,最大是1460字节。
(2)TCP三次握手:首先是服务端B的服务进程已经监听在某个端口上,监听之后等待客户端A建立TCP连接。
1,当A想要和B建立TCP连接时,首先会发生一个连接请求报文给B。在这个请求报文中,SYN=1,ACK=0,seq=x。当A发送完SYN包后,它将进入SYN_SENT状态。
2,当B收到该报文后,如果B确认与A建立TCP连接,那么B需要回复A。回复时,SYN=1,ACK=1,ack(确认号)=x+1,seq=y。当B发送完ACK包后,它将进入SYN_RECV状态。
3,当A收到B回复报文后,也会向B回复一个ACK包,此时,SYN=0,ACK=1,seq=x+1,ack=y+1。A发送完之后就进入ESTABLISHED状态,B收到A的ACK包之后也将进入ESTABLISHED状态,到此TCP连接就建立完成。
(3)四次挥手:首先两端开始释放TCP连接之前,都已经处于ESTABLISHED状态,假设现在A端开始请求释放连接。
1,A首先发送一个TCP首部中FIN位置为1的包给B端,假设此时序号是u,即seq=u。发送之后A将从ESTABLISHED状态转为FIN-WAIT-1状态。
2,B收到FIN包后发一个回复给A。回复时,设置ACK=1,ack=u+1,同时设置序号seq=v,发送完之后服务端进入CLOSE-WAIT(半关闭)状态。这个阶段A到B方向的连接已经释放,A不能再发送传输数据给B,但B到A方向的连接还没有关闭,它可以发送数据给A,A也会接收。
3,当A收到B的ACK包之后,它将进入FIN-WAIT-2,等待B发起从B到A方向的连接关闭请求。
4,当B确认已经没有数据发送给A后,B开始主动关闭从B到A方向的TCP连接,这时会发送一个FIN包,同时ACK设置为1,ack保持不变等于u+1,而seq则为已知新值w,因为进入CLOSE-WAIT之后,B可能还发送了一些数据,B发送完这个FIN+ACK包之后,将进入LAST-ACK状态。
5,当A收到B的FIN+ACK包之后,需要对B发送的关闭请求做出回复,回复时,ACK=1,seq=u+1,ack=w+1。当发送完这个ACK包之后,A不会立即关闭,而是进入TIME-WAIT阶段等待一段时间(2倍的MSL时长)
6,当B收到A的回复ACK包之后,意味着B到A方向的连接关闭已经确认;当A等待了2MSL的时长之后,将真正关闭连接。
10. 总结主机到主机的包传递过程。
1,主机A想给主机B发送数据,必须知道主机B的MAC地址;
2,如果主机A的ARP表中没有主机B的MAC地址,那么主机A需要获取默认网关的MAC地址,然后通过路由器来获取主机B的MAC地址;
3,如果主机A的ARP表中没有默认网关的MAC地址,需要通过ARP来获取MAC地址;
4,主机A获取到默认网关的MAC地址之后,将数据封装成帧发送给路由器;
5,如果路由器的ARP表中没有主机B的MAC地址,路由器需要通过ARP来获取主机B的MAC地址;
6,路由器获取到主机B的MAC地址之后,将数据重新封装成帧发送给主机B;
7,主机B发送回复数据给主机A,因为所有MAC地址已知,所以不用采用ARP,而是直接发送。
11. 总结IP地址 A, B, C, D 类,并解析IP地址的组成。
A 类地址的网络位占用一个字节,B类占用两个字节,C类占用三个字节。
A类地址 网络部分 主机部分 主机部分 主机部分
B类地址 网络部分 网络部分 主机部分 主机部分
C类地址 网络部分 网络部分 网络部分 主机部分
D类地址 组播地址
A类地址的网络部分最高位是0,所以IP第一部分的格式是0xxx xxxx,
范围是0000 0000=0,0111 1111=127,即A类地址第一部分的十进制范围是0到127,实际上是1-126。
B类地址的网络部分最高位是10,范围是1000 0000=128,1011 1111=191,即B类地址的第一个字节取值位128-191。
C类地址的网络部分最高位是110,范围是1100 0000=192,1101 1111=223,即C类地址的第一个字节取值位192-223。
D类地址的第一个字节范围是224-239,被用于组播地址。
所以 1-126.x.x.x是A类地址,128-191.x.x.x是B类地址,224-239.x.x.x是C类地址,224-239.x.x.x是D类地址。
12. 201.222.200.111/18计算主机数?子网掩码?说明计算方法。
一个网段中最多的主机数量=2^主机ID位-2
主机数=2^(32-18)-2=16382
子网掩码11111111.11111111.11000000.0,11000000=2^7+2^6即192,所以子网掩码为255.255.192.0。
13. 当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
A——B
如果A与B通信,先用A的IP地址与自己的子网掩码对位与,即
10.0.1.1
255.255.0.0
00001010.00000000.00000001.00000001
11111111.11111111.00000000.00000000
00001010.00000000.00000000.00000000 即网络ID为10.0.0.0
然后用B的IP地址与A的子网掩码对位与,即
10.0.2.2
255.255.0.0 ,得到10.0.0.0=10.0.0.0
因此如果A和B通信,两者在同一个网段。
B——A
当B与A通信时,先用B的IP地址与自己的子网掩码对位与,即
10.0.2.2
255.255.255.0 得到10.0.2.0
然后用A的IP地址与B的子网掩码对位与,得到10.0.1.0≠10.0.2.0
因此如果B和A通信,两者不在同一网段。
14. 如何将10.0.0.0/8划分32个子网?求每个子网的掩码,主机数。
划分子网数=2^(网络ID向主机ID借位数)
所以32=2^5 网络ID需向主机ID借5位
10.0.0.0/8
10.00000.000.0.0 10.0.0.0/13
10.00001.000.0.0 10.8.0.0/13
.......
......
10.11111.000.0.0 10.248.0.0/13
子网掩码均为255.248.0.0 每个子网主机数=2^(32-13)-2=524286
15. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。
vim ifcfg-eth0
DEVICE=ens160
NAME=ens160
BOOTPROTO=static
IPADDR=10.0.0.150
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=180.76.76.76
DNS3=119.29.29.29
ONBOOT=yes
16. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。
DEVICE=ens160 设备名
NAME=ens160 此配置文件应用到的设备TYPE=Ethernet 设定接口类型
HWADDR= 对应设备的MAC地址
DEFROUTE=yes 设置为yes时,DHCP将设置默认路由
IPV4_FAILURE_FATAL=yes 指定如果IPV4配置失败,是否将此视为致命错误
BOOTPROTO=static 激活此设备时使用的地址配置协议
IPADDR=10.0.0.150 指明IP地址
PREFIX=24 网络ID的位数
GATEWAY=10.0.0.2 设定默认网关
DNS1=10.0.0.2 第一个DNS服务器地址
DNS2=180.76.76.76 第二个DNS服务器地址
DNS3=119.29.29.29 第三个DNS服务器地址
ONBOOT=yes 系统启动时是否激活此设备
17. 基于配置文件或命令完成bond0配置。
首先创建master角色
vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=bond
NAME=bond0
BOOTPROTO=none
IPADDR=1.1.1.1
PREFIX=24
BONDING_OPTS="mode=1 miimon=100"
配置网卡文件
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
vim /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
NAME=eth2
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
重启网络服务
nmcli connection reload ; nmcli connection up eth1 ;nmcli connection up eth2
18. 通过ifconfig命令结果找到ip地址.
输入ifconfig,在网卡下的inet后面即是ip地址。
19. 使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。
NET=10.0.0.0
for i in {1..254};do
{ ping -c1 -W1 $NET.$i &> /dev/nul && echo $NET.$i is up;let up++; } || { echo $NET.$i is down;let down++; };l
done