拍摄快照时,Linux设备映射器映射嵌套在LV中的LVM PV


13

备份我的机器的计划真的搞砸了...

我有一台服务器,该服务器是多个虚拟机的KVM管理程序。其中之一是运行Docker。它在/ dev / vdb上具有其Docker卷,该卷设置为LVM PV,Docker在其上使用direct-lvm驱动程序存储Docker容器数据。该虚拟磁盘是主机本地磁盘上的LVM LV。

主机和来宾都运行Fedora 21。

该卷的主机视图是(仅显示相关卷):

[root@host ~]# lvs
  LV                           VG         Attr       LSize
  docker2.example.com-volumes vm-volumes -wi-ao---- 40.00g
[root@host ~]# dmsetup ls --tree
vm--volumes-docker2.example.com--volumes (253:10)
 └─ (9:125)

访客对此卷的看法是(再次,仅显示相关卷):

[root@docker2 ~]# pvs
  PV         VG             Fmt  Attr PSize  PFree
  /dev/vdb   docker-volumes lvm2 a--  40.00g    0 

对于主机上的所有其他LVM卷,我可以使用制作快照lvcreate --snapshot,备份快照,然后lvremove毫无问题。但是对于这个特定的卷,我无法使用lvremove,因为它正在使用中:

[root@host ~]# lvremove /dev/vm-volumes/snap-docker2.example.com-volumes 
  Logical volume vm-volumes/snap-docker2.example.com-volumes is used by another device.

最终,我发现主机上的设备映射器以某种方式弄清楚了该逻辑卷快照包含LVM PV,然后继续将快照内的逻辑卷映射到主机(仅显示了相关的卷):

[root@host ~]# dmsetup ls --tree
vm--volumes-docker2.example.com--volumes (253:10)
 └─vm--volumes-docker2.example.com--volumes-real (253:14)
    └─ (9:125)
docker--volumes-docker--data (253:18)
 └─vm--volumes-snap--docker2.example.com--volumes (253:16)
    ├─vm--volumes-snap--docker2.example.com--volumes-cow (253:15)
    │  └─ (9:125)
    └─vm--volumes-docker2.example.com--volumes-real (253:14)
       └─ (9:125)
docker--volumes-docker--meta (253:17)
 └─vm--volumes-snap--docker2.example.com--volumes (253:16)
    ├─vm--volumes-snap--docker2.example.com--volumes-cow (253:15)
    │  └─ (9:125)
    └─vm--volumes-docker2.example.com--volumes-real (253:14)
       └─ (9:125)

这些与虚拟机内部的逻辑卷完全对应:

[root@docker2 ~]# lvs
  LV          VG             Attr       LSize
  docker-data docker-volumes -wi-ao---- 39.95g
  docker-meta docker-volumes -wi-ao---- 44.00m

值得注意的是,它不会在系统引导时尝试对LVM LV进行此操作,而仅在拍摄快照时才尝试对LVM LV执行此操作。

这里发生了什么?我真的不希望设备映射器检查LVM快照的内容以查看其中是否有任何内容可以帮我映射。我可以抑制这种行为吗?还是我需要通过其他方法创建快照?

Answers:


8

有时,相关文档隐藏在配置文件中,而不是隐藏在文档中。LVM似乎如此。

默认情况下,只要存在所有PV,并且 lvmetad和udev(或更新的systemd)正在运行,LVM会在引导后自动尝试激活在连接到系统的任何物理设备上的卷。创建LVM快照后,将触发udev事件,并且由于快照包含PV,因此lvmetad会自动运行pvscan,依此类推。

通过查看,/etc/lvm/backup/docker-volumes我能够pvscan通过使用设备的主设备号和次设备号来确定lvmetad已在快照上显式运行,该设备绕过了LVM过滤器,该过滤器通常会阻止这种情况。该文件包含:

description = "Created *after* executing 'pvscan --cache --activate ay 253:13'"

可以通过设置auto_activation_volume_listin 来控制此行为/etc/lvm/lvm.conf。它允许您设置允许自动激活哪些卷组,卷或标签。

因此,我只需将过滤器设置为包含主机的两个卷组即可。其他所有与过滤器都不匹配的项目也不会自动激活。

auto_activation_volume_list = [ "mandragora", "vm-volumes" ]

来宾的LVM卷不再出现在主机上,最后,我的备份正在运行...


4

您想要编辑/etc/lvm/lvm.conf中的'filter'值以仅检查KVM主机上的物理设备;默认值接受“每个块设备”,其中包括LV本身。默认值上方的注释相当全面,比我能更好地解释用法。


请注意,我添加了过滤器,然后pvscan --cache向lvmetad告知新过滤器,pvscan现在说PV被过滤器拒绝了,但问题仍然存在。
迈克尔·汉普顿

我认为您的意思是无法删除快照。在这个阶段,这可能很棘手,我只能提出模糊的建议。如果重启KVM主机是不可能的(我承认这是一种大锤的方法),那么主机上的'lvchange -an / path / to / LV'可能会释放它的保留权。如果不是那样,那么您可能正在尝试各种dmsetup操作来尝试绕过LVM工具。虽然那里毛茸茸,但我不推荐任何特定操作。
Craig Miskell 2015年

该过滤器不执行任何操作,因为lvmetad会响应udev事件显式扫描快照。但是,解决方案却是配置中的其他内容……
Michael Hampton

2

与结合使用时,我遇到了大致相同的问题vgimportclone。有时会失败:

  WARNING: Activation disabled. No device-mapper interaction will be attempted.
  Physical volume "/tmp/snap.iwOkcP9B/vgimport0" changed
  1 physical volume changed / 0 physical volumes not changed
  WARNING: Activation disabled. No device-mapper interaction will be attempted.
  Volume group "insidevgname" successfully changed
  /dev/myvm-vg: already exists in filesystem
  New volume group name "myvm-vg" is invalid
Fatal: Unable to rename insidevgname to myvm-vg, error: 5

那时,如果我想销毁快照,我首先必须暂时禁用,udev因为https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081中描述的错误

但是即使如此,在看似成功地停用了嵌套LVM的卷组之后,由kpartx方式创建的嵌套PV的分区映射仍然以某种方式使用。

技巧似乎是,设备映射器使用旧的卷组名称保留了一个额外的父映射,例如在树形列表中:

insidevgname-lvroot (252:44)
 └─outsidevgname-myvm--root-p2 (252:43)
    └─outsidevgname-myvm--root (252:36)

解决方案是使用删除该特定映射dmsetup remove insidevgname-lvroot。在那之后,kpartx -dlvremove正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.