linux逻辑卷管理员命令-lvm

2018-06-05 12:43:37

想要了解逻辑卷lvm相关知识请参考 逻辑卷轴管理员LVM (Logical Volume Manager),这里讲解实例。

第一步创建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.


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.觉得本文有帮助的小伙伴可以关注笔者
3.原文地址http://www.freecls.com/a/2712/47

©著作权归作者所有
收藏
推荐阅读
  • linux软件磁盘阵列命令-mdadm

    linux环境下可以用mdadm来创建软件磁盘阵列,磁盘阵列相关知识请参考文章磁盘阵列[root@study ~]# mdadm --detail /dev/md0 [root@study ~]# m...

  • linux命令系列-fuser,lsof,pidof

    fuser 可以借由文件(或文件系统) 找出正在使用该文件的程序。有的时候我想要知道我的程序到底在这次启动过程中打开了多少文件,可以利用 fuser 来观察啦! 举例来说,你如果卸载时发现系统通知:“...

  • linux备份命令-cpio

    cpio可以备份任何东西,包括设备设备文件。不过cpio 不会主动的去找文件来备份!一般来说, cpio 得要 配合类似 find 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里。[ro...

  • linux备份命令-xfsdump,xfsrestore,dump,restore

    XFS 文件系统备份 xfsdumpxfsdump 的功能颇强!他除了可以进行文件系统的完整备份之外,还可以进行累积备份。第一次备份一定是完整备份。以/boot为例,完整备份在 xfsdump 当中被...

  • linux命令系列-dd

    dd不仅可以原样复制文件,而且可以复制设备。dd指令最大的功效,应该是在于备份! 因为 dd 可以读取磁盘设备的内容,然后将整个设备备份成一个文件!dd if 输入 of 输出 bs b...

  • nginx模块 ngx_http_headers_module

    ngx_http_headers_module 模块是用来增加 Expires 和 Cache-control,或者是任意的响应头。Syntax: add_header name value [alw...

  • nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

    ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --w...

  • nginx模块 ngx_http_flv_module、ngx_http_mp4_module

    ngx_http_flv_module模块提供了对 flv 视频的伪流支持。编译的时候带上 --with-http_flv_module。它会根据指定的 start 参数来指定跳过多少字节,并在返回数...

  • nginx模块 ngx_http_fastcgi_module

    ngx_http_fastcgi_module 模块使得nginx可以与 fastcgi 服务器通信。比如目前要使得 nginx 支持 php 就得使用 fastcgi技术,在服务器上装上 nginx...

  • nginx模块 ngx_http_autoindex_module

    ngx_http_autoindex_module 模块可以将uri以 / 结尾时,列出里面的文件和目录。Syntax: autoindex on | off; Default: autoindex ...

简介
天降大任于斯人也,必先苦其心志。