layout: post
title: LVM卷管理
date: 2017-12-11
tags: [“Linux”,”磁盘管理”]


一、LVM是做什么的

LVM ( Logical Volume Manager ,逻辑卷管理器)LVM 是建立在磁盘和分区之上的一个逻辑层,用来提高磁盘分区管理的灵活性。LVM 可以对磁盘分区按照组的方式进行命名、管理和分配。LVM 最早源于IBM 的AIX 系统

LVM 术语:

  1. Physical Volume(PV)
    实际分区需要调整System ID 成为LVM 表示(8e) ,然后经过pvcreate 命令将他转为LVM 最低层的PV, 然后才能使用磁盘。

  2. Volume Group(VG)
    将PV 整合成为一起即为VG

  3. Physical Extent(PE)
    LVM 预设使用4MB 的PE 区块,每个LV 最多允许有65534 个PE ,即256GB 。PE 属于LVM 最小寻址单元(PE单位的大小可以在划分创建vg时定义)

  4. Logical Volume(LV)
    VG 将被分割为若干LV , LV 的大小受到PE 的限制,大小不能超过PE大小*PE数。

  5. Logical Extent(LE)

LE等于PE

我们现在用的LVM是VERSION2版本 ,VERSION1就不讨论了。

二、LVM的操作

1、至少两个分区或磁盘
2、创建pv
pvcreate /dev/sd{b1,c} 创建pv
pvs 查看当前创建好的pv
pvdisplay 显示pv的详细信息,比pvs详细
3、创建卷组
vgcreate -s 16M vg0(卷组名) /dev/sd{b1,c} #-s 指定PE大小[kMGT] vg0 卷组名(没有则创建) /dev/sd{b1,c} 指定的pv
pvdisplay 查看现在pv的详细信息
vgdisplay 查看卷组的详细信息 (vg也有vgs和pvs类似)
vgchange -an vg0 禁用vg (现在其实没有用处,因为,还没有划分逻辑卷)
vgchange -ay vg0 启用vg
4、创建逻辑卷
lvcreate -n lv0 -L (16G) -l (PE个数) vg0 #-l 和 -L 连个2选一,两种分配单位 -n表示指定lv的名字 -l 后面也可以这样玩儿 : -l +100%FREE 表示所有剩余空间
lvdisplay 查看逻辑卷的详细信息,当然也有vgs
5、扩展vg
pvcreate /dev/sdc1 先创建新的pv
vgextend vg0 /dev/sdc1 将sdc1添加进vg0中
6、扩展lv
lvextend -L 24G’+24G -l +320’1599 +100%FREE /dev/vg0/lv0 # 和lvcreate 的参数类似, -L 24G’+24G 24G表示扩展到24G ,+24G表示增加24G的空间 ,-l同理
7、扩展lv的文件系统
resize2fs /dev/vg0/lv0 #也可以在lvextend的时候使用-r选项,在扩展完之后,同时扩展文件系统

8、有时候空间剩余,可以移除pv,可以使用pe迁移命令
pvmove /dev/sdc1 但是需要注意一个问题,那就是,vg的剩余可用空间小于要迁移的pv空间,那么将无法迁移pe
vgreduce vg0 /dev/sdc1 将该pv从卷组中删除
pvremove /dev/sdc1 清除pv标签

9、迁移LV到新主机
vgrename vg0 vg100 将vg0 改为vg100 ,相对的PV对应的vg也就改了
lvrename /dev/vg100/lv2 lv100
umount lv 挂载点
vgchange -an 禁用vg
vgexport vg100 将vg100设置成导出状态
vgdisplay 查看vgstat
pvdisplay 查看pvstat
拔出硬盘
插入硬盘 ,这是系统扫描,可以查找到导出状态的pv
vgimport /dev/新磁盘
vg -ay /dev/

10 LV的快照
原理:快照内只保存修改过的数据,且为创建快照后最早未改变时的数据
快照,实际也是一个逻辑卷
lvcreate -n lv0-snapshot -L 1G -s -p r /dev/vg0/lv0 # -L: 指定大小 -s:表示这是一个快照 -p r :表示只读,防止误修改 /dev/vg0/lv0: 表明对谁做快照
##当使用 “-p r “选项时ext4系统支持直接将快照挂载到目录上,而xfs文件系统则需要在挂载时指定 两个特殊选项 —nouuid —norecovery

还原数据:
第一步,先取消挂载
umount /mnt/lv0
第二部,还原
lvconvert —merge /dev/vg0/lv0-snapshot
第三部,挂载回去
mount /dev/vg0/lv0 /mnt/lv0

三、LVM实验

实验1:创建PV、VG、LV

1、创建PV

  1. [root@joker-7-01 ~]# pvcreate /dev/sdc
  2. Physical volume "/dev/sdc" successfully created.
  3. [root@joker-7-01 ~]# pvcreate /dev/sdd
  4. Physical volume "/dev/sdd" successfully created.
  5. [root@joker-7-01 ~]# pvcreate /dev/sde
  6. Physical volume "/dev/sde" successfully created.
  7. [root@joker-7-01 ~]# pvcreate /dev/sdf
  8. Physical volume "/dev/sdf" successfully created.

