Co naprawdę psuje mój plan tworzenia kopii zapasowej tej maszyny ...
Mam serwer, który jest hiperwizorem KVM dla kilku maszyn wirtualnych. Jednym z nich jest Docker. Ma woluminy Docker na / dev / vdb, które są skonfigurowane jako PV LVM, na których Docker używa sterownika bezpośredniego lvm do przechowywania danych kontenera Docker. Ten dysk wirtualny to LVM LV na dysku lokalnym hosta.
Zarówno host, jak i gość uruchamiają Fedorę 21.
Widok hosta na ten wolumin jest (pokazany jest tylko odpowiedni wolumin):
[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)
Widok gościa na ten wolumin jest (ponownie pokazany jest tylko odpowiedni wolumin):
[root@docker2 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb docker-volumes lvm2 a-- 40.00g 0
Przy wszystkich innych woluminach LVM na hoście mogę zrobić migawkę lvcreate --snapshot
, wykonać kopię zapasową migawki, a następnie lvremove
bez problemu. Ale z tym konkretnym tomem nie mogę lvremove
, ponieważ jest w użyciu:
[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.
W końcu zorientowałem się, że urządzenie mapujące urządzenie na hoście w jakiś sposób zorientowało się, że ta migawka logiczna woluminu zawierała PV LVM, a następnie przystąpiła do mapowania woluminów logicznych w migawce na hoście (pokazano tylko odpowiednie woluminy):
[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)
Odpowiadają one dokładnie woluminom logicznym w maszynie wirtualnej:
[root@docker2 ~]# lvs
LV VG Attr LSize
docker-data docker-volumes -wi-ao---- 39.95g
docker-meta docker-volumes -wi-ao---- 44.00m
W szczególności nie próbuje tego zrobić z LVM LV podczas uruchamiania systemu, ale tylko wtedy, gdy robię migawkę.
Co tu się dzieje? Naprawdę nie chcę, aby mapowanie urządzeń sprawdzało zawartość migawek LVM, aby sprawdzić, czy jest w nich coś, co może mi nieprzydatnie zmapować. Czy mogę stłumić to zachowanie? Czy też muszę utworzyć migawkę za pomocą innej metody?
źródło
pvscan --cache
aby poinformować lvmetad o nowym filtrze, ipvscan
teraz stwierdzam, że PV jest odrzucane przez filtr, ale problem nadal występuje.Napotkałem mniej więcej ten sam problem w połączeniu z
vgimportclone
. Czasami się to nie udaje:W tym momencie, jeśli chciałem zniszczyć migawkę, najpierw musiałem tymczasowo wyłączyć z
udev
powodu błędu opisanego na https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081Ale nawet wtedy, po pozornie skutecznej dezaktywacji zagnieżdżonej grupy woluminów LVM, mapowanie partycji dla zagnieżdżonego PV, utworzone przez
kpartx
, jakoś pozostało w użyciu.Wydawało się, że sztuczka polega na tym, że program mapujący urządzenia zachował dodatkowe mapowanie nadrzędne, używając starej nazwy grupy woluminów, takiej jak na liście drzew:
Rozwiązaniem było po prostu usunięcie tego konkretnego mapowania
dmsetup remove insidevgname-lvroot
. Po tym,kpartx -d
ilvremove
pracował w porządku.źródło