Il mappatore di dispositivi Linux mappa LVM PV nidificato all'interno di LV quando si scatta un'istantanea


13

Il che è davvero incasinato con il mio piano per il backup di questa macchina ...

Ho un server che è un hypervisor KVM per diverse macchine virtuali. Uno di questi sta eseguendo Docker. Ha i suoi volumi Docker su / dev / vdb, che è impostato come PV LVM, su cui Docker utilizza il suo driver direct-lvm per archiviare i dati del contenitore Docker. Questo disco virtuale è un LVM LV sul disco locale dell'host.

Sia l'host che l'ospite gestiscono Fedora 21.

La vista dell'host di questo volume è (viene mostrato solo il volume pertinente):

[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 vista dell'ospite su questo volume è (di nuovo, viene mostrato solo il volume rilevante):

[root@docker2 ~]# pvs
  PV         VG             Fmt  Attr PSize  PFree
  /dev/vdb   docker-volumes lvm2 a--  40.00g    0 

Con tutti gli altri volumi LVM sull'host, posso fare un'istantanea con lvcreate --snapshot, eseguire il backup dell'istantanea e quindi lvremovesenza problemi. Ma con questo volume particolare, non posso lvremoveperché è in uso:

[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.

Alla fine ho capito che il device-mapper sull'host aveva in qualche modo capito che questa istantanea del volume logico conteneva un PV LVM, e quindi ho proceduto a mappare i volumi logici all'interno dell'istantanea sull'host (sono mostrati solo i volumi rilevanti):

[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)

Questi corrispondono esattamente ai volumi logici all'interno della VM:

[root@docker2 ~]# lvs
  LV          VG             Attr       LSize
  docker-data docker-volumes -wi-ao---- 39.95g
  docker-meta docker-volumes -wi-ao---- 44.00m

In particolare, non tenta di eseguire questa operazione su LVM LV all'avvio del sistema, ma solo quando eseguo un'istantanea.

Cosa sta succedendo qui? Non voglio davvero che Device Mapper ispezioni il contenuto delle istantanee LVM per vedere se c'è qualcosa al loro interno che può essere inutilmente mappato per me. Posso sopprimere questo comportamento? O devo creare l'istantanea tramite qualche altro metodo?

Risposte:


8

A volte la documentazione pertinente viene nascosta nei file di configurazione piuttosto che, per esempio, nella documentazione. Così sembra con LVM.

Per impostazione predefinita, LVM tenterà automaticamente di attivare i volumi su tutti i dispositivi fisici che si collegano al sistema dopo l'avvio, purché siano presenti tutti i PV e lvmetad e udev (o più recentemente systemd) siano in esecuzione. Quando viene creata l'istantanea LVM, viene generato un evento udev e poiché l'istantanea contiene un PV, lvmetad viene eseguito automaticamente pvscane così via.

Guardando /etc/lvm/backup/docker-volumessono stato in grado di determinare che lvmetad era stato esplicitamente eseguito sull'istantanea pvscanutilizzando i numeri maggiore e minore del dispositivo, che ha bypassato i filtri LVM che normalmente lo impedivano. Il file conteneva:

description = "Created *after* executing 'pvscan --cache --activate ay 253:13'"

Questo comportamento può essere controllato impostando auto_activation_volume_listin /etc/lvm/lvm.conf. Consente di impostare quali gruppi di volumi, volumi o tag possono essere attivati ​​automaticamente.

Quindi, ho semplicemente impostato il filtro per contenere entrambi i gruppi di volumi per l'host; qualsiasi altra cosa non corrisponde al filtro e non si attiva automaticamente.

auto_activation_volume_list = [ "mandragora", "vm-volumes" ]

I volumi LVM del guest non vengono più visualizzati nell'host e, infine, i miei backup sono in esecuzione ...


4

Volete modificare il valore 'filter' in /etc/lvm/lvm.conf per ispezionare solo i dispositivi fisici sull'host KVM; il valore predefinito accetta "ogni dispositivo a blocchi" che include gli stessi LV. Il commento sopra il valore predefinito è abbastanza completo e può fare un lavoro migliore nel spiegare l'uso che posso.


Nota che ho aggiunto il filtro, e sono corso pvscan --cacheper dire a lvmetad del nuovo filtro, e pvscanora afferma che il PV viene rifiutato da un filtro, ma il problema persiste.
Michael Hampton

Presumo tu intenda l'impossibilità di rimuovere l'istantanea. A questo punto, potrebbe essere complicato e posso offrire solo vaghi suggerimenti. Se il riavvio dell'host KVM è fuori discussione (e riconosco che è un approccio a mazza), allora forse 'lvchange -an / path / to / LV' dall'host rilascerà la sua sospensione. In caso contrario, probabilmente stai sperimentando varie operazioni dmsetup per provare a bypassare gli strumenti LVM. Tuttavia, diventa peloso e non mi sento a mio agio a raccomandare operazioni specifiche.
Craig Miskell,

Il filtro non fa nulla perché lvmetad sta eseguendo la scansione esplicita dell'istantanea in risposta a un evento udev. La soluzione si è rivelata qualcos'altro nella configurazione, però ...
Michael Hampton

2

Ho riscontrato all'incirca lo stesso problema in combinazione con vgimportclone. A volte fallirebbe con questo:

  WARNING: Activation disabled. No device-mapper interaction will be attempted.
  Physical volume "/tmp/snap.iwOkcP9B/vgimport0" changed
  1 physical volume changed / 0 physical volumes not changed
  WARNING: Activation disabled. No device-mapper interaction will be attempted.
  Volume group "insidevgname" successfully changed
  /dev/myvm-vg: already exists in filesystem
  New volume group name "myvm-vg" is invalid
Fatal: Unable to rename insidevgname to myvm-vg, error: 5

A quel punto, se volevo distruggere l'istantanea, per prima cosa ho dovuto disabilitare temporaneamente a udevcausa del bug descritto su https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081

Ma anche allora, dopo aver apparentemente disattivato con successo il gruppo di volumi di LVM nidificato, la mappatura delle partizioni per il PV nidificato, creata da kpartx, in qualche modo è rimasta in uso.

Il trucco sembrava essere che il mappatore del dispositivo mantenesse una mappatura padre aggiuntiva usando il vecchio nome del gruppo di volumi, come questo nella lista degli alberi:

insidevgname-lvroot (252:44)
 └─outsidevgname-myvm--root-p2 (252:43)
    └─outsidevgname-myvm--root (252:36)

La soluzione era semplicemente rimuovere quel particolare mapping con dmsetup remove insidevgname-lvroot. Dopo quello, kpartx -de ha lvremovefunzionato bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.