这真是搞乱了我备份这台机器的计划......
我有一台服务器,它是多个虚拟机的 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)
这些与 VM 内的逻辑卷完全对应:
[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 快照的内容以查看其中是否有任何内容无法为我映射。我可以抑制这种行为吗?还是我需要通过其他方法创建快照?
有时相关文档隐藏在配置文件中,而不是文档中。所以它似乎与LVM。
默认情况下,LVM 将自动尝试在启动后连接到系统的任何物理设备上激活卷,只要所有 PV 都存在,并且lvmetad 和 udev(或最近的 systemd)正在运行。创建 LVM 快照时,会触发 udev 事件,并且由于快照包含 PV,lvmetad 会自动运行
pvscan
,依此类推。通过查看,
/etc/lvm/backup/docker-volumes
我能够确定 lvmetad 已pvscan
通过使用设备主要和次要编号明确地在快照上运行,这绕过了通常会阻止这种情况的 LVM 过滤器。该文件包含:可以通过设置
auto_activation_volume_list
in来控制此行为/etc/lvm/lvm.conf
。它允许您设置允许自动激活哪些卷组、卷或标签。因此,我只需将过滤器设置为包含主机的两个卷组;其他任何内容都不会匹配过滤器并且不会自动激活。
来宾的 LVM 卷不再出现在主机上,最后,我的备份正在运行...
您想编辑 /etc/lvm/lvm.conf 中的“过滤器”值以仅检查 KVM 主机上的物理设备;默认值接受“每个块设备”,其中包括 LV 本身。默认值上方的注释相当全面,可以比我更好地解释用法。
我遇到了大致相同的问题
vgimportclone
。它有时会失败:那时,如果我想销毁快照,我首先不得不暂时禁用,因为https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081
udev
中描述的错误但即便如此,在看似成功地停用了嵌套 LVM 的卷组之后,由 创建的嵌套 PV 的分区映射
kpartx
仍然在使用中。诀窍似乎是设备映射器使用旧的卷组名称保留了一个额外的父映射,就像树列表中的这样:
解决方案是使用 . 简单地删除该特定映射
dmsetup remove insidevgname-lvroot
。之后,kpartx -d
并且lvremove
工作正常。