#Raid、bash循环和逻辑卷管理
本节主要涵盖了raid的介绍和软raid的配置,bash编程的while和until循环以及组合条件测试,最后是物理卷、卷组和逻辑卷的介绍和快照的创建和使用。
raid早期是Redundant Array of Inexpensive Disks的简写意味廉价冗余磁盘阵列,现在是Redundant Array of independent Disks独立冗余磁盘阵列
raid使用额外的控制设备将多个磁盘设备当做一个设备接入计算机,既可以使用硬件实现硬件也可是通过软件实现
raid级别仅用于标识磁盘组合方式的不同
raid0
至少需要两块磁盘;没有容错能力;读写能力都有提升;100%利用率;
raid1
至少需要两块磁盘;镜像;无法取代备份,硬件级别的冗余并不能取代数据备份;读性能提升,写性能下降;50%利用率
raid4
至少需要三块磁盘,两块盘存数据和raid0相像,第三块硬盘存校验码;
允许一块盘出错,坏一块盘,业务不会中断,性能下降严重,冗余能力有限;
性能取决于校验盘;
读写性能提升;
(n-1)/n利用率;
不常使用
raid5
至少需要三块磁盘;
允许一块盘出错;
读写性能提升;
(n-1)/n利用率;
校验码分布于三块硬盘上;
raid6
和raid5相似,但允许两块盘出错,(n-2)/n利用率;
raid10
先两两一组做raid1,然后将两组做raid0,同一组内的两块硬盘坏掉整个系统不可以
至少需要四块硬盘,允许不同组内各坏一块硬盘
读写性能提升,raid10比raid5更靠谱
raid01就先四个硬盘一组做raid0,然后各组做raid1
raid10比raid01更靠谱一些
raid50
至少9块盘,三个硬盘一组做raid5,三组做raid0
jbod
将多个硬盘作为一个硬盘,没有冗余没有校验,仅仅是将多个硬盘叠加在一起获得更大的空间,第一块硬盘存满然后数据存在第二块盘上,jbod并不属于raid级别
raid既可以通过硬件实现也可以通过软件是实现
计算机主板既可以板载也可以使用适配器来使用raid控制器,多块硬盘在被连接至主机之前就已经被组合成为一个整体了,在主机看来多块磁盘就是一个设备,当向多块磁盘装操作系统时,安装过程中识别硬盘时,也只能看到raid阵列输出的一块硬盘,即时没有操作系统,在bios中也有相关设定来操作raid,另外,在安装操作系统时,linux内核也一定要能够驱动raid阵列卡才能继续安装linux
软raid,在操作系统中会识别为多块硬盘,在操作系统的内核中,将多块硬盘组合成一块磁盘,cpu用来处理数据分块和储存
raid在linux内核中的实现在2.4的内核之前,是比较简陋的,使用md来驱动,到2.6后md就简单多了
md是内核模块,那内核模块要想将多块硬盘组织成一个设备,就必须要读取配置,如果配置在配置文件中,就意味着内核模块是无法自动加载配置文件的,如果允许raid手动配置的话,用户使用命令执行是工作在用户空间的, 而各种硬件是工作在内核空间的,用户空间是无法和内核空间直接通信的,如果要通信就要使用系统调用或其他机制,这也就意味着在用户空间的配置是无法直接让内核读取并生效的。像这种直接配置硬件的工作属性时,都需要一个专门的客户端程序能够和内核空间的应用程序通过特殊的系统调用接口来进行通信。
内核的md模块在用户空间中的配置工具叫mdadm,mdadm可以和md进行通信,mdadm命令也有配置文在/etc/mdadm.conf,注意并不是md的配置文件
mdadm也是一个模式化的工具,可以将系统的任何块设备组合,有不同的工作模式
常见的模式装配模式(-A),创建模式(-C),监控模式(-F),管理模式(使用一些特殊的选项触发的是管理模式)
在创建模式下-C:
-n 数字:用于创建raid设备的设备个数
-x 数字:热备磁盘的个数
-l 级别:指定raid级别
-a yes:自动为创建的raid设备创建设备文件
-c chunk_size:指定分块大小,默认为512,单位为KB
软raid磁盘的分区id为fd
创建一个12GB的raid0 mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb1 /dev/sdc1
创建一个raid1: mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sdc1 /dev/sdc2
-D选项可以显示raid设备文件的详细信息mdadm -D /dev/md0
使用watch -n1 ‘/dev/mdstat’表示每一秒重新执行命令
管理模式下的选项
-f模拟设备损坏
-r将损坏的硬盘移除
-a将损坏的硬盘更换成新的磁盘
停止使用阵列:mdadm -S raid设备文件
for循环适用于有明确的循环次数的循环,有一些情况时没有办法知道要循环的次数的,说以就要使用while和until循环了
条件测试:
执行命令:命令成功,条件测试成功。根据$#判断是否执行成功
[ 表达式 ]
[ [ 表达式 ] ]
test 表达式
while循环格式
while 条件测试表达式;do
循环体
done
while循环必须有一情况条件测试不成功,否则会进行死循环,因此要有条件控制变量来完成循环退出
求100以内所有正整数的和
#!/bin/bash
declare -i sum=0,i=1
while [ $i -le 100 ];do
let sum+=$i
let i++
done
echo $sum
要想让循环退出,就要在循环体中改变测试条件中用于控制循环次数的相应变量的值
对while而言,条件测试成功则循环,失败则退出
until循环格式
until 测试条件;do
循环体
done
条件不满足则循环,否则,退出
文件内容的遍历
while read line ;do
循环体
done< /path/to/somefile
取出当前系统上默认shell为bash的用户
#!/bin/bash
while read line;do
[[ `echo $line | cut -d: -f7` == "/bin/bash" ]]&&echo $line | cut -d: -f1
done < /etc/passwd
逻辑与:多个条件同时满足
[ CONDITION1 ] && [ CONDITION2 ]
[ CONDITION1 -a CONDITION2 ]
[ [ CONDITION1 && CONDITION2 ] ] 注意&&不允许用于单中括号中
逻辑或:满足一个即可
[ CONDITION1 ]||[ CONDITION2 ]
[ CONDITION1 -o CONDITION2 ]
[ [ CONDITION1 || CONDITION2 ] ] 注意||不允许用于单中括号中
德摩根定律
反(条件1 或 条件2)=!条件1 并且 !条件2
反(条件1 并且 条件2)=!条件1 或 !条件2
lvm的全称是logical volume manager,逻辑卷管理器
lvm的功能是把存储空间在逻辑层次上将多个设备组合成一个来使用,类似于软raid
lvm可以支持在线空间扩展和缩减,也可以对逻辑卷做快照
逻辑卷管理器实际上也是一个软件,在软件层面上将多个块设备模拟为一个设备,多个块设备的组成叫做卷组,在卷组上把每个物理卷分割成很多独立的块,将块指定为逻辑设备后就可以使用了。在底层是物理设备,中间的层次是卷组(volume group),卷组在创建完成后,空间是不能直接使用的,卷组用来指定块的大小,这个块叫做PE(physical extent),卷组类似于扩展分区,不能直接使用,要划分逻辑卷(logical volume)后才能使用,当pe被分配到某个逻辑卷后就叫做le,当逻辑卷空间不够使用时,可以动态的将pe加到逻辑卷中,实现空间扩展,但类似逻辑分区,逻辑卷也要进行格式化才能使用,当建立了文件系统,新加到逻辑卷的pe,并没有建立文件系统,此时物理边界扩大了,但是文件系统边界(逻辑边界)并没有变化,所以逻辑边界也要进行操作。
lvm使用的内核模块是DM(device mapper),是设备映射的简写
设备文件访问路径/dev/卷组名/逻辑卷名,实际上真实的路径在/dev/mapper/卷组名-逻辑卷名
物理卷管理命令:pv*
创建lvm,要将分区的id改为8e(linux lvm)
创建物理卷使用pvcreate [options] 设备
显示当前的物理卷使用pvs,显示详细信息可以使用pvdisplay [device]
卷组的管理命令:vg*
创建卷组使用vgcreative 卷组名,-s选项可以指定PE大小,默认是4M
显示当前存在的卷组使用vgs,显示详细信息使用vgdisplay
图中pv表示物理卷的个数,lv表示逻辑卷的个数
扩容使用vgextend
缩减使用vgreduce,但要配合pvmove使用,pvmove会将物理卷上存储的数据进行转移,删除vg使用vgremove
扩展卷组
1.准备要添加的物理卷
2.扩展卷组:添加物理卷至卷组vgextend vg_name /path/to/pv_device
缩减卷组
1.确定要移除的物理卷的总空间大小,要小于VG当前的可用空间大小
2.将要移除的物理卷上的所有PE移动至其他PV pvmove /path/to/pv_device
3.缩减VG vgreduce vg_name /path/to/pv_device
逻辑卷的管理命令:lv***
创建逻辑卷使用lvcreate,一般格式为lvcreate -L Size -n name vg_name
-n 在创建时指定逻辑卷名
-L指定卷大小
查看逻辑卷使用lvs和lvdisplay,使用lvdisplay时,要使用逻辑卷的设备文件路径
逻辑卷的设备文件
当逻辑卷创建完成后,就可以对逻辑卷进行格式化,然后挂载使用了
逻辑卷的扩展使用lvextend
-L 扩展的空间大小,有+号表示增加的空间大小,没有+表示增加后空间的大小
扩展物理边界
扩展逻辑边界
在线扩展边界并不会影响数据访问
当逻辑边界扩展完成后,逻辑卷的使用空间就真正意义上扩展完成了
总结:扩展逻辑卷的步骤
1.先确定扩展的大小,并确保所属的卷组有足够的剩余空间
2.扩展物理边界,最好将要扩展的逻辑卷离线(umount),扩展前最好执行文件系统自检
lvextend -L [+]SIZE /path/to/lv_device
3.扩展逻辑边界
resize2fs /path/to/lv_device
逻辑卷的缩减
1.逻辑卷缩减首先要卸载卷,并且强制检测
2.缩减逻辑边界resize2fs /path/lv_device 缩减后的大小
3.缩减物理边界lvreduce -L [-]Size /path/to/lv_device
4.挂载卷
创建后的逻辑卷,当逻辑卷正在被访问时,复制的数据和逻辑卷的数据可能处于非一致性的状态(inconsistent),这种复制的数据属于损坏的数据,所以不能简单的使用copy命令
快照卷也是一种逻辑卷,通常快照是只读的
当卷组还有剩余空间上时,在卷组中创建以个快照卷,快照卷可以实现通过另外一条通道来访问逻辑卷,当逻辑卷的文件发生改变时,将改变的内容存到快照卷中,以后访问快照时,发生改变的文件访问快照卷,没有发生改变的文件访问逻辑卷,通过这种方式就能访问过去某一时间的处于一致性状态的文件
快照可以提供过去某一时间的原卷访问通道,其空间大小取决于在使用时间范围内原卷数据的变化幅度
创建快照卷的一般使用格式lvcreate -s -L Size -n Name -p r /path/to/原卷 ,其中-p r表示指定权限为只读
当数据存在快照卷后,就可以使用各种命令进行备份了
删除快照卷和删除逻辑卷相同,需要umoun然后lvremove
将用户输入的字符串转换为大写字母,并输出,然后提示用户继续输入字符串,继续转换为大写字母,当 用户输入quit后,退出
#!/bin/bash
read -p "enter a word" word
while [[ "$word" != "quit" ]];do
echo $word | tr 'a-z' 'A-Z'
read -p "enter a word again:" word
done
显示如下菜单给用户
cpu:print cpu information
mem:print memory information
disk:print disk information
quit:quit
Enter your option:
根据用户的选择输出相应信息,每次执行后不退出,由用户继续选择
#!/bin/bash
cat << EOF
cpu:print cpu information
mem:print memory information
disk:print disk information
quit:quit
EOF
read -p "Enter your option:" option
option=`echo $option | tr "A-Z" 'a-z'`
while [[ "$option" != "quit" ]];do
if [[ "$option" == "cpu" ]];then
cat /proc/cpuinfo
elif [[ "$option" == "mem" ]];then
free -m
elif [[ "$option" == "disk" ]];then
df -h
else
echo "wrong option"
fi
read -p "Enter your option:" option
option=`echo $option | tr "A-Z" 'a-z'`
done
提示用户输入一个用户名,如果存在,显示UID和shell信息;否则显示无此用户;显示完成后,提示用户再次输入;如果用户输入的是quit则退出
#!/bin/bash
read -p "enter a username:" uname
while [[ "$uname" != "quit" ]];do
if [ -z "$uname" ];then
echo "please enter a username or quit"
elif id $uname &> /dev/null;then
grep "^$uname\>" /etc/passwd | cut -d: -f3,7
else
echo "no such user"
fi
read -p "enter a username:(quit to exit)" uname
done
提示用户输入一个用户名,判断用户是否登录了当前系统,如果没有登录,则停止5秒钟后,再次判断;直到用户登录系统,显示“用户来了”,而后退出
#!/bin/bash
read -p "enter a username:" username
while ! id $username &> /dev/null;do
read -p "enter a username adain:" username
done
who | grep "^$username" &> /dev/null
retval=$?
while [ $retval -ne 0 ];do
sleep 5
who | grep "^$username" &> /dev/null
retval=$?
done
echo "$username is online."
显示所有用户id号为偶数的用户
#!/bin/bash
while read line;do
userid=`echo $line | cut -d: -f3`
if [ $[$userid%2] -eq 0 ];then
echo $line | cut -d: -f1
fi
done < /etc/passwd
显示/etc/rc.d/rc.sysinit文件中,总字符大于30的行
#!/bin/bash
while read line;do
charcount=`echo $line | wc -c`
if [ $charcount -gt 30 ];then
echo -n "$charcount:"
echo $line
fi
done < /etc/rc.d/rc.sysinit
显示uid和gid均为偶数的用户
#!/bin/bash
while read line;do
userid=`echo $line | cut -d: -f3`
groupid=`echo $line | cut -d: -f4`
if [ $[$userid%2] -eq 0 -a $[$groupid%2] -eq 0 ];then
echo $line | cut -d: -f1
fi
done < /etc/passwd
显示/etc/rc.d/rc.sysinit文件中,总字符大于30的且非以#开头的行
#!/bin/bash
while read line;do
charcount=`echo $line | wc -c`
if [ $charcount -gt 30 ]&&[[ "$line"=~ ^[^#] ]];then
echo -n "$charcount:"
echo $line
fi
done < /etc/rc.d/rc.sysinit
写一个脚本,完成如下任务
提示用户输入一个磁盘设备文件路径,如果用户给定的路径文件不存在或不是一个块设备文件,则提示用户重新输入,直到输入正确为止,或者输入quit以9为退出码结束脚本
提示用户:下面的操作会清空磁盘中的数据,并提示是否继续。如果用户给出字符y或yes,则继续,否则,则提供以8为退出码结束脚本
将用户指定的磁盘上的分区清空,而后创建两个主分,大小分别为100M和512M
格式化这两个分区
将第一个分区挂载至/mnt/boot目录,第二个分区挂载至/mnt/sysroot目录
逻辑卷管理练习
1.创建一个由两个物理卷组成大小为20G卷组的myvg,要求PE大小为16M;
而后新建大小为7G的逻辑卷mylv1,要求其文件系统为ext4,块大小为2048,且开机能自动挂载至/users
2.新建用户openstack,其家目录为/users/openstack,切换至openstack用户,复制一些文件至其家目录中
3.缩减mylv1至5G大小;切换至openstack用户确保其用户没有丢失
4.对mylv1创建快照snap-mylv1,并通过其备份至/tmp/user.tar.bz2