使用4块磁盘创建pv成功。现在我们查看一下pv信息

  1. [root@joker-7-01 ~]# pvs
  2. PV VG Fmt Attr PSize PFree
  3. /dev/sda2 centos_joker-7-01 lvm2 a-- 72.00g 4.00m
  4. /dev/sdc lvm2 --- 5.00g 5.00g
  5. /dev/sdd lvm2 --- 5.00g 5.00g
  6. /dev/sde lvm2 --- 5.00g 5.00g
  7. /dev/sdf lvm2 --- 5.00g 5.00g
  8. [root@joker-7-01 ~]# pvdisplay
  9. --- Physical volume ---
  10. PV Name /dev/sda2
  11. VG Name centos_joker-7-01
  12. PV Size <72.01 GiB / not usable 4.00 MiB
  13. Allocatable yes
  14. PE Size 4.00 MiB
  15. Total PE 18433
  16. Free PE 1
  17. Allocated PE 18432
  18. PV UUID MJg0Bw-yPYJ-LXUA-iznM-Lq5v-9jC0-VujSGa
  19.  
  20. "/dev/sdf" is a new physical volume of "5.00 GiB"
  21. --- NEW Physical volume ---
  22. PV Name /dev/sdf
  23. VG Name
  24. PV Size 5.00 GiB
  25. Allocatable NO
  26. PE Size 0
  27. Total PE 0
  28. Free PE 0
  29. Allocated PE 0
  30. PV UUID XaW65c-FZOz-pre2-qQD2-LrEM-7HBg-UcQE2c
  31.  
  32. "/dev/sdd" is a new physical volume of "5.00 GiB"
  33. --- NEW Physical volume ---
  34. PV Name /dev/sdd
  35. VG Name
  36. PV Size 5.00 GiB
  37. Allocatable NO
  38. PE Size 0
  39. Total PE 0
  40. Free PE 0
  41. Allocated PE 0
  42. PV UUID pS1YKM-F4hH-rAz7-gM33-VcZc-PPL2-9zaZeQ
  43.  
  44. "/dev/sde" is a new physical volume of "5.00 GiB"
  45. --- NEW Physical volume ---
  46. PV Name /dev/sde
  47. VG Name
  48. PV Size 5.00 GiB
  49. Allocatable NO
  50. PE Size 0
  51. Total PE 0
  52. Free PE 0
  53. Allocated PE 0
  54. PV UUID JmDYTP-199p-ftcV-wqkV-m3jE-nHxz-inVOtN
  55.  
  56. "/dev/sdc" is a new physical volume of "5.00 GiB"
  57. --- NEW Physical volume ---
  58. PV Name /dev/sdc
  59. VG Name
  60. PV Size 5.00 GiB
  61. Allocatable NO
  62. PE Size 0
  63. Total PE 0
  64. Free PE 0
  65. Allocated PE 0
  66. PV UUID iqKlpg-oA4Y-6e33-7EGl-wr7u-uAM1-ZeY5Ef

由以上可以看出pvs只会显示简短的pv信息,而pvdisplay将会显示更多。pvdisplay中第一条pv信息是有关centos7系统的,这么我们暂时不关注,先看我们的实验。我们可以注意到,pvdisplay中PEsize的值是0,这是因为还没有按单位把pv划分给vg。

2、创建VG

  1. [root@joker-7-01 ~]# vgs
  2. VG #PV #LV #SN Attr VSize VFree
  3. centos_joker-7-01 1 3 0 wz--n- 72.00g 4.00m
  4. vg_test 4 0 0 wz--n- <19.94g <19.94g
  5. [root@joker-7-01 ~]# vgdisplay vg_test
  6. --- Volume group ---
  7. VG Name vg_test
  8. System ID
  9. Format lvm2
  10. Metadata Areas 4
  11. Metadata Sequence No 1
  12. VG Access read/write
  13. VG Status resizable
  14. MAX LV 0
  15. Cur LV 0
  16. Open LV 0
  17. Max PV 0
  18. Cur PV 4
  19. Act PV 4
  20. VG Size <19.94 GiB
  21. PE Size 16.00 MiB
  22. Total PE 1276
  23. Alloc PE / Size 0 / 0
  24. Free PE / Size 1276 / <19.94 GiB
  25. VG UUID JmvDcD-ltUK-HTXF-3Aue-YBQj-tjgK-h0NTVF

vgdisplay不加残水会显示所有的vg信息,我们就只显示刚才创建的vg信息就好了。

我们再来看一下刚刚创建的pv的信息

  1. [root@joker-7-01 ~]# pvdisplay
  2. --- Physical volume ---
  3. PV Name /dev/sdc
  4. VG Name vg_test
  5. PV Size 5.00 GiB / not usable 16.00 MiB
  6. Allocatable yes
  7. PE Size 16.00 MiB
  8. Total PE 319
  9. Free PE 319
  10. Allocated PE 0
  11. PV UUID iqKlpg-oA4Y-6e33-7EGl-wr7u-uAM1-ZeY5Ef
  12.  
  13. --- Physical volume ---
  14. PV Name /dev/sdd
  15. VG Name vg_test
  16. PV Size 5.00 GiB / not usable 16.00 MiB
  17. Allocatable yes
  18. PE Size 16.00 MiB
  19. Total PE 319
  20. Free PE 319
  21. Allocated PE 0
  22. PV UUID pS1YKM-F4hH-rAz7-gM33-VcZc-PPL2-9zaZeQ
  23.  
  24. --- Physical volume ---
  25. PV Name /dev/sde
  26. VG Name vg_test
  27. PV Size 5.00 GiB / not usable 16.00 MiB
  28. Allocatable yes
  29. PE Size 16.00 MiB
  30. Total PE 319
  31. Free PE 319
  32. Allocated PE 0
  33. PV UUID JmDYTP-199p-ftcV-wqkV-m3jE-nHxz-inVOtN
  34.  
  35. --- Physical volume ---
  36. PV Name /dev/sdf
  37. VG Name vg_test
  38. PV Size 5.00 GiB / not usable 16.00 MiB
  39. Allocatable yes
  40. PE Size 16.00 MiB
  41. Total PE 319
  42. Free PE 319
  43. Allocated PE 0
  44. PV UUID XaW65c-FZOz-pre2-qQD2-LrEM-7HBg-UcQE2c
  45.  
  46. --- Physical volume ---
  47. PV Name /dev/sda2
  48. VG Name centos_joker-7-01
  49. PV Size <72.01 GiB / not usable 4.00 MiB
  50. Allocatable yes
  51. PE Size 4.00 MiB
  52. Total PE 18433
  53. Free PE 1
  54. Allocated PE 18432
  55. PV UUID MJg0Bw-yPYJ-LXUA-iznM-Lq5v-9jC0-VujSGa

PV的PEsize已经变成了16M

4、创建逻辑卷lv

  1. [root@joker-7-01 ~]# lvcreate -n lv_test_01 -L 15G vg_test
  2. Logical volume "lv_test_01" created.
  3. [root@joker-7-01 ~]# lvs vg_test
  4. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  5. lv_test_01 vg_test -wi-a----- 15.00g
  6. [root@joker-7-01 ~]# lvdisplay lv_test_01
  7. --- Logical volume ---
  8. LV Path /dev/vg_test/lv_test_01
  9. LV Name lv_test_01
  10. VG Name vg_test
  11. LV UUID 8gqqqe-qrjN-9T4h-wBWg-j7jC-sPuT-24megs
  12. LV Write Access read/write
  13. LV Creation host, time joker-7-01, 2017-12-11 19:50:43 +0800
  14. LV Status available
  15. # open 0
  16. LV Size 15.00 GiB
  17. Current LE 960
  18. Segments 4
  19. Allocation inherit
  20. Read ahead sectors auto
  21. - currently set to 8192
  22. Block device 253:3
  23.  

第一条命令创建lv成功。

第二条命令lvs显示所有的lv简短信息。我们创建的lv_test_01已经成功出现了,15g的大小。

第三条命令详细显示lv_test_01信息,该lv有960个LE(PE)构成,总共的LV大小为15G,available状态(LE=PE,PE是最小的寻址单元)

5、为lv创建文件系统,并挂载使用

  1. [root@joker-7-01 ~]# mkfs.ext4 /dev/vg_test/lv_test_01
  2. mke2fs 1.42.9 (28-Dec-2013)
  3. 文件系统标签=
  4. OS type: Linux
  5. 块大小=4096 (log=2)
  6. 分块大小=4096 (log=2)
  7. Stride=0 blocks, Stripe width=0 blocks
  8. 983040 inodes, 3932160 blocks
  9. 196608 blocks (5.00%) reserved for the super user
  10. 第一个数据块=0
  11. Maximum filesystem blocks=2151677952
  12. 120 block groups
  13. 32768 blocks per group, 32768 fragments per group
  14. 8192 inodes per group
  15. Superblock backups stored on blocks:
  16. 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
  17.  
  18. Allocating group tables: 完成
  19. 正在写入inode表: 完成
  20. Creating journal (32768 blocks): 完成
  21. Writing superblocks and filesystem accounting information: 完成
  22.  
  23. [root@joker-7-01 ~]# mount /dev/vg_test/lv_test_01 /mnt
  24.  
  25. [root@joker-7-01 /]# cd /dev/vg_test/
  26. [root@joker-7-01 vg_test]# ll
  27. 总用量 0
  28. lrwxrwxrwx 1 root root 7 12 11 19:58 lv_test_01 -> ../dm-3
  29. [root@joker-7-01 vg_test]#

我们使用ext4系统,格式化lv,并成功挂载到了mnt,由最后的操作,可以明确的看出,/dev/vg_test/lv_test_01 实际是/dev/dm-3的软连接

实验二:扩容、缩减vg、lv、pv

1、扩展vg和lv

  1. [root@joker-7-01 vg_test]# vgs
  2. VG #PV #LV #SN Attr VSize VFree
  3. centos_joker-7-01 1 3 0 wz--n- 72.00g 4.00m
  4. vg_test 4 1 0 wz--n- <19.94g <4.94g #可用空间5g
  5. [root@joker-7-01 vg_test]# pvcreate /dev/sdg
  6. Physical volume "/dev/sdg" successfully created.
  7. [root@joker-7-01 vg_test]# vgextend /dev/sdg
  8. No command with matching syntax recognised. Run 'vgextend --help' for more information.
  9. Correct command syntax is: #语法打错了
  10. vgextend VG PV ... #正确的语法
  11.  
  12. [root@joker-7-01 vg_test]# vgextend vg_test /dev/sdg
  13. Volume group "vg_test" successfully extended
  14. [root@joker-7-01 vg_test]# vgs
  15. VG #PV #LV #SN Attr VSize VFree
  16. centos_joker-7-01 1 3 0 wz--n- 72.00g 4.00m
  17. vg_test 5 1 0 wz--n- 24.92g 9.92g #扩展成功,变成了10g
  18. [root@joker-7-01 vg_test]# lvextend -L +5G -r /dev/vg_test/lv_test_01 #扩展lv -r选项,在扩展空间的之后,把文件系统也扩展了。
  19. Size of logical volume vg_test/lv_test_01 changed from 15.00 GiB (960 extents) to 20.00 GiB (1280 extents).
  20. Logical volume vg_test/lv_test_01 successfully resized. #扩展成功
  21. [root@joker-7-01 vg_test]# lvs vg_test
  22. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  23. lv_test_01 vg_test -wi-ao---- 20.00g #lv的空间扩展成功

lv空间扩展成功,当vg空间不足时,需要先扩展vg,然后才能扩展lv,因为lv的空间是从vg中划分出去的。

2、缩减vg、lv、移除pv

(1)先说缩减lv,逻辑卷的大小可以减小,也可以增加。 但是,在缩小卷本身之前,请记住缩小文件系统的大小或存在于卷中的任何文件是非常重要的,否则可能会丢失数据。

主要步骤:

  umount设备

  缩减文件系统大小

  缩减lv大小

  恢复挂载设备

  1. [root@joker-7-01 vg_test]# umount /mnt #取消lv的挂载
  1. [root@joker-7-01 vg_test]# resize2fs /dev/vg_test/lv_test_01 2G #缩减lv到2g空间
  2. resize2fs 1.42.9 (28-Dec-2013)
  3. 请先运行 'e2fsck -f /dev/vg_test/lv_test_01'. #不让缩减,提示必须先要检测文件系统,这里要注意,一定要确保,文件系统的数据存放,缩减是一个非常危险的动作,无法挽回。如果能迁移,尽量迁移,确保数据的完整不丢失。
  4.  
  5. [root@joker-7-01 vg_test]# e2fsck -f /dev/vg_test/lv_test_01 #检测文件系统
  6. e2fsck 1.42.9 (28-Dec-2013)
  7. 第一步: 检查inode,块,和大小
  8. 第二步: 检查目录结构
  9. 3步: 检查目录连接性
  10. Pass 4: Checking reference counts
  11. 5步: 检查簇概要信息
  12. /dev/vg_test/lv_test_01: 11/1376256 files (0.0% non-contiguous), 130423/5505024 blocks #检测完成,没有问题
  13. [root@joker-7-01 vg_test]# resize2fs /dev/vg_test/lv_test_01 2G #重新执行缩减lv
  14. resize2fs 1.42.9 (28-Dec-2013)
  15. Resizing the filesystem on /dev/vg_test/lv_test_01 to 524288 (4k) blocks.
  16. The filesystem on /dev/vg_test/lv_test_01 is now 524288 blocks long. #文件系统缩减成功
  17.  
  18. [root@joker-7-01 vg_test]#
  1. [root@joker-7-01 vg_test]# mount /dev/vg_test/lv_test_01 /mnt #重新挂在lv
  2. [root@joker-7-01 vg_test]# df -h
  3. 文件系统 容量 已用 可用 已用% 挂载点
  4. /dev/mapper/centos_joker--7--01-root 50G 7.1G 43G 15% /
  5. devtmpfs 473M 0 473M 0% /dev
  6. tmpfs 489M 0 489M 0% /dev/shm
  7. tmpfs 489M 7.1M 482M 2% /run
  8. tmpfs 489M 0 489M 0% /sys/fs/cgroup
  9. /dev/sda1 1014M 159M 856M 16% /boot
  10. /dev/mapper/centos_joker--7--01-app 20G 33M 20G 1% /app
  11. tmpfs 98M 0 98M 0% /run/user/0
  12. /dev/mapper/vg_test-lv_test_01 1.9G 25M 1.8G 2% /mnt #文件系统已经缩减到了2G
  13. [root@joker-7-01 vg_test]# umount /mnt #重新卸载

现在缩减lv的大小,我使用lvreduce命令,lvresize也可以实现,但是这个命令我不太熟,也不想用,能实现功能就好了。

  1. [root@joker-7-01 vg_test]# lvreduce -L 2G /dev/vg_test/lv_test_01 # 缩减到2G
  2. WARNING: Reducing active logical volume to 2.00 GiB.
  3. THIS MAY DESTROY YOUR DATA (filesystem etc.)
  4. Do you really want to reduce vg_test/lv_test_01? [y/n]: y # 提示是缩减到2G,如果生产中一定要缩减lv,那么让别人执行(死道友不死贫道),如果非要自己执行,那么咱们就迁移数据吧。
  5. Size of logical volume vg_test/lv_test_01 changed from 21.00 GiB (1344 extents) to 2.00 GiB (128 extents).
  6. Logical volume vg_test/lv_test_01 successfully resized. #缩减成功
  1. [root@joker-7-01 vg_test]# lvs
  2. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  3. app centos_joker-7-01 -wi-ao---- 20.00g
  4. root centos_joker-7-01 -wi-ao---- 50.00g
  5. swap centos_joker-7-01 -wi-ao---- 2.00g
  6. lv_test_01 vg_test -wi-a----- 2.00g #已经缩减到了2G

(2)缩减vg

  1. [root@joker-7-01 vg_test]# vgs
  2. VG #PV #LV #SN Attr VSize VFree
  3. centos_joker-7-01 1 3 0 wz--n- 72.00g 4.00m
  4. vg_test 5 1 0 wz--n- 24.92g 22.92g
  5. [root@joker-7-01 vg_test]# pvs
  6. PV VG Fmt Attr PSize PFree
  7. /dev/sda2 centos_joker-7-01 lvm2 a-- 72.00g 4.00m
  8. /dev/sdc vg_test lvm2 a-- 4.98g 2.98g #我们做实验的磁盘只有/dev/sdc现在占用着空间,其余4块均为空闲
  9. /dev/sdd vg_test lvm2 a-- 4.98g 4.98g
  10. /dev/sde vg_test lvm2 a-- 4.98g 4.98g
  11. /dev/sdf vg_test lvm2 a-- 4.98g 4.98g
  12. /dev/sdg vg_test lvm2 a-- 4.98g 4.98g

现在我们将sdd、sde、sdf三块pv移除掉

  1. [root@joker-7-01 vg_test]# vgreduce vg_test /dev/sdf #从vg_test组移除/dev/sdf这个pv
  2. Removed "/dev/sdf" from volume group "vg_test"
  3. [root@joker-7-01 vg_test]# vgreduce vg_test /dev/sde
  4. Removed "/dev/sde" from volume group "vg_test"
  5. [root@joker-7-01 vg_test]# vgreduce vg_test /dev/sdd
  6. Removed "/dev/sdd" from volume group "vg_test"
  1. [root@joker-7-01 vg_test]# pvs
  2. PV VG Fmt Attr PSize PFree
  3. /dev/sda2 centos_joker-7-01 lvm2 a-- 72.00g 4.00m
  4. /dev/sdc vg_test lvm2 a-- 4.98g 2.98g 可以看出vg_test 内现在只有两个pv
  5. /dev/sdd lvm2 --- 5.00g 5.00g
  6. /dev/sde lvm2 --- 5.00g 5.00g
  7. /dev/sdf lvm2 --- 5.00g 5.00g
  8. /dev/sdg vg_test lvm2 a-- 4.98g 4.98g

(3)现在我们移除刚刚移出的pv

  1. [root@joker-7-01 vg_test]# pvremove /dev/sdd
  2. Labels on physical volume "/dev/sdd" successfully wiped.
  3. [root@joker-7-01 vg_test]# pvremove /dev/sd{e,f}
  4. Labels on physical volume "/dev/sde" successfully wiped.
  5. Labels on physical volume "/dev/sdf" successfully wiped.
  6. [root@joker-7-01 vg_test]# pvs
  7. PV VG Fmt Attr PSize PFree
  8. /dev/sda2 centos_joker-7-01 lvm2 a-- 72.00g 4.00m
  9. /dev/sdc vg_test lvm2 a-- 4.98g 2.98g
  10. /dev/sdg vg_test lvm2 a-- 4.98g 4.98g
  11.  
  12. #成功移除

实验三:VG的数据迁移

首先确保迁移的目的地主机上vg和lv的名不能和迁移的vg和lv名字重复,否则会报错,迁移前可以先将vg和lv的名字更改.

  1. [root@joker-7-01 vg_test]# lvrename /dev/vg_test/lv_test_01 lv001
  2. Renamed "lv_test_01" to "lv001" in volume group "vg_test"
  3. [root@joker-7-01 vg_test]# vgrename vg_test vg001
  4. Volume group "vg_test" successfully renamed to "vg001"

实验步骤:

取消lv的挂载

禁用vg

将vg设置成导出状态

关闭虚拟机,移除磁盘

再把移除的磁盘添加回来

扫描vg,并把vg启用

  1. umount /mnt
  2. [root@joker-7-01 vg_test]# pvs #可以看出vg001有一个pv是空着的,如果要迁移vg尽量把空磁盘剔除
  3. PV VG Fmt Attr PSize PFree
  4. /dev/sda2 centos_joker-7-01 lvm2 a-- 72.00g 4.00m
  5. /dev/sdc vg001 lvm2 a-- 4.98g 2.98g
  6. /dev/sdg vg001 lvm2 a-- 4.98g 4.98g
  1. [root@joker-7-01 vg_test]# vgreduce vg001 /dev/sdg
  2. Removed "/dev/sdg" from volume group "vg001" #剔除/dev/sdg
  3. [root@joker-7-01 vg_test]# pvremove /dev/sdg
  4. Labels on physical volume "/dev/sdg" successfully wiped.

如果lv占用了多个pv的空间,可以将pv中的数据集中移动到一起,已腾出空的pv,节省磁盘使用pvmove src_disk dist_disk 命令

禁用vg,并设置成导出状态

  1. [root@joker-7-01 vg_test]# vgchange -an vg001 #导出前必须先禁用vg
  2. 0 logical volume(s) in volume group "vg001" now active
  3. [root@joker-7-01 vg_test]# vgexport vg001 #导出成功
  4. Volume group "vg001" successfully exported
  这是vg导出后的状态
  1. [root@joker-7-01 vg_test]# vgdisplay vg001
  2. --- Volume group ---
  3. VG Name vg001
  4. System ID
  5. Format lvm2
  6. Metadata Areas 1
  7. Metadata Sequence No 13
  8. VG Access read/write
  9. VG Status exported/resizable #有标识导出
  10. MAX LV 0
  11. Cur LV 1
  12. Open LV 0
  13. Max PV 0
  14. Cur PV 1
  15. Act PV 1
  16. VG Size 4.98 GiB
  17. PE Size 16.00 MiB
  18. Total PE 319
  19. Alloc PE / Size 128 / 2.00 GiB
  20. Free PE / Size 191 / 2.98 GiB
  21. VG UUID JmvDcD-ltUK-HTXF-3Aue-YBQj-tjgK-h0NTVF
  22.  
  23. [root@joker-7-01 vg_test]# pvdisplay
  24. Physical volume "/dev/sdc" of volume group "vg001" is exported
  25. --- Physical volume ---
  26. PV Name /dev/sdc
  27. VG Name vg001 (exported) #pv的状态
  28. PV Size 5.00 GiB / not usable 16.00 MiB
  29. Allocatable yes
  30. PE Size 16.00 MiB
  31. Total PE 319
  32. Free PE 191
  33. Allocated PE 128
  34. PV UUID iqKlpg-oA4Y-6e33-7EGl-wr7u-uAM1-ZeY5Ef
  现在将磁盘再vmware内导出,然后再导入
  1. [root@joker-7-01 vg_test]# partprobe # 将磁盘移除,然后重新读一下分区表
  2. [root@joker-7-01 vg_test]# lsblk #显示现有的磁盘,vg的磁盘已经被导出去了
  3. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  4. sda 8:0 0 200G 0 disk
  5. ├─sda1 8:1 0 1G 0 part /boot
  6. └─sda2 8:2 0 72G 0 part
  7. ├─centos_joker--7--01-root 253:0 0 50G 0 lvm /
  8. ├─centos_joker--7--01-swap 253:1 0 2G 0 lvm [SWAP]
  9. └─centos_joker--7--01-app 253:2 0 20G 0 lvm /app
  10. sdb 8:16 0 20G 0 disk
  11. ├─sdb1 8:17 0 3G 0 part
  12. ├─sdb2 8:18 0 3G 0 part /mnt/ext4
  13. └─sdb3 8:19 0 3G 0 part /mnt/xfs
  14. sr0 11:0 1 1024M 0 rom
  1. [root@joker-7-01 vg_test]# vgs #已经没有vg001了
  2. VG #PV #LV #SN Attr VSize VFree
  3. centos_joker-7-01 1 3 0 wz--n- 72.00g 4.00m
  我们再把vg那块磁盘拿回来,重新加入到虚拟机内
  1. [root@joker-7-01 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan
  2. [root@joker-7-01 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan
  3. [root@joker-7-01 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan
  4. [root@joker-7-01 ~]# partprobe
  5. ##如果上述不能读出磁盘,那就重启电脑吧,正常的线上环境会自动识别的
  1. [root@joker-7-01 ~]# pvscan #查看系统上的所有pv
  2. PV /dev/sda2 VG centos_joker-7-01 lvm2 [72.00 GiB / 4.00 MiB free]
  3. PV /dev/sdc is in exported VG vg_test [5.98 GiB / 1008.00 MiB free]
  4. Total: 2 [<77.99 GiB] / in use: 2 [<77.99 GiB] / in no VG: 0 [0 ]
已经搜索到了那块pv
  1. [root@joker-7-01 ~]# vgscan #查看系统上的所有vg
  2. Reading volume groups from cache.
  3. Found volume group "centos_joker-7-01" using metadata type lvm2
  4. Found exported volume group "vg_test" using metadata type lvm2
使用vgscan可以看出已经读取到了vg_test且为导出状态
  1. [root@joker-7-01 ~]# vgimport vg_test #导入vg
  2. Volume group "vg_test" successfully imported
  3. [root@joker-7-01 ~]# vgs
  4. VG #PV #LV #SN Attr VSize VFree
  5. centos_joker-7-01 1 3 0 wz--n- 72.00g 4.00m
  6. vg_test 1 1 0 wz--n- 5.98g 1008.00m
  7. [root@joker-7-01 ~]# lvs
  8. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  9. app centos_joker-7-01 -wi-ao---- 20.00g
  10. root centos_joker-7-01 -wi-ao---- 50.00g
  11. swap centos_joker-7-01 -wi-ao---- 2.00g
  12. lv_test_01 vg_test -wi------- 5.00g
  13. [root@joker-7-01 ~]# vgchange -ay vg_test
  14. 1 logical volume(s) in volume group "vg_test" now active #激活vg
  15. [root@joker-7-01 ~]# mount /dev/vg_test/lv_test_01 /mnt #lv可用了

实验四:lv的快照,创建、挂载、还原

首先说一下理论,什么是lv的快照:快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据集临时拷贝以及其它操作来说,快照是最合适的选择。

快照的特性:

  1. 快照只有在它们和原来的逻辑卷不同时才会消耗空间
  2. 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
  3. 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中。
  4. 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
  5. 建立快照的卷大小只需要原始逻辑卷的15%~20%就够了,也可以使用lvextend放大快照
  6. 快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享
  7. 由于快照区与原本的LV共用很多PE的区块,因此快照去与被快照的LV必须在同一个VG.系统恢复的时候的文件数量不能高于快照区的实际容量
     

 

  1. [root@joker-7-01 mnt]# lsblk
  2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  3. sda 8:0 0 200G 0 disk
  4. ├─sda1 8:1 0 1G 0 part /boot
  5. └─sda2 8:2 0 72G 0 part
  6. ├─centos_joker--7--01-root 253:0 0 50G 0 lvm /
  7. ├─centos_joker--7--01-swap 253:1 0 2G 0 lvm [SWAP]
  8. └─centos_joker--7--01-app 253:2 0 20G 0 lvm /app
  9. sdb 8:16 0 20G 0 disk
  10. ├─sdb1 8:17 0 3G 0 part
  11. ├─sdb2 8:18 0 3G 0 part /mnt/ext4
  12. └─sdb3 8:19 0 3G 0 part /mnt/xfs
  13. sdc 8:32 0 6G 0 disk
  14. ├─vg_test-lv_test_01-real 253:4 0 5G 0 lvm
  15. ├─vg_test-lv_test_01 253:3 0 5G 0 lvm /mnt #lv已经挂载在mnt下
  16. └─vg_test-lv_test_01_snapshot 253:6 0 5G 1 lvm
  17. └─vg_test-lv_test_01_snapshot-cow 253:5 0 1008M 1 lvm
  18. └─vg_test-lv_test_01_snapshot 253:6 0 5G 1 lvm
  19. sr0 11:0 1 1024M 0 rom
  20. [root@joker-7-01 mnt]# touch 1111 #我们创建一个文件
  21. [root@joker-7-01 mnt]# ll
  22. 总用量 0
  23. -rw-r--r-- 1 root root 0 12 12 20:16 1111

创建快照:

  1. [root@joker-7-01 ~]# lvcreate -s -L 1007M -n lv_test_01_snapshot -p r /dev/vg_test/lv_test_01 #快照创建成功(注意xfs文件系统不支持-p r选项)
  2. Using default stripesize 64.00 KiB.
  3. Rounding up size to full physical extent 1008.00 MiB
  4. Logical volume "lv_test_01_snapshot" created.

现在挂载快照

  1. [root@joker-7-01 mnt]# mount /dev/vg_test/lv_test_01_snapshot /data
  2. mount: /dev/mapper/vg_test-lv_test_01_snapshot 写保护,将以只读方式挂载
  3. [root@joker-7-01 /]# cd /data
  4. [root@joker-7-01 data]# ll
  5. 总用量 0
  6. -rw-r--r-- 1 root root 0 12 12 20:16 1111
  7.  

刚才创建的文件,现在恢复快照,我们现在lv中创建一个新的文件,然后用快照恢复回去:

  1. [root@joker-7-01 /]# lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sda 8:0 0 200G 0 disk
    ├─sda1 8:1 0 1G 0 part /boot
    └─sda2 8:2 0 72G 0 part
    ├─centosjoker701-root 253:0 0 50G 0 lvm /
    ├─centos_joker701-swap 253:1 0 2G 0 lvm [SWAP]
    └─centos_joker701-app 253:2 0 20G 0 lvm /app
    sdb 8:16 0 20G 0 disk
    ├─sdb1 8:17 0 3G 0 part
    └─vg_test-lv_03_snapshot-cow 253:5 0 1G 1 lvm
    └─vg_test-lv_03_snapshot 253:6 0 5G 1 lvm /mnt
    ├─sdb2 8:18 0 3G 0 part /mnt/ext4
    └─sdb3 8:19 0 3G 0 part /mnt/xfs
    sdc 8:32 0 6G 0 disk
    └─vg_test-lv_test_01-real 253:4 0 5G 0 lvm
    ├─vg_test-lv_test_01 253:3 0 5G 0 lvm /mnt
    └─vg_test-lv_03_snapshot 253:6 0 5G 1 lvm /mnt
    sr0 11:0 1 1024M 0 rom
    [root@joker-7-01 /]# umount /mnt #卸载快照的挂载
    [root@joker-7-01 /]# mount /dev/vg_test/lv

    lv03_snapshot lv_test_01
    [root@joker-7-01 /]# mount /dev/vg_test/lv_test_01 /mnt #挂载lv到mnt下
    mount: /dev/mapper/vg_test-lv_test_01 已经挂载或 /mnt
    /dev/mapper/vg_test-lv_test_01 已经挂载到 /mnt
    [root@joker-7-01 /]# lslbk
    -bash: lslbk: 未找到命令
    [root@joker-7-01 /]# lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sda 8:0 0 200G 0 disk
    ├─sda1 8:1 0 1G 0 part /boot
    └─sda2 8:2 0 72G 0 part
    ├─centos_joker701-root 253:0 0 50G 0 lvm /
    ├─centos_joker701-swap 253:1 0 2G 0 lvm [SWAP]
    └─centos_joker701-app 253:2 0 20G 0 lvm /app
    sdb 8:16 0 20G 0 disk
    ├─sdb1 8:17 0 3G 0 part
    └─vg_test-lv_03_snapshot-cow 253:5 0 1G 1 lvm
    └─vg_test-lv_03_snapshot 253:6 0 5G 1 lvm
    ├─sdb2 8:18 0 3G 0 part /mnt/ext4
    └─sdb3 8:19 0 3G 0 part /mnt/xfs
    sdc 8:32 0 6G 0 disk
    └─vg_test-lv_test_01-real 253:4 0 5G 0 lvm
    ├─vg_test-lv_test_01 253:3 0 5G 0 lvm /mnt
    └─vg_test-lv_03_snapshot 253:6 0 5G 1 lvm
    sr0 11:0 1 1024M 0 rom
    [root@joker-7-01 /]# cd /mnt
    [root@joker-7-01 mnt]# ls
    lost+found
    [root@joker-7-01 mnt]# touch 123123123123 #在lv上创建一个文件
    [root@joker-7-01 mnt]# ls
    123123123123 lost+found
    [root@joker-7-01 mnt]# cd ..
    [root@joker-7-01 /]# umount /mnt #取消lv的挂载
    [root@joker-7-01 /]# lvconvert merge /dev/vg_test/lv

    lv03_snapshot lv_test_01
    [root@joker-7-01 /]# lvconvert merge /dev/vg_test/lv

    lv_03_snapshot lv_test_01
    [root@joker-7-01 /]# lvconvert merge /dev/vg_test/lv_03_snapshot #使用快照恢复
    Merging of volume vg_test/lv_03_snapshot started.
    lv_test_01: Merged: 100.00%

  2. [root@joker-7-01 /]# mount /dev/vg_test/lv_test_01 /mnt #将恢复的lv挂载到mnt上
    [root@joker-7-01 /]# lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sda 8:0 0 200G 0 disk
    ├─sda1 8:1 0 1G 0 part /boot
    └─sda2 8:2 0 72G 0 part
    ├─centos_joker701-root 253:0 0 50G 0 lvm /
    ├─centos_joker701-swap 253:1 0 2G 0 lvm [SWAP]
    └─centos_joker701-app 253:2 0 20G 0 lvm /app
    sdb 8:16 0 20G 0 disk
    ├─sdb1 8:17 0 3G 0 part
    ├─sdb2 8:18 0 3G 0 part /mnt/ext4
    └─sdb3 8:19 0 3G 0 part /mnt/xfs
    sdc 8:32 0 6G 0 disk
    └─vg_test-lv_test_01 253:3 0 5G 0 lvm /mnt
    sr0 11:0 1 1024M 0 rom
    [root@joker-7-01 /]# cd /mnt
    [root@joker-7-01 mnt]# ls #确认已经恢复了,刚刚创建的文件已经消失了
    lost+found


 

 

文档更新时间: 2018-12-13 18:02   作者:张尚