Linux

Linux 設備映射器在拍攝快照時映射嵌套在 LV 內的 LVM PV

  • September 28, 2016

這真是搞亂了我備份這台機器的計劃……

我有一台伺服器,它是多個虛擬機的 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 過濾器。該文件包含:

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 卷不再出現在主機上,最後,我的備份正在執行…

引用自:https://serverfault.com/questions/678642