第一步创建PV,指令如下
pvcreate :将实体 partition 创建成为 PV ;|
pvscan :搜寻目前系统里面任何具有 PV 的磁盘;
pvdisplay :显示出目前系统上面的 PV 状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性
[root@192 ~]# pvscan
No matching physical volumes found
此时我的系统上还没有任何的pv,接下来我拿我的系统里面sdb和sdc两个磁盘来做试验,分出4个区,每个区10G,类型指定为8e00。
[root@192 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sde 8:64 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
[root@192 ~]# gdisk /dev/sdb
...
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +10G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-41943006, default = 20973568) or {+-}size{KMGTP}:
Last sector (20973568-41943006, default = 41943006) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
利用相同的指令给sdc分2个区。最终如下所示。
[root@192 ~]# gdisk -l /dev/sdb
...
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8E00 Linux LVM
2 20973568 41943006 10.0 GiB 8E00 Linux LVM
[root@192 ~]# gdisk -l /dev/sdc
...
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8E00 Linux LVM
2 20973568 41943006 10.0 GiB 8E00 Linux LVM
[root@192 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
...
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 10G 0 part
└─sdb2 8:18 0 10G 0 part
sdc 8:32 0 20G 0 disk
├─sdc1 8:33 0 10G 0 part
└─sdc2 8:34 0 10G 0 part
到此我们已经有了4个分区了,开始创建PV
[root@192 ~]# pvcreate /dev/sdb{1,2} /dev/sdc{1,2}
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdc2" successfully created.
再次查看pv信息
[root@192 ~]# pvscan
PV /dev/sdb2 lvm2 [<10.00 GiB]
PV /dev/sdc1 lvm2 [10.00 GiB]
PV /dev/sdc2 lvm2 [<10.00 GiB]
PV /dev/sdb1 lvm2 [10.00 GiB]
Total: 4 [<40.00 GiB] / in use: 0 [0 ] / in no VG: 4 [<40.00 GiB]<br>
#最后一行,显示的是整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量
更详细的显示PV
[root@192 ~]# pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name #没有分配出去,所以空白
PV Size 10.00 GiB
Allocatable NO #是否已被分配
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID seeioP-rvay-DPEo-J38C-iJbH-9Ynt-lv2UWH
由于 PE 是在创建 VG 时才给予的参数,因此在这里看到的 PV 里头的 PE 都会是 0,而且也没有多余的 PE 可供分配 (allocatable)
第二步创建VG,指令如下
vgcreate :主要创建VG。
vgscan :搜寻系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内增加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :设置 VG 是否启动 (active) ;
vgremove :删除一个 VG 啊!
[root@study ~]# vgcreate [-s N[mgt]] VG名称 PV名称
选项与参数:
-s :后面接 PE 的大小 (size) ,单位可以是 m, g, t (大小写均可)
创建VG并将前3个PV加入到VG
[root@192 ~]# vgcreate -s 16M freecls-vg /dev/sdb{1,2} /dev/sdc1
Volume group "freecls-vg" successfully created
#查看vg
[root@192 ~]# vgscan
Reading volume groups from cache.
Found volume group "freecls-vg" using metadata type lvm2
这时候再用pvscan查看
[root@192 ~]# pvscan
PV /dev/sdb1 VG freecls-vg lvm2 [9.98 GiB / 9.98 GiB free]
PV /dev/sdb2 VG freecls-vg lvm2 [9.98 GiB / 9.98 GiB free]
PV /dev/sdc1 VG freecls-vg lvm2 [9.98 GiB / 9.98 GiB free]
PV /dev/sdc2 lvm2 [<10.00 GiB]
Total: 4 [39.95 GiB] / in use: 3 [29.95 GiB] / in no VG: 1 [<10.00 GiB]
[root@192 ~]# vgdisplay freecls-vg
--- Volume group ---
VG Name freecls-vg
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 29.95 GiB #VG的容量
PE Size 16.00 MiB #每个PE的大小
Total PE 1917 #PE的数量
Alloc PE / Size 0 / 0
Free PE / Size 1917 / 29.95 GiB
VG UUID tijhQL-T3Dl-3uVs-IVbi-empk-hi6u-tTD55B
由于尚未切出 LV,因此所有的 PE 均可自由使用。
上面我们用了3个PV组成了一个VG,那么如果此时我想增大VG的容量,只要把额外的PV加进来即可,这里我们把/dev/sdc2加进来
[root@192 ~]# vgextend freecls-vg /dev/sdc2
Volume group "freecls-vg" successfully extended
此时,VG的容量又多了20G。
第三步创建 LV
创造出 VG 这个大磁盘之后,接下来就是进行分区了,就是就是所谓的 LV。相关指令如下。
lvcreate :创建 LV!
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态啊!
lvextend :在 LV 里面增加容量!
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV !
lvresize :对 LV 进行容量大小的调整
[root@study ~]# lvcreate [-L N[mgt]] [-n LV名称] VG名称
[root@study ~]# lvcreate [-l N] [-n LV名称] VG名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,
因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
-l :后面可以接 PE 的“个数”,而不是数量。若要这么做,得要自行计算 PE 数。
-n :后面接的就是 LV 的名称
从freecls-vg这个大磁盘中分出4个G,如果想分出多个区,重复执行下面的命令即可。
[root@192 ~]# lvcreate -L 4G -n lv_1 freecls-vg
Logical volume "lv_1" created
[root@192 ~]# lvscan
ACTIVE '/dev/freecls-vg/lv_1' [4.00 GiB] inherit
[root@192 ~]# lvdisplay /dev/freecls-vg/lv_1
--- Logical volume ---
LV Path /dev/freecls-vg/lv_1
LV Name lv_1
VG Name freecls-vg
LV UUID amVB42-19zH-9iup-GLDd-p2iG-i2Ne-VMIiP3
LV Write Access read/write
LV Creation host, time 192.168.1.202, 2018-06-05 00:06:31 -0400
LV Status available
# open 0
LV Size 4.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
到了这一步,一个lvm分区已经准备好了!接下来,就是针对这个 LV 来处理啦!注意, VG 的名称为 freecls-vg, 但是 LV 的名称必须使用全名!亦即是 /dev/freecls-vg/lv_1,接下来是我们熟悉的格式化挂载,不熟悉的朋友可以参照我之前的几篇文章。
[root@192 ~]# mkfs.xfs /dev/freecls-vg/lv_1
[root@192 ~]# mkdir /var/lvm
[root@192 ~]# mount /dev/freecls-vg/lv_1 /var/lvm
扩大LV的容量
我们知道LV是从VG里分出来的,而VG是由PV组成的,如果VG容量够,直接扩充LV即可,如果容量不够,应该先增加新的PV,然后把这个新的PV加入到VG。
我们的 Linux 实际使用的其实不是 LV!而是 LV 这个设备内的文件系统! 所以一切最终还是要以文件系统为依据!目前在 Linux 环境下,鸟哥测试过 可以放大的文件系统有 XFS 以及 EXT 家族! 至于缩小仅有 EXT 家族,目前 XFS 文件 系统并不支持文件系统的容量缩小喔!要注意!XFS 放大文件系统通过简单的 xfs_growfs 指令即可。
整个文件系统在最初格式化的时候就创建了 inode/block/superblock 等信息,要改变这些信息是很难的! 不过因为文件系统格式化 的时候创建的是多个 block group ,因此我们可以通过在文件系统当中增加 block group 的方式来增减文件系统的量!而增减 block group 就是利用 xfs_growfs!所以最后一步是针对 文件系统来处理的, 前面几步则是针对 LVM 的实际容量大小。
[root@192 ~]# vgdisplay freecls-vg
...
Alloc PE / Size 256 / 4.00 GiB
Free PE / Size 2300 / <35.94 GiB
VG UUID tijhQL-T3Dl-3uVs-IVbi-empk-hi6u-tTD55B
从上面可以看出,我们的VG还有将近35个G空闲,所以可以直接拿来扩充LV。
[root@192 ~]# lvscan
ACTIVE '/dev/freecls-vg/lv_1' [4.00 GiB] inherit
[root@192 ~]# lvresize -L +10G /dev/freecls-vg/lv_1
Size of logical volume freecls-vg/lv_1 changed from 4.00 GiB
(256 extents) to 14.00 GiB (896 extents).
Logical volume freecls-vg/lv_1 successfully resized.
[root@192 ~]# lvscan
ACTIVE '/dev/freecls-vg/lv_1' [14.00 GiB] inherit
[root@192 ~]# df -Th /var/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 xfs 4.0G 33M 4.0G 1% /var/lvm
从上面的输出可以看出,虽然LV确实增加了10G,但是文件系统却没有增加。而 且,我们的 LVM 可以线上直接处理,并不需要特别给他 umount。我们用 xfs_growfs 来更新一下文件系统。
[root@192 ~]# xfs_info /var/lvm
meta-data=/dev/mapper/freecls--vg-lv_1 isize=512 agcount=4, agsize=262144 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1048576, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@192 ~]# xfs_growfs /var/lvm
[root@192 ~]# xfs_info /var/lvm
meta-data=/dev/mapper/freecls--vg-lv_1 isize=512 agcount=14, agsize=262144 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=3670016, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@192 ~]# df -Th /var/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 xfs 14G 33M 14G 1% /var/lvm
从上面的输出可以看出,agcount(block group)增加了10,就是用来额外记录新的容量的。整 体的 block 数量也增加了!从1048576 增加到 3670016, 这样整个文件系统就给他放大了。
如果使用的是ext4文件系统,则应该用 resize2fs 命令
resize2fs [-f] [device] [size]
-f 强制进行resize操作
[device] 设备名
[size] 如果加上,则必须带上M,G等。省略代表整个分区容量
如果上面的是ext4文件系统,我们就把 xfs_growfs /var/lvm 替换成下面指令,不再细讲。
resize2fs /dev/freecls-vg/lv_1
ext4文件系统减少容量
首先我们把刚才的文件系统格式化成ext4格式并挂载来做测试(如果之前里面有数据,则全部丢失)。
[root@192 ~]# umount /dev/freecls-vg/lv_1
[root@192 ~]# mkfs.ext4 /dev/freecls-vg/lv_1
[root@192 ~]# mount /dev/freecls-vg/lv_1 /var/lvm
[root@192 ~]# df -Th /dev/freecls-vg/lv_1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 ext4 14G 41M 13G 1% /var/lvm
开始缩小文件系统
[root@192 ~]# pvdisplay
...
PV Name /dev/sdb1
PE Size 16.00 MiB
Total PE 639
Free PE 0
Allocated PE 639
PV Name /dev/sdb2
PE Size 16.00 MiB
Total PE 639
Free PE 382
Allocated PE 257
从上面的输出我们知道,/dev/sdb1这个PV有638 * 16 = 10224 M,已全部被使用。而/dev/sdb2这个PV也有 10224M,但是被使用了257 * 16 = 4112 M,加起来刚好是/var/lvm文件系统的容量,14G左右。假设我们现在要缩小文件系统容量到10224以内,这样sdb2这个PV就可以解放出来,如果它是一个独立的磁盘,则可以直接拔出另作他用。
注意:假设我们把文件系统大小缩小到10G左右,而把LV缩小到10个PE容量 160M, 那么用df显示的时候,文件系统总容量为10G,但是实际容量却只有160M。
[root@192 ~]# resize2fs /dev/freecls-vg/lv_1 10G
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/freecls-vg/lv_1 is mounted on /var/lvm; on-line resizing required
resize2fs: On-line shrinking not supported
在这里我们必须先卸载
[root@192 ~]# umount /dev/freecls-vg/lv_1
[root@192 ~]# resize2fs /dev/freecls-vg/lv_1 10G
resize2fs 1.42.9 (28-Dec-2013)
Please run 'e2fsck -f /dev/freecls-vg/lv_1' first.
提示我们要先运行磁盘检查,那就进行
[root@192 ~]# e2fsck -f /dev/freecls-vg/lv_1
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/freecls-vg/lv_1: 11/917504 files (0.0% non-contiguous), 100612/3670016 blocks
[root@192 ~]# resize2fs /dev/freecls-vg/lv_1 10G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/freecls-vg/lv_1 to 2621440 (4k) blocks.
The filesystem on /dev/freecls-vg/lv_1 is now 2621440 blocks long.
[root@192 ~]# mount /dev/freecls-vg/lv_1 /var/lvm/
#从这里可以看出,已经从14G变成了10G。
[root@192 ~]# df -Th /dev/mapper/freecls--vg-lv_1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 ext4 9.8G 37M 9.2G 1% /var/lvm
#接下来减少LV的257个PE数
[root@192 ~]# lvresize -l -257 /dev/freecls-vg/lv_1
WARNING: Reducing active and open logical volume to 9.98 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce freecls-vg/lv_1? [y/n]: y
Size of logical volume freecls-vg/lv_1 changed from 14.00 GiB
(896 extents) to 9.98 GiB (639 extents).
Logical volume freecls-vg/lv_1 successfully resized.
#从这里可以看出,/dev/sdb2解放出来了。
[root@192 ~]# pvdisplay
...
PV Name /dev/sdb1
PE Size 16.00 MiB
Total PE 639
Free PE 0
Allocated PE 639
...
PV Name /dev/sdb2
PE Size 16.00 MiB
Total PE 639
Free PE 639
Allocated PE 0
LVM不但可以扩容,而且还可以做快照。LV磁盘快照就是将当时的系统 信息记录下来,就好像照相记录一般! 未来若有任何数据更动了,则原始数据会被搬移到快 照区,没有被更动的区域则由快照区与文件系统共享。 我们用图解说明
最初创建 LV 磁盘快照区的状况,LVM 会预留一个区域 (上图左侧三个 PE 区块) 作为数据存放处。 此时快照区内并没有任何数据,而快照区与系统区共享所有的 PE 数据, 因此你会看到快照区的内容与文件系统是一模一样的。
等到系统运行一阵子后,假设 A 区域 的数据被更动了 (上图所示) ,则更动前系统会将该区域的数据移动到快照区, 所以在 右图的快照区被占用了一块 PE 成为 A,而其他 B 到 I 的区块则还是与文件系统共享。
我们大致可以得出这样的结论:
1.如果第一次对PE块改动,那么先会把老的PE块复制一份,然后再改动PE。
2.快照区的最大容量约等于建立快照时,被备份的那个LV的容量。
3.如果快照区的容量不够大,若原始数据被更动的实际数据量比快照区大,那么快照将失效。
由于快照区与原本的 LV 共享很多 PE 区块,因此快 照区与被快照的 LV 必须要在同一个 VG 上头。
由于之前把 /dev/freecls-vg/lv_1 格式化成了ext4格式,现在把他还原 为xfs格式来测试,ext4文件系统同理。
[root@192 ~]# umount /var/lvm
[root@192 ~]# mkfs.xfs /dev/freecls-vg/lv_1 -f
[root@192 ~]# mount /dev/freecls-vg/lv_1 /var/lvm
我们现在/var/lvm文件夹里创建几个文件
[root@192 ~]# cd /var/lvm
[root@192 lvm]# dd if=/dev/zero of=tmp1.txt bs=1M count=10
[root@192 lvm]# dd if=/dev/zero of=tmp2.txt bs=1M count=12
[root@192 lvm]# dd if=/dev/zero of=tmp3.txt bs=1M count=4
[root@192 lvm]# ll
-rw-r--r--. 1 root root 10485760 Jun 5 07:37 tmp1.txt
-rw-r--r--. 1 root root 12582912 Jun 5 07:37 tmp2.txt
-rw-r--r--. 1 root root 4194304 Jun 5 07:37 tmp3.txt
查看下VG剩余多少容量,如下所示,还有很多。
[root@192 lvm]# vgdisplay
--- Volume group ---
VG Name freecls-vg
...
Free PE / Size 1917 / 29.95 GiB
[root@study ~]# lvcreate -s -l 10 -n freecls-snap1 /dev/freecls-vg/lv_1
Logical volume "freecls-snap1" created
# 上述的指令中最重要的是那个 -s 的选项!代表是 snapshot 快照功能之意!
# -n 后面接快照区的设备名称, /dev/.... 则是要被快照的 LV 完整文件名。
# -l 后面则是接使用多少个 PE 来作为这个快照区使用。
[root@192 lvm]# lvdisplay
...
LV Path /dev/freecls-vg/freecls-snap1
LV Name freecls-snap1
VG Name freecls-vg
LV UUID qyMnqz-wiBa-aeVq-Un8k-LAVC-Ecsb-crabcs
LV Write Access read/write
LV Creation host, time 192.168.1.202, 2018-06-05 07:44:16 -0400
LV snapshot status active destination for lv_1
LV Status available
# open 0
LV Size 9.98 GiB
Current LE 639
COW-table size 160.00 MiB #最大记录160M
COW-table LE 10
Allocated to snapshot 0.01% #目前被用掉的容量
...
这个 /dev/freecls-vg/freecls-snap1 快照区就被创建起来了!而且他的 LV 量竟然与原本 的 /dev/freecls-vg/lv_1 相同 9.98G!也就是说,如果你真的挂载这个设备时,看到的数据会跟原本的一样。我们来试试
[root@192 lvm]# mkdir /var/lvm-snap1
[root@192 lvm]# mount /dev/freecls-vg/freecls-snap1 /var/lvm-snap1
mount: wrong fs type, bad option, bad superblock on /dev/mapper/freecls--vg-freecls--snap1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
报错了,这是由于XFS 不允许相同的 UUID 文件系统的挂载,因此我们得要加上那个 nouuid 的参数,让 文件系统忽略相同的 UUID 所造成的问题!因为快照出来的文件系统是一样的。
[root@192 lvm]# mount -o nouuid /dev/freecls-vg/freecls-snap1 /var/lvm-snap1
[root@192 ~]# ll /var/lvm
total 26624
-rw-r--r--. 1 root root 10485760 Jun 5 07:59 tmp1.txt
-rw-r--r--. 1 root root 12582912 Jun 5 08:00 tmp2.txt
-rw-r--r--. 1 root root 4194304 Jun 5 08:00 tmp3.txt
[root@192 ~]# ll /var/lvm-snap1/
total 26624
-rw-r--r--. 1 root root 10485760 Jun 5 07:59 tmp1.txt
-rw-r--r--. 1 root root 12582912 Jun 5 08:00 tmp2.txt
-rw-r--r--. 1 root root 4194304 Jun 5 08:00 tmp3.txt
[root@192 ~]# df -Th /var/lvm /var/lvm-snap1/
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 xfs 10G 59M 10G 1% /var/lvm
/dev/mapper/freecls--vg-freecls--snap1 xfs 10G 59M 10G 1% /var/lvm-snap1
看到没有,一模一样。现在我们做一些改动在 /var/lvm 上。
[root@192 ~]# cd /var/lvm
[root@192 lvm]# dd if=/dev/zero of=tmp4.txt bs=1M count=20
[root@192 lvm]# df -Th /var/lvm /var/lvm-snap1/
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 xfs 10G 79M 9.9G 1% /var/lvm
/dev/mapper/freecls--vg-freecls--snap1 xfs 10G 59M 10G 1% /var/lvm-snap1
[root@192 lvm]# echo 'aaa' > tmp1.txt
[root@192 lvm]# df -Th /var/lvm /var/lvm-snap1/
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/freecls--vg-lv_1 xfs 10G 69M 10G 1% /var/lvm
/dev/mapper/freecls--vg-freecls--snap1 xfs 10G 59M 10G 1% /var/lvm-snap1
[root@192 lvm]# lvdisplay
...
--- Logical volume ---
LV Path /dev/freecls-vg/freecls-snap1
...
COW-table size 160.00 MiB
Allocated to snapshot 13.83%
从上面的输出可以看出,快照的LV用了将近22M
好,接下来我们把 /var/lvm 还原成创建快照时的样子 (其实就是 /var/lvm-snap1的样子),在这里会利用xfsdump命令,不熟悉的朋友可以参照 linux备份命令-xfsdump, 有讲到对ext4系统的备份还原。
#先把快照区文件系统备份
[root@192 lvm]# xfsdump -l 0 -L lvm1 -M lvm1 -f /tmp/lvm.dump /var/lvm-snap1
为什么要备份呢?为啥不可以直接格式化 /dev/freecls-vg/lv_1 然后把 /var/lvm-snap1里的内容复制过去? 要知道 /dev/freecls-vg/freecls-snap1 其实是 /dev/freecls-vg/lv_1的快照, 因此如果你格式化整个 lv_1时,原本的文件系统所有数据都会被搬移到 freecls-snap1。 那如果 freecls-snap1 的容量不够大 (通常也真的不够大) ,那么部分数据将无法复制到 freecls-snap1 内,数据当然无法全部还原。
而LVM快照的另外一个好处是,你可以直接对比 /var/lvm-snap1 和 /var/lvm 两个文件夹的内容就可以得知到底改变了啥。
好了,下面我们直接卸载并删除快照,因为我们已经备份好了。然后复原。
[root@192 ~]# umount /var/lvm-snap1/
[root@192 ~]# lvremove /dev/freecls-vg/freecls-snap1
Do you really want to remove active logical volume freecls-vg/freecls-snap1? [y/n]: y
Logical volume "freecls-snap1" successfully removed
#重新格式化挂载
[root@192 ~]# umount /var/lvm
[root@192 ~]# mkfs.xfs -f /dev/freecls-vg/lv_1
[root@192 ~]# mount /dev/freecls-vg/lv_1 /var/lvm
[root@192 ~]# ll /var/lvm
total 0
#复原
[root@192 ~]# xfsrestore -f /tmp/lvm.dump -L lvm1 /var/lvm
[root@192 ~]# ll /var/lvm
total 26624
-rw-r--r--. 1 root root 10485760 Jun 5 07:59 tmp1.txt
-rw-r--r--. 1 root root 12582912 Jun 5 08:00 tmp2.txt
-rw-r--r--. 1 root root 4194304 Jun 5 08:00 tmp3.txt
看到这里我们发现,这个快照功能有点麻烦,既要创建快照LV,又要通过 xfsrestore 来复原。其实它还有个更大的功能。就是反向思维,我们可以把 /var/lvm 当做备份还原的起点,然后做一个快照并挂载到 /var/lvm-snap1,此时我们把 /var/lvm-snap1开放给别人临时用,当用完之后,我们直接把快照删除即可。
尤其是在虚拟机当中创建多份给同学使用的测试环境, 你只要有一个基础的环境保持住,其他的环境使用快照来提供即可。当同学将系统搞烂了,你只要将快照区删除, 再重建一个快照区!这样环境就恢复了,是不是非常有用。
下图是对这些指令的简单汇总。
会玩 LVM 还不行!你必须要会移除系统内的 LVM 喔!因为你的实体 partition 已经被使用到 LVM 去, 如果你还没有将 LVM 关闭就直接将那些 partition 删除或转为其他用途的话,系统是会发生很大的问题的。删除我们从里到外就行,按照以下流程。
1. 先卸载系统上面的 LVM 文件系统 (包括快照与所有 LV) ;
2. 使用 lvremove 移除 LV ;
3. 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志;
4. 使用 vgremove 移除 VG:
5. 使用 pvremove 移除 PV;
6. 最后,使用 gdisk 来删除分区并重新分区另作他用。
[root@192 ~]# umount /var/lvm
[root@192 ~]# lvremove /dev/freecls-vg/lv_1
Do you really want to remove active logical volume freecls-vg/lv_1? [y/n]: y
Logical volume "lv_1" successfully removed
[root@192 ~]# vgchange -a n freecls-vg
0 logical volume(s) in volume group "freecls-vg" now active
[root@192 ~]# vgremove freecls-vg
Volume group "freecls-vg" successfully removed
[root@192 ~]# pvremove /dev/sdb{1,2} /dev/sdc{1,2}
Labels on physical volume "/dev/sdb1" successfully wiped.
Labels on physical volume "/dev/sdb2" successfully wiped.
Labels on physical volume "/dev/sdc1" successfully wiped.
Labels on physical volume "/dev/sdc2" successfully wiped.