Ce qui dérange vraiment mon plan de sauvegarde de cette machine ...
J'ai un serveur qui est un hyperviseur KVM pour plusieurs machines virtuelles. L'un d'eux exécute Docker. Il a ses volumes Docker sur / dev / vdb, qui est configuré en tant que PV LVM, sur lequel Docker utilise son pilote direct-lvm pour stocker les données du conteneur Docker. Ce disque virtuel est un LVM LV sur le disque local de l'hôte.
L'hôte et l'invité exécutent Fedora 21.
La vue de l'hôte sur ce volume est (seul le volume pertinent est affiché):
[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)
La vue de l'invité sur ce volume est (encore une fois, seul le volume pertinent est affiché):
[root@docker2 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb docker-volumes lvm2 a-- 40.00g 0
Avec tous les autres volumes LVM sur l'hôte, je peux prendre un instantané avec lvcreate --snapshot
, sauvegarder l'instantané et ensuite lvremove
sans problème. Mais avec ce volume particulier, je ne peux pas lvremove
car il est utilisé:
[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.
Finalement, j'ai compris que le mappeur de périphériques sur l'hôte avait en quelque sorte compris que cet instantané de volume logique contenait un PV LVM, puis j'ai procédé à la mappage des volumes logiques dans l'instantané à l'hôte (seuls les volumes pertinents sont affichés):
[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)
Ceux-ci correspondent exactement aux volumes logiques à l'intérieur de la VM:
[root@docker2 ~]# lvs
LV VG Attr LSize
docker-data docker-volumes -wi-ao---- 39.95g
docker-meta docker-volumes -wi-ao---- 44.00m
Notamment, il n'essaie pas de faire cela au LVM LV lorsque le système démarre, mais uniquement lorsque je prends un instantané.
Qu'est-ce qui se passe ici? Je ne veux vraiment pas que le mappeur de périphériques inspecte le contenu des instantanés LVM pour voir s'il y a quelque chose en eux qu'il peut mapper sans aide pour moi. Puis-je supprimer ce comportement? Ou dois-je créer l'instantané via une autre méthode?
la source
pvscan --cache
pour informer lvmetad du nouveau filtre, etpvscan
indique maintenant que le PV est rejeté par un filtre, mais le problème persiste.J'ai rencontré à peu près le même problème en combinaison avec
vgimportclone
. Cela échouait parfois avec ceci:À ce stade, si je voulais détruire l'instantané, je devais d'abord désactiver temporairement en
udev
raison du bogue décrit à https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081Mais même alors, après avoir apparemment réussi à désactiver le groupe de volumes du LVM imbriqué, le mappage de partition pour le PV imbriqué, créé par
kpartx
, est resté en quelque sorte utilisé.L'astuce semble être que le mappeur de périphériques a conservé un mappage parent supplémentaire en utilisant l'ancien nom du groupe de volumes, comme ceci dans la liste arborescente:
La solution consistait simplement à supprimer ce mappage particulier avec
dmsetup remove insidevgname-lvroot
. Après cela,kpartx -d
etlvremove
a bien fonctionné.la source