linux逻辑卷管理员命令-lvm

第一步创建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系统快照

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 还不行!你必须要会移除系统内的 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.

你可能感兴趣的