前面介绍了分区的使用,如果某个分区空间不够,想增加空间是非常困难的。所以,建议尽可能使用逻辑卷而非普通的分区,因为逻辑卷的特点是空间可以动态的增大或减小。
逻辑卷如图15-1所示。
图15-1 了解逻辑卷
这里有三个大小为10G的分区,然后将这些分区加工变成pv(物理卷),他们就可以合体成一个大小为30G的虚拟硬盘,这个虚拟硬盘叫作VG(卷组)。然后在这个虚拟硬盘(卷组)上划分一个个的分区(逻辑卷),如图15-2所示。
图15-2 了解逻辑卷
这个逻辑卷大小是可变大可缩小的,最大可以占用完整个卷组的空间即30G。如果逻辑卷还不够,可以继续找一个硬盘加入卷组中,如图15-3所示。
图15-3 了解逻辑卷
假设这里又在卷组中加了一个20G的分区,此时卷组的大小为50G,逻辑卷就可以继续扩展了。如果卷组不需要那么大空间,可以把新增加的硬盘从卷组中分离出去,如图15-4所示。
图15-4 了解逻辑卷
用户直接格式化挂载逻辑卷即可,不必关心写入逻辑卷中的数据最终是写入第一个分区的还是第二个分区。
创建逻辑卷的整个过程如下。
(1)创建物理卷PV。
(2)创建卷组VG。
(3)创建逻辑卷LV。
下面介绍物理卷和卷组。
首先通过pvs或pvscan查看现在是否存在pv,命令如下。
[root@server ~]# pvs
[root@server ~]# pvscan
No matching physical volumes found
[root@server ~]#
没结果显示说明现在还不存在任何的pv,所以需要先创建pv,首先看下分区情况,命令如下。
[root@server ~]# fdisk -l /dev/sdb
...输出...
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 4196351 4194304 2G 83 Linux
/dev/sdb2 4196352 8390655 4194304 2G 82 Linux swap / Solaris
/dev/sdb4 8390656 41943039 33552384 16G 5 扩展
/dev/sdb5 8392704 12587007 4194304 2G 8e Linux LVM
/dev/sdb6 12589056 16783359 4194304 2G 8e Linux LVM
/dev/sdb7 16785408 20979711 4194304 2G 8e Linux LVM
[root@server ~]#
前面已经把sdb5~sdb7的分区类型转变为Linux LVM类型的。下面我们把/dev/sdb5~/dev/sdb7创建为pv,命令如下。
[root@server ~]# pvcreate /dev/sdb{5..7}
Physical volume "/dev/sdb5" successfully created.
Physical volume "/dev/sdb6" successfully created.
Physical volume "/dev/sdb7" successfully created.
[root@server ~]#
要删除pv用pvremove命令,例如,删除/dev/sdb7,则用pvremove /dev/sdb7,命令如下。
[root@server ~]# pvremove /dev/sdb7
Labels on physical volume "/dev/sdb7" successfully wiped.
[root@server ~]#
再次把/dev/sdb7转变为pv,命令如下。
[root@server ~]# pvcreate /dev/sdb7
Physical volume "/dev/sdb7" successfully created.
[root@server ~]#
现在查看pv,命令如下。
[root@server ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb5 lvm2 --- 2.00g 2.00g
/dev/sdb6 lvm2 --- 2.00g 2.00g
/dev/sdb7 lvm2 --- 2.00g 2.00g
[root@server ~]#
当然也可以通过pvscan来查看,从上面可以看到VG列是空的,也就是这些PV都没有加入任何的VG。下面开始创建VG,首先通过vgs或vgscan查看是否存在VG,命令如下。
[root@server ~]# vgs
[root@server ~]# vgscan
[root@server ~]#
没有任何结果显示就说明此时不存在VG,下面把/dev/sdb5,/dev/sdb6组成一个名称为vg0的VG,命令如下。
[root@server ~]# vgcreate vg0 /dev/sdb5 /dev/sdb6
Volume group "vg0" successfully created
[root@server ~]#
这个命令可以用vgcreate vg0 /dev/sdb{5,6}替代。
再次查看现有的VG,命令如下。
[root@server ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 2 0 0 wz--n- 3.99g 3.99g
[root@server ~]#
vg是由2个PV组成,每个PV大小为2G,VG的大小大概为4G,再次看下PV的信息,命令如下。
[root@server ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb5 vg0 lvm2 a-- <2.00g <2.00g
/dev/sdb6 vg0 lvm2 a-- <2.00g <2.00g
/dev/sdb7 lvm2 --- 2.00g 2.00g
[root@server ~]#
可以看到,/dev/sdb5和/dev/sdb6现在是在vg0中的,但是sdb7不是。如果vg0的空间不够了,可以为vg0增加空间,例如,把/dev/sdb7加过去,命令如下。
[root@server ~]# vgextend vg0 /dev/sdb7
Volume group "vg0" successfully extended
[root@server ~]#
这样就把/dev/sdb7加到了vg0中了,再次查看卷组的信息,命令如下。
[root@server ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 3 0 0 wz--n- <5.99g <5.99g
[root@server ~]#
此处可以看到,vg0现在是由3块pv组成,大小大概为6G左右。如果空间又不够了,还可以增加硬盘,继续添加到vg0中。如果此时想把/dev/sdb7从卷组中去除,则用vgreduce,命令如下。
[root@server ~]# vgreduce vg0 /dev/sdb7
Removed "/dev/sdb7" from volume group "vg0"
[root@server ~]#
使用vgdisplay 会显示所有卷组的详细信息,如果只想显示特定某个卷组的详细信息则用vgdisplay 卷组名,例如,现在要显示vg0的详细信息,命令如下。
[root@server ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
...输出...
Cur PV 2
Act PV 2
VG Size 3.99 GiB
PE Size 4.00 MiB
Total PE 1022
Alloc PE / Size 0 / 0
Free PE / Size 1022 / 3.99 GiB
VG UUID hxgOi2-ziHK-ikxI-kuVD-QBnG-Nu0V-bA3RZq
[root@server ~]#
上面代码中有一个关键信息叫PE Size,PE的意思是物理扩展,是分配给逻辑卷大小的最小单位,即逻辑卷大小是PE的整倍数。如果创建逻辑卷时指定的大小不是PE的整倍数,例如,创建一个大小为98M的逻辑卷,而每个PE是4M,因为98M有24.5个PE,此时系统会自动把逻辑卷创建为100M,即25个PE,如下所示。
[root@server ~]# lvcreate -L 98M -n lv0 vg0
Rounding up size to full physical extent 100.00 MiB
Logical volume "lv0" created.
[root@server ~]#
删除此lv,再创建,命令如下。
[root@server ~]# lvremove -f /dev/vg0/lv0
Logical volume "lv0" successfully removed
[root@server ~]#
PE的大小只能在创建VG时用-s来指定,不可以后期修改。
重命名vg使用vgrename命令,例如,把vg0重命名为myvg,命令如下。
[root@server ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 2 0 0 wz--n- 3.99g 3.99g
[root@server ~]# vgrename vg0 myvg
Volume group "vg0" successfully renamed to "myvg"
[root@server ~]# vgs
VG #PV #LV #SN Attr VSize VFree
myvg 2 0 0 wz--n- 3.99g 3.99g
[root@server ~]#
删除VG用vgremove命令,现在把myvg删除,命令如下。
[root@server ~]# vgremove myvg
Volume group "myvg" successfully removed
[root@server ~]# vgs
[root@server ~]#
练习:
创建一个PE大小是8M、名称为vg0的VG,命令如下。
[root@server ~]# vgcreate -s 8 vg0 /dev/sdb{5..7}
Volume group "vg0" successfully created
[root@server ~]#
此处8后面没写单位,默认就是M。查看vg0属性,命令如下。
[root@server ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
...输出...
PE Size 8.00 MiB
Total PE 765
Alloc PE / Size 0 / 0
Free PE / Size 765 / <5.98 GiB
VG UUID 6iSBFV-rwVN-i6NH-wrpC-30Cq-Hc6H-NYnXxN
[root@server ~]#
为了后续使用的方便,删除此vg0,然后创建一个默认PE大小的vg,命令如下。
[root@server ~]# vgremove vg0
Volume group "vg0" successfully removed
[root@server ~]# vgcreate vg0 /dev/sdb{5..7} #这里{5..7}表示从5到7
Volume group "vg0" successfully created
[root@server ~]#
首先通过lvscan或lvs查看现在系统上是否存在逻辑卷,命令如下。
[root@server ~]# lvscan
[root@server ~]# lvs
[root@server ~]#
没结果显示说明现在不存在任何的逻辑卷,下面用lvcreate创建逻辑卷,语法如下。
lvcreate -L 大小 -n 名称 卷组
需要注意的是,这里是大写字母L指定大小
或者
lvcreate -l pe数 -n 名称 卷组
需要注意的是,这里是小写字母l,用于指定PE数
或者
lvcreate -l 数字%free -n 名称 卷组
现在在vg0上创建一个大小为200M逻辑卷lv0,命令如下。
[root@server ~]# lvcreate -L 200M -n lv0 vg0
Logical volume "lv0" created.
[root@server ~]#
查看逻辑卷信息,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [200.00 MiB] inherit
[root@server ~]#
可以看到,访问逻辑卷的方式为/dev/卷组名/逻辑卷, 这里是/dev/vg0/lv0,大小为200M。
再创建一个包含25个PE,名称为lv1的逻辑卷,命令如下。
[root@server ~]# lvcreate -l 50 -n lv1 vg0
Logical volume "lv1" created.
[root@server ~]#
查看逻辑卷信息,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [200.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
因为每个PE大小为4M,50个PE总共为200M。
创建逻辑卷lv2,大小为剩余空间的25%,命令如下。
[root@server ~]# lvcreate -l 25%free -n lv2 vg0
Logical volume "lv2" created.
[root@server ~]#
创建一个逻辑卷lv3,使用剩余所有空间,命令如下。
[root@server ~]# lvcreate -l 100%free -n lv3 vg0
Logical volume "lv3" created.
[root@server ~]#
现在查看一下现有逻辑卷,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [200.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
ACTIVE '/dev/vg0/lv2' [<1.40 GiB] inherit
ACTIVE '/dev/vg0/lv3' [<4.20 GiB] inherit
[root@server ~]#
显示逻辑卷详细信息可以用lvdisplay,这样会显示所有逻辑卷的信息,如果想要查看某个逻辑卷的详细信息则用lvdisplay 逻辑卷名进行查看,例如,查看/dev/vg0/lv0的详细信息,命令如下。
[root@server ~]# lvdisplay /dev/vg0/lv0
--- Logical volume ---
LV Path /dev/vg0/lv0
LV Name lv0
VG Name vg0
...输出...
LV Size 200.00 MiB
Current LE 50
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
[root@server ~]#
删除逻辑卷用lvremove跟上要删除的逻辑卷,例如,删除/dev/vg0/lv3,命令如下。
[root@server ~]# lvremove /dev/vg0/lv3
Do you really want to remove active logical volume vg0/lv3? [y/n]: y
Logical volume "lv3" successfully removed
[root@server ~]#
此处必须要输入y或n,y表示确定删除。如果就想直接删除可以加-f选项表示强制删除。现在把 lv2删除,命令如下。
[root@server ~]# lvremove -f /dev/vg0/lv2
Logical volume "lv2" successfully removed
[root@server ~]#
查看逻辑卷,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [200.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
下面将这两个逻辑卷分别用xfs和ext4文件系统进行格式化,命令如下。
[root@server ~]# mkfs.xfs /dev/vg0/lv0
...输出...
[root@server ~]# mkfs.ext4 /dev/vg0/lv1
...输出...
[root@server ~]#
然后创建两个目录/lv0-xfs 和/lv1-ext4分别挂载/dev/vg0/lv0和/dev/vg0/lv1,命令如下。
[root@server ~]# mkdir /lv0-xfs /lv1-ext4
[root@server ~]# mount /dev/vg0/lv0 /lv0-xfs/
[root@server ~]# mount /dev/vg0/lv1 /lv1-ext4/
[root@server ~]#
查看逻辑卷的挂载情况,命令如下。
[root@server ~]# df -hT | grep lv
/dev/mapper/vg0-lv0 xfs 195M 12M 184M 6% /lv0-xfs
/dev/mapper/vg0-lv1 ext4 190M 1.6M 175M 1% /lv1-ext4
[root@server ~]#
注意:逻辑卷的命名也可以写成如下格式。
/dev/mapper/卷组名-逻辑卷名
然后分别往两个挂载点中拷贝测试文件,命令如下。
[root@server ~]# cp /etc/hosts /etc/issue /lv0-xfs/
[root@server ~]# cp /etc/hosts /etc/issue /lv1-ext4/
[root@server ~]#
前面讲逻辑卷的优点在于是可以动态扩大与缩小的,这节演示逻辑卷的扩大。首先查看当前逻辑卷和文件系统的大小,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [200.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
[root@server ~]# df -hT | grep lv
/dev/mapper/vg0-lv0 xfs 195M 12M 184M 6% /lv0-xfs
/dev/mapper/vg0-lv1 ext4 190M 1.6M 175M 1% /lv1-ext4
[root@server ~]#
这里可以看到,lv0和lv1的大小都是200M,里面的文件系统也为200M(显示为195M),为了好理解,可以将文件系统当成是逻辑卷中的填充物,如图15-5所示。
图15-5 此时文件系统完全覆盖逻辑卷
里面灰色部分为文件系统,填充了整个逻辑卷。下面开始扩展逻辑卷,命令是lvextend,用法如下。
lvextend -L +M -n 逻辑卷 --这句话的意思是,在原有的基础上加M
或者
lvextend -L N -n 逻辑卷 --这句话的意思是,不管原来多大,现在变为N
练习:
把lv0扩展到600M,命令如下。
[root@server ~]# lvextend -L +400M /dev/vg0/lv0
Size of logical volume vg0/lv0 changed from 200.00 MiB (50 extents) to 600.00 MiB (150 extents).
Logical volume vg0/lv0 successfully resized.
[root@server ~]#
这是在原有的基础上再额外加400M,现在共600M。
把lv1扩展到600M,命令如下。
[root@server ~]# lvextend -L 600M /dev/vg0/lv1
Size of logical volume vg0/lv1 changed from 200.00 MiB (50 extents) to 600.00 MiB (150 extents).
Logical volume vg0/lv1 successfully resized.
[root@server ~]#
这里不带“+”号,直接写600M意思是不管原来是多大,现在扩展到600M,查看大小的命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [600.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [600.00 MiB] inherit
[root@server ~]#
现在查看一下文件系统的大小,命令如下。
[root@server ~]# df -hT | grep lv
/dev/mapper/vg0-lv0 xfs 195M 12M 184M 6% /lv0-xfs
/dev/mapper/vg0-lv1 ext4 190M 1.6M 175M 1% /lv1-ext4
[root@server ~]#
会发现还是200M,这是为何?需要卸载重新挂载吗?不需要的。如图15-6所示。
图15-6 新增加的逻辑卷中没有文件系统
刚才讲了为了便于理解,把文件系统当成是填充物,右侧是逻辑卷新增加的400M空间,这里面没有文件系统,只有前面200M的逻辑卷中才有文件系统。所以,现在所要做的就是扩展文件系统,直到把多增加的400M逻辑卷也填充满为止,如图15-7所示。
图15-7 扩展文件系统
这样文件系统的大小也是600M了,扩展文件系统的命令,命令如下。
xfs文件系统使用xfs_growfs,用法xfs_growfs /挂载点
ext4文件系统用resize2fs,用法resize2fs 逻辑卷 #注,不是挂载点
下面开始扩展lv0的文件系统大小,命令如下。
[root@server ~]# xfs_growfs /lv0-xfs/
meta-data=/dev/mapper/vg0-lv0 isize=512 agcount=4, agsize=12800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
...输出...
[root@server ~]#
扩展lv1的文件系统大小,命令如下。
[root@server ~]# resize2fs /dev/vg0/lv1
resize2fs 1.45.6 (20-Mar-2020)
/dev/vg0/lv1 上的文件系统已被挂载于 /lv1-ext4;需要进行在线调整大小
old_desc_blocks = 2, new_desc_blocks = 5
/dev/vg0/lv1 上的文件系统现在为 614400 个块(每块 1k)。
[root@server ~]#
查看大小,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [600.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [600.00 MiB] inherit
[root@server ~]#
[root@server ~]# df -hT | grep lv
/dev/mapper/vg0-lv0 xfs 595M 15M 580M 3% /lv0-xfs
/dev/mapper/vg0-lv1 ext4 578M 2.3M 545M 1% /lv1-ext4
[root@server ~]#
可以看到,已经成功扩展了,在整个扩展过程并没有先卸载,这种叫作在线扩展。现在测试一下里面的文件是否被损坏,命令如下。
[root@server ~]# cat /lv0-xfs/issue
\S
Kernel \r on an \m
[root@server ~]#
依然是可以读取的,说明文件并没有损坏。
注:在使用lvextend的时候,可以加上-r选项,这样扩展逻辑卷的时候同时会把文件系统(xfs、ext4等)一并扩展了。
非常不建议对逻辑卷做缩小的操作,但是如果必须要缩小,一定要先缩小文件系统,然后再缩小逻辑卷,否则会破坏文件系统,如图15-8所示。
图15-8 假设先缩小逻辑卷
原来文件系统和逻辑卷是贴合的,如果先把逻辑卷减少了,则文件系统多出来一块,没有承载体,则整个文件系统就会破坏,所以一定要先缩小文件系统然后再缩小逻辑卷。不过对于xfs文件系统来说是不支持缩小的,这里使用ext4来演示。
下面开始进行缩小的操作,缩小文件系统请严格按照下面步骤进行操作。
步骤1:卸载文件系统,命令如下。
[root@server ~]# umount /lv1-ext4
[root@server ~]#
步骤2:对文件系统进行fsck检查,命令如下。
[root@server ~]# fsck -f /dev/vg0/lv1
fsck,来自 util-linux 2.32.1
e2fsck 1.45.6 (20-Mar-2020)
第 1 步:检查inode、块和大小
第 2 步:检查目录结构
第 3 步:检查目录连接性
第 4 步:检查引用计数
第 5 步:检查组概要信息
/dev/mapper/vg0-lv1:13/153600 文件(0.0% 为非连续的), 25795/614400 块
[root@server ~]#
步骤3:缩小文件系统,命令如下。
[root@server ~]# resize2fs /dev/vg0/lv1 200M
resize2fs 1.45.6 (20-Mar-2020)
将 /dev/vg0/lv1 上的文件系统调整为 204800 个块(每块 1k)。
/dev/vg0/lv1 上的文件系统现在为 204800 个块(每块 1k)。
[root@server ~]#
这个200M指的是最终的大小,即文件系统被减掉了400M。
步骤4:减小逻辑卷,逻辑卷最终的大小要大于等于200M,即减掉的值不能超过600M,命令如下。
[root@server ~]# lvreduce -L -400M /dev/vg0/lv1
WARNING: Reducing active logical volume to 200.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv1? [y/n]: y
Size of logical volume vg0/lv1 changed from 600.00 MiB (150 extents) to 200.00 MiB (50 extents).
Logical volume vg0/lv1 successfully resized.
[root@server ~]#
这里给了一次警告,说如果你减小逻辑卷可能会损坏数据,你是否要继续,输入y按【Enter】键。
现在重新挂载逻辑卷验证,命令如下。
[root@server ~]# mount /dev/vg0/lv1 /lv1-ext4/
[root@server ~]# df -hT | grep lv1
/dev/mapper/vg0-lv1 ext4 190M 1.6M 176M 1% /lv1-ext4
[root@server ~]#
[root@server ~]# lvscan | grep lv1
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
可以看到,逻辑卷和文件系统的大小均为200M,验证里面的文件是否被损坏,命令如下。
[root@server ~]# cat /lv1-ext4/issue
\S
Kernel \r on an \m
[root@server ~]#
依然是可以访问的。
当在逻辑卷中存储数据时,数据是写入底层的pv中的,所以即使删除了逻辑卷,并没有删除存储在pv中的数据。如果恢复删除的逻辑卷,仍然能看到逻辑卷中原有的数据。
前面已经创建了逻辑卷lv1,里面有几个文件,现在卸载并把此逻辑卷删除,命令如下。
[root@server ~]# umount /lv1-ext4
[root@server ~]# lvremove -f /dev/vg0/lv1
Logical volume "lv1" successfully removed
[root@server ~]#
[root@server ~]# lvscan | grep lv1
[root@server ~]#
下面开始恢复,我们在卷组上所做过的所有操作均有日志记录,可以通过“vgcfgrestore --list 卷组名”来查看,我们现在查看vg0的所有日志记录,命令如下。
[root@server ~]# vgcfgrestore --list vg0
...大量输出...
File: /etc/lvm/archive/vg0_00025-44445130.vg
VG name: vg0
Description: Created *before* executing 'lvremove -f /dev/vg0/lv1'
Backup Time: Thu Sep 30 12:29:38 2021
File: /etc/lvm/backup/vg0
VG name: vg0
Description: Created *after* executing 'lvremove -f /dev/vg0/lv1'
Backup Time: Thu Sep 30 12:29:38 2021
[root@server ~]#
可以看到,在执行lvremove -f /dev/vg0/lv1之前的日志文件是/etc/lvm/archive/vg0_00025-44445130.vg,那么就可以利用这个文件对lv进行恢复,恢复命令是vgcfgrestore,语法如下。
vgcfgrestore -f 日志文件 卷组名
下面开始恢复vg0,命令如下。
[root@server ~]# vgcfgrestore -f /etc/lvm/archive/vg0_00025-44445130.vg vg0
输出...
Do you really want to proceed with restore of volume group "vg0", while 1 volume(s) are active? [y/n]: y
Restored volume group vg0.
[root@server ~]#
查看逻辑卷的信息,命令如下。
[root@server ~]# lvscan | grep lv1
inactive '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
可以看到,现在已经恢复出来了,但是状态为inactive,即不活跃状态,所以现在需要激活它,命令如下。
[root@server ~]# lvchange -ay /dev/vg0/lv1
[root@server ~]# lvscan | grep lv1
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
这里-ay的意思是active yes,表明已经成功激活,然后挂载查看里面的文件,命令如下。
[root@server ~]# mount /dev/vg0/lv1 /lv1-ext4/
[root@server ~]# ls /lv1-ext4/
hosts issue lost+found
[root@server ~]#
依然是可以正常访问的。
为了备份逻辑卷中的数据,可以通过对逻辑卷做快照来实现,快照的原理如图15-9所示。
图15-9 逻辑卷快照的理解
现在有一个逻辑卷lv0,这个文件中有3个文件hosts、issue、file,然后对这个逻辑卷做快照lv0_snap(记住不要对快照格式化)。用户访问lv0_snap时,发现lv0中的内容在lv0_snap中都有,例如,在lv0_snap中也能看到hosts等文件。
但是此时在lv0_snap中看到的这些文件,都只是一个影子而已(这个影子通过硬链接实现),如同井中望月。所以,创建快照时,快照的空间可以很小,因为看到的东西并非真的存储在快照中。
如果在快照中把issue删除,也不会从原始逻辑卷中把issue删除,只是把对应的映射删除掉而已,如图15-10所示。
图15-10 在快照中删除一个文件
如果在lv0_snap创建一个文件file,则这个文件是保存在lv0_snap中的,占用lv0_snap的空间,并不会写入lv0,如图15-11所示。
图15-11 在快照中写数据
所以,在快照中新增文件的总大小,不能超过快照的大小。
上面这种映射和原始文件之间的关系,采用的是写时复制(copy-on-write)策略。
创建快照的语法如下。
lvcreate -L 大小 -n 名称 -s 逻辑卷
现在为lv0创建一个名称为lv1、大小为80M的快照,命令如下。
[root@server ~]# lvcreate -L 20M -n lv0_snap -s /dev/vg0/lv0
Logical volume "lv0_snap" created.
[root@server ~]#
查看逻辑卷的信息,命令如下。
[root@server ~]# lvscan
ACTIVE Original '/dev/vg0/lv0' [600.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
ACTIVE Snapshot '/dev/vg0/lv0_snap' [20.00 MiB] inherit
[root@server ~]#
这里可以看到,/dev/vg0/lv0是原始逻辑卷,/dev/vg0/lv0_snap是快照。从哪里能看到/dev/vg0/lv0_snap是/dev/vg0/lv0的快照呢?可以通过命令lvs查看,命令如下。
[root@server ~]# lvs
LV VG Attr LSize Pool Origin Data% ...
lv0 vg0 owi-aos--- 600.00m
lv0_snap vg0 swi-a-s--- 20.00m lv0 0.08
lv1 vg0 -wi-ao---- 200.00m
[root@server ~]#
或者
[root@server ~]# lvdisplay /dev/vg0/lv0_snap
--- Logical volume ---
...输出...
LV snapshot status active destination for lv0
LV Status available
...输出...
[root@server ~]#
把lv1挂载到/snap目录,命令如下。
[root@server ~]# mkdir /snap
[root@server ~]# mount -o nouuid /dev/vg0/lv0_snap /snap
[root@server ~]# ls /snap/
hosts issue
[root@server ~]#
注意:
(1)快照不需要格式化。
(2)因为原始逻辑卷的文件系统是xfs的,所以挂载快照时需要加上nouuid选项。
可以看到,/snap中有lv0的东西,但是要记住这些东西并非是存储在lv0_snap中的。在/snap下面在创建一个10M的测试文件,命令如下。
[root@server ~]# dd if=/dev/zero of=/snap/file bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760 bytes (10 MB, 10 MiB) copied, 0.00489009 s, 2.1 GB/s
[root@server ~]#
这10M的文件占用的是快照lv0_snap的空间,并没有出现在lv0中,命令如下。
[root@server ~]# ls /lv0-xfs/
hosts issue
[root@server ~]#
快照有什么用呢?假设原始逻辑卷中的数据被我们误删除了,那么可以利用快照恢复原始逻辑卷中的数据。
先把lv0中的数据删除,命令如下。
[root@server ~]# rm -rf /lv0-xfs/*
[root@server ~]# ls /lv0-xfs/
[root@server ~]#
然后用lv0_snap恢复lv0中的数据,先卸载lv1和lv0,命令如下。
[root@server ~]# umount /snap
[root@server ~]# umount /lv0-xfs
[root@server ~]#
然后开始用lvconvert恢复数据,命令如下。
[root@server ~]# lvconvert --merge /dev/vg0/lv0_snap
Merging of volume vg0/lv0_snap started.
vg0/lv0: Merged: 100.00%
[root@server ~]#
这里后面指定了快照,即用哪个快照来恢复原始逻辑卷中的数据,现在看到已经恢复成功了,验证命令如下。
[root@server ~]# mount /dev/vg0/lv0 /lv0-xfs/
[root@server ~]# ls /lv0-xfs/
file hosts issue
[root@server ~]#
可以看到,数据已经恢复出来了,且在快照中创建的文件也恢复到原始逻辑卷中了。通过这种用法,我们可以每天对某逻辑卷做快照,一旦数据丢失就可以快照来恢复数据了。
再次查看逻辑卷,命令如下。
[root@server ~]# lvscan
ACTIVE '/dev/vg0/lv0' [600.00 MiB] inherit
ACTIVE '/dev/vg0/lv1' [200.00 MiB] inherit
[root@server ~]#
可以看到,快照lv0_snap已经没有了,因为它已经"牺牲"了自己成全了lv0。
作业题在server2上完成。
作业1:把/dev/sdb5、/dev/sdb6、/dev/sdb7变成pv。
作业2:创建一个名称为vg0的卷组,由物理卷/dev/sdb5和/dev/sdb6组成(不包括/dev/sdb7)要求PE的大小为8M。
作业3:把物理卷/dev/sdb7加入卷组vg0中。
作业4:在卷组vg0上创建3个逻辑卷:
一个名称为lv0的逻辑卷,大小为200M,格式化为ext4文件系统,挂载到/lv0
一个名称为lv1的逻辑卷,大小为25个PE,格式化为xfs文件系统,挂载到/lv1
一个名称为lv2的逻辑卷,大小为剩余空间的2%,格式化为fat文件系统,挂载到/lv2
以上3个逻辑卷均不要求开机自动挂载。
作业5:把逻辑卷lv0和lv1分别扩展到400M。