我有一台服务器,它是几个虚拟机的KVM管理程序.其中一个是运行Docker.它的/ dev / vdb上有Docker卷,它被设置为LVM PV,Docker使用its direct-lvm driver来存储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拍摄快照,备份快照,然后将其删除,没有任何问题.但是对于这个特定的卷,我无法删除它,因为它正在使用中:
[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将自动尝试激活启动后连接到系统的任何物理设备上的卷,只要所有PV都存在,并且lvMetad和udev(或最近的systemd)正在运行.创建LVM快照时,会触发udev事件,并且由于快照包含PV,因此lvMetad会自动运行pvscan,依此类推.
通过查看/ etc / lvm / backup / docker-volumes,我能够确定lvMetad是否已使用设备主要和次要号码在快照上显式运行pvscan,这会绕过通常会阻止此操作的LVM过滤器.该文件包含:
description = "Created *after* executing 'pvscan --cache --activate ay 253:13'"
可以通过在/etc/lvm/lvm.conf中设置auto_activation_volume_list来控制此行为.它允许您设置允许自动激活哪些卷组,卷或标签.
因此,我只是将过滤器设置为包含主机的两个卷组;其他任何东西都不会与过滤器匹配,也不会自动激活.
auto_activation_volume_list = [ "mandragora","vm-volumes" ]
guest虚拟机的LVM卷不再出现在主机上,最后,我的备份正在运行…