1. 图文并茂说明raid0,raid1, raid10, raid01, raid5等原理。
1.1 RAID
什么是RAID?
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此操作系统只会把它当做一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合,由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要打容量存储空间的工作,如:视频与音频制作。
RAID功能实现
(1)提高IO能力,磁盘并行读写
(2)提高耐用性,磁盘冗余算法来实现
1.1.1 RAID-0
以chunk=64k单位,读写数据,因为读写时都可以并行处理,所以在所有的级别中,RAID-0的速度是最快的。但是RAID-0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,素有数据都会丢失
读、写性能提升
可用空间:N*min(s1,s2......)
无容错能力
最少磁盘数:1+
1.1.2 RAID-1
也称为镜像,两组以上的N个磁盘相互镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID-0相同,另外写入速度有微小的降低。
读性能提升、写性能略有下降
可用空间:1*min(s1,s2.....)
磁盘利用率 50%
有冗余能力
最少磁盘:2+
1.1.3 RAID-5
读、写性能提升
可用空间:(N-1)*min(s1,s2...)
有容错能力:允许最多1块磁盘损坏
最少磁盘:3,3+
1.1.4 RAID-10
读、写性能提升
可用空间:N*min(s1,s2..)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数:4,4+
1.1.5 RAID-01
多块磁盘先实现RAID0,在组合成RAID1
2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16M,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录
1、以/dev/sdb1和/dev/sdb2为例
2、实现逻辑卷
需要安装lvm2包
yum -y install lvm2
3、具体操作
#创建物理卷
pvcreate /dev/sdb1 /dev/sdb2
#为卷组分配物理卷
vgcreate -s 16M testvg /dev/sdb{1,2} #指定PE大小默认4M
#从卷组创建逻辑卷 ,从卷组取出5G作为testlv
lvcreate -L 5G -n testlv testvg
#格式逻辑卷并指定文件系统
mkfs.ext4 /dev/testvg/testlv
#永久挂载testlv逻辑卷到/users
#(1)查看ID
blkid
(2)将ID复制到/etc/fstab
(3)挂载 mount -a
(4)df -h 查看
3. 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d/目录至自己的家目录。
mkdir /users
useradd archlinux -d /users/archlinux
su - archlinux
cp -a /etc/pam.d /users/archlinux/
4. 扩展testlv至7G,要求archlinux用户的文件不能丢失
扩展前的文件夹内容
扩展后
#扩展空间和扩展文件系统
lvextend -r -L +2G /dev/testvg/testlv
5. 收缩testlv至3G,要求archlinux用户的文件不能丢失
umount /users
e2fsck -f /dev/mapper/testvg_testlv
resize2fs /dev/mapper/testvg_testlv 3G
lvresize -L 3G /dev/mapper/testvg-testlv
vgreduce testvg /dev/sdc1
pvremove /dev/sdc1
mount -a
6. 对testlv创建快照,并尝试基于快照备份数据,验正快照的功能
lvcreate -s n testlv_bak -L 1G -pr /dev/mapper/testvg-testlv
7. 创建20G的RAID1,要求CHUNK为128K,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录
分区、创建、调整、查看、格式化、挂载、卸载、空间查看
1、RAID1的空闲空间为1 * min(S1,S2),两个磁盘和一个空闲盘
2、分区规划:3个分区,每个最小为20G。
3、使用用户空间中程序mdadm,调用md模块完成创建raid
4、格式化、挂载、开机实现自动挂载
1. 创建raid1
[root@localhost ~] # mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 -c 128K /dev/sdb[b-d]
2. 格式化
mke2fs -t ext4 /dev/md0
3.开机挂载至 /backup ,编辑fstab文件
UUID=7ec5f0a0-260c-4c9e-8f28-ed37b4dcc1ed /backup ext4 defaults 0 0
4.挂载
mount -a
5. 查看空间信息
df -hP
8. 创建一个可用空间为10G的RAID10设备,要求CHUNK为256K,文件系统为ext4,开机可自动挂载至/mydata目录
分区、创建、调整、查看、格式化、挂载、卸载、空间查看
1、RAID10的空闲空间为N
/2
* min(S1,S2,S3,S4),4个磁盘
2、分区规划:2个分区,每个最小为5G。
3、使用用户空间中程序mdadm,调用md模块完成创建raid
4、格式化、挂载、开机实现自动挂载
1、管理磁盘
[root@localhost ~]
# fdisk /dev/sda
t 5,6,7,8 fd
w
[root@localhost ~]
# partx -a /dev/sda
[root@localhost ~]
# partx -a /dev/sda
2、创建raid10
1)、查看已经存在的RAID设备的名字,为了避免重名
[root@localhost ~]
# cat /proc/mdstat
md0 :
2)、创建md10
[root@localhost ~]
# mdadm -C /dev/md1 -a yes -l 10 -n 4 -c 256K /dev/sda{5,6,7,8}
[root@localhost ~]
# mdadm -D /dev/md1
Raid Level : raid10
Update Time : Sat Aug 12 10:48:15 2017
State : clean, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 256K
Resync Status : 41% complete
Name : localhost.localdomain:1 (
local
to host localhost.localdomain)
UUID : ea7d9cd0:53b9d9a3:fd5a08f9:1f65eac3
Events : 6
Number Major Minor RaidDevice State
0 8 5 0 active
sync
set
-A
/dev/sda5
1 8 6 1 active
sync
set
-B
/dev/sda6
2 8 7 2 active
sync
set
-A
/dev/sda7
3 8 8 3 active
sync
set
-B
/dev/sda8
[root@localhost ~]
# cat /proc/mdstat
Personalities : [raid1] [raid10]
md1 : active raid10 sda8[3] sda7[2] sda6[1] sda5[0]
10496512 blocks super 1.2 256K chunks 2 near-copies [4
/4
] [UUUU]
[==================>..] resync = 91.7% (9631424
/10496512
)
============== 等待进度完成 ====================
3、格式化
[root@localhost ~]
# mkfs.ext4 /dev/md1
4、开机挂载至
/mydata
,编辑fstab文件
1)、查看UUID
[root@localhost ~]
# blkid /dev/md1
/dev/md1
: UUID=
"ebbc94c3-66b9-433b-967b-c84e44ef35b0"
TYPE=
"ext4"
2)、以UUID挂载
[root@localhost ~]
# vim + /etc/fstab
UUID=
"ebbc94c3-66b9-433b-967b-c84e44ef35b0"
/mydata
ext4 defaults 1 2
5、创建
/mydata
目录
[root@localhost ~]
# mkdir /mydata
6、测试挂载
[root@localhost ~]
# mount -a -v
mount
: UUID=5009dc18-28f5-4b32-8c7c-0ea1328ea224 already mounted on
/boot
mount
:
/dev/mapper/myvg-lv_home
already mounted on
/home
mount
:
/dev/mapper/myvg-lv_usr
already mounted on
/usr
mount
:
/dev/mapper/myvg-lv_var
already mounted on
/var
mount
: tmpfs already mounted on
/dev/shm
mount
: devpts already mounted on
/dev/pts
mount
: sysfs already mounted on
/sys
mount
: proc already mounted on
/proc
mount
: LABEL=
'MY222'
already mounted on
/backup
/dev/md1
on
/mydata
type
ext4 (rw)
7、查看空间信息
[root@localhost ~]
# df -lhP
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-lv_root
48G 520M 45G 2% /
tmpfs 122M 0 122M 0%
/dev/shm
/dev/sda1
477M 33M 419M 8%
/boot
/dev/mapper/myvg-lv_home
4.7G 9.9M 4.5G 1%
/home
/dev/mapper/myvg-lv_usr
15G 710M 13G 6%
/usr
/dev/mapper/myvg-lv_var
9.5G 88M 9.0G 1%
/var
/dev/md0
9.3G 23M 9.0G 1%
/backup
/dev/md1
9.8G 23M 9.3G 1%
/mydata
[root@localhost ~]
#
-l
local
只显示本地设备
-h human-readable
-P print
for
POSIX FORMAT
9. 静态配置网卡IP,centos/ubuntu实现
9.1 centos修改静态网卡
9.1.1 修改网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
9.2 修改文件内容
(静态IP地址,子网掩码,网关地址必须和虚拟网络编辑器里面的配置一样,使用的是Vmware)
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO=static #设置网卡获得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="ens33"
UUID="fd5902fd-e37b-4477-9351-7631a9f89695"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.26.6 #IP地址
NETMASK=255.255.255.0 #网络掩码
NETWORK=192.168.26.255 #网关#重启网络配置
service network restart
[root@localhost ~]# service network restart
Restarting network (via systemctl): [ OK ]
10. 图文并茂解释TCP/IP 3次握手4次断开
三次握手总结
三次握手是TCP连接的建立过程。在握手之前,主动打开连接的客户端结束CLOSE阶段,被动打开的服务器也结束CLOSE阶段,并进入LISTEN阶段。随后进入三次握手阶段:
第一次握手:首先客户端向服务器发送一个SYN包,并等待服务器确认,其中:
- 标志位为SYN,表示请求建立连接
- 序号为Seq = x(x一般取随机数)
- 随后客户端进入SYN-SENT阶段
第二次握手:服务器收到客户端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文,其中:
- 标志位为SYN和ACK,表示确认客户端的报文Seq序号有序,服务器能正常接收客户端发送的数据,并同意创建新连接;
- 序号为Seq = y;
- 确认为ACK = x + 1,表示收到客户端的序号Seq并将其值加1作为自己确认号ACK的值,随后服务器端进入SYN-RECV阶段
第三次握手:客户端接收到发送的SYN+ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段,并返回最后一段报文。其中:
- 标志位ACK,表示确认收到服务器端同意连接的信号
- 序号为seq=x+1,表示收到服务器的确认号ACK,并将其值作为自己的序号值;
- 确认号为ack=y+1,表示收到服务器端序号seq,并将其值加1作为自己的确认号ack的值
- 随后客户端进入ESTABLISHED。
当服务器端收到来自客户确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入established阶段,从而完成三次握手
四次挥手总结
四次挥手总结:
挥手请求可以是client端,也可以是server端发起的,我们假设是client端发起:
- 第一次挥手:client端发起挥手请求,想server端发送标志位是FIN报文段,设置序列号seq,此时,client端进入FIN_WAIT_1状态,这表示client端没有数据要发送给server端了
- 第二次挥手:server端收到了client端发送的FIN报文段,向client段返回一个标志位是ack的报文段,ack设为seq+1,client端进入FIN_WAIT_2状态,server端告诉client端,我确认并同意你的关闭请求
- 第三次挥手:server端向client端发送标志位是FIN的报文段,请求关闭连接,同时client端进入LAST_ACK状态
- 第四次挥手:client端收到server端发送的FIN报文段,向server端发送标志位是ack的报文段,然后client端进入TIME_WAIT状态,server端收到client端的ack报文段以后,就关闭连接。此时,client端等待2MSL的时间后依然没有收到回复,则证明server端已正常关闭,那好,client端也可以关闭连接了。
11. 网卡绑定bond0的实现
1、添加新网卡,配置如图所以都选NAT模式
2、创建bongding设备的配置文件
vim /etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.26.20
PREFIX=24
BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1"
vim /etc/sysconfig/network-scripts/ifcfg-eth0TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO=none
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=eth0
UUID="fd5902fd-e37b-4477-9351-7631a9f89695"
DEVICE=eth0
ONBOOT="yes"
MASTER=bond0
SLAVE=yesvim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO=none
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=eth1
UUID="fd5902fd-e37b-4477-9351-7631a9f89695"
DEVICE=eth1
ONBOOT="yes"
MASTER=bond0
SLAVE=yes
3、通过nmcli实现bonding
#添加bonding接口
[root@localhost network-scripts]# nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 192.168.26.20/24
Connection 'mybond0' (e052c1a0-60a1-453c-bc25-1ed8d7def1c0) successfully added.
#添加从属接口[root@localhost network-scripts]# nmcli con add type bond-slave ifname eth0 master bond0
Connection 'bond-slave-eth0' (c4d3c73b-5d6b-4c47-bec3-42e208211207) successfully added.
[root@localhost network-scripts]# nmcli con add type bond-slave ifname eth1 master bond0
Connection 'bond-slave-eth1' (782df219-6fb1-4137-b946-4ea6275f074d) successfully added.#要启动绑定,则必须首先启动从属接口,远程连接会中断
nmcli con up bond-slave-eth0
nmcli con up bond-slave-eth1
#启动绑定
nmcli con up mybond0
#查看是否成功,eth0/1都没有IP地址,只有bond0有。
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:d8:1e:33 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:d8:1e:33 brd ff:ff:ff:ff:ff:ff
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:d8:1e:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.26.20/24 brd 192.168.26.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever
inet6 fe80::3da7:cd6b:355e:85dd/64 scope link noprefixroute
valid_lft forever preferred_lft forever
5、查看主从网卡和断网实验
[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: eth0 #再次看到eth0是主的
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d8:1e:33
Slave queue ID: 0Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d8:1e:3d
Slave queue ID: 0
网卡eth0断开
重新查看主网卡是eth1
[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: eth1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
12. 实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有
- 安装mysql
- 安装apache
- 免密钥登陆主机
当前我们只实现免密钥登陆主机
3)通过函数封装每个功能
4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
5)支持输入一批主机免密钥,使用数组 实现
#设置输出字体颜色
function color() {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1"&& $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
#设置ssh免密有登录
function ssh_host(){
function execute(){
password="123456"
while [ "$1" ] ;do
expect <<EOF
set timeout 20
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$1\n
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect "#" { send "exit\n" }
expect eof
EOF
color $1 0
shift
done
}
while true ;do
declare -a ips
while true ;do
read -p "输入IP,q/Q退出:" ip
[[ $ip =~ ^(q|Q)$ ]]&&break
[[ $ip =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]&&ips[${#ips[*]}]=$ip||{ echo "IP不合法,请重新输入";continue ; }
done
execute ${ips[*]}
read -p "是否继续远程主机,输入q/Q退出,其他任意键继续!: " var
[[ $var =~ ^q|Q$ ]]&&break
done
}
#$1:ID,$2:softname
function soft_install(){
if [ $1 = 'rocky' -o $1 = "centos" ] ;then
yum -y install $2&&color "$1" 0||color "$1" 1
elif [ $1 = 'ubuntu' ] ;then
apt update
apt -y install $2&&color "$1" 0||color "$1" 1
else
echo "不支持此系统"
fi
}
#自动化菜单
function auto_script(){
. /etc/os-release
sum=0
PS3="请选择(1-5): "
select MENU in 安装mysql 安装apache 安装nginx 免密远程登录主机传输秘钥 退出;do
case $REPLY in
1)
soft_install $ID "mysql"
;;
2)
soft_install $ID "httpd"
;;
3)
soft_install $ID "nginx"
;;
4)
ssh_host
;;
5)
echo "退出"
break
;;
*)
echo "选择有误,重新选择"
;;
esac
done
}
auto_script