Der Linux-Geräte-Mapper ordnet LVM PV zu, das beim Erstellen eines Snapshots in LV verschachtelt ist

12

Was meinen Plan, diese Maschine zu sichern, wirklich durcheinander bringt ...

Ich habe einen Server, der ein KVM-Hypervisor für mehrere virtuelle Maschinen ist. Eine davon ist Docker. Die Docker-Volumes befinden sich in / dev / vdb, das als LVM-PV eingerichtet ist und auf dem Docker seinen Direct-LVM-Treiber zum Speichern von Docker-Containerdaten verwendet. Diese virtuelle Festplatte ist eine LVM-LV auf der lokalen Festplatte des Hosts.

Sowohl Gastgeber als auch Gast betreiben Fedora 21.

Die Ansicht des Hosts zu diesem Volume lautet (nur das relevante Volume wird angezeigt):

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

Die Ansicht des Gastes zu diesem Band ist (wieder wird nur der relevante Band angezeigt):

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

Mit allen anderen LVM-Volumes auf dem Host kann ich einen Snapshot lvcreate --snapshoterstellen, den Snapshot sichern und dann lvremoveohne Probleme. Aber mit diesem speziellen Band kann ich es nicht lvremove, weil es verwendet wird:

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

Schließlich stellte ich fest, dass der Geräte-Mapper auf dem Host irgendwie herausgefunden hatte, dass dieser Snapshot für logische Volumes eine LVM-PV enthielt, und fuhr dann fort, die logischen Volumes innerhalb des Snapshots dem Host zuzuordnen (nur die relevanten Volumes werden angezeigt):

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

Diese entsprechen genau den logischen Volumes in der VM:

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

Insbesondere wird nicht versucht, dies mit dem LVM-LV zu tun, wenn das System gestartet wird, sondern nur, wenn ich einen Snapshot mache.

Was geht hier vor sich? Ich möchte wirklich nicht, dass der Geräte-Mapper den Inhalt von LVM-Snapshots überprüft, um festzustellen, ob sich darin etwas befindet, das für mich nicht hilfreich zugeordnet werden kann. Kann ich dieses Verhalten unterdrücken? Oder muss ich den Schnappschuss mit einer anderen Methode erstellen?

Michael Hampton
quelle

Antworten:

7

Manchmal ist die relevante Dokumentation in Konfigurationsdateien versteckt und nicht beispielsweise in der Dokumentation. So scheint es mit LVM.

Standardmäßig versucht LVM automatisch, Volumes auf allen physischen Geräten zu aktivieren, die nach dem Start mit dem System verbunden werden, solange alle PVs vorhanden sind und lvmetad und udev (oder in jüngerer Zeit systemd) ausgeführt werden. Wenn der LVM-Snapshot erstellt wird, wird ein udev-Ereignis ausgelöst. Da der Snapshot eine PV enthält, wird lvmetad automatisch ausgeführt pvscanund so weiter.

Durch einen Blick auf konnte /etc/lvm/backup/docker-volumesich feststellen, dass lvmetad explizit pvscanauf dem Snapshot ausgeführt wurde, indem ich die Haupt- und Nebenzahlen des Geräts verwendete, die LVM-Filter umgingen, die dies normalerweise verhindern würden. Die Datei enthielt:

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

Dieses Verhalten kann durch Setzen der gesteuert wird auto_activation_volume_listin /etc/lvm/lvm.conf. Hier können Sie festlegen, welche Volume-Gruppen, Volumes oder Tags automatisch aktiviert werden dürfen.

Also habe ich den Filter einfach so eingestellt, dass er beide Volume-Gruppen für den Host enthält. Alles andere passt nicht zum Filter und wird nicht automatisch aktiviert.

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

Die LVM-Volumes des Gasts werden nicht mehr auf dem Host angezeigt, und schließlich werden meine Backups ausgeführt ...

Michael Hampton
quelle
3

Sie möchten den Wert 'filter' in /etc/lvm/lvm.conf bearbeiten, um nur die physischen Geräte auf dem KVM-Host zu überprüfen. Der Standardwert akzeptiert 'jedes Blockgerät', das LVs selbst enthält. Der Kommentar über dem Standardwert ist ziemlich umfassend und kann die Verwendung besser erklären als ich.

Craig Miskell
quelle
Beachten Sie, dass ich den Filter hinzugefügt und ausgeführt habe pvscan --cache, um lvmetad über den neuen Filter zu informieren. pvscanJetzt wird angegeben, dass die PV von einem Filter abgelehnt wird, das Problem besteht jedoch weiterhin.
Michael Hampton
Ich nehme an, Sie meinen die Unfähigkeit, den Schnappschuss zu entfernen. In diesem Stadium könnte es schwierig sein, und ich kann nur vage Vorschläge machen. Wenn ein Neustart des KVM-Hosts nicht in Frage kommt (und ich bestätige, dass dies ein Vorschlaghammer-Ansatz ist), gibt 'lvchange -an / path / to / LV' vom Host möglicherweise seine Sperrung frei. Wenn nicht, experimentieren Sie wahrscheinlich mit verschiedenen dmsetup-Vorgängen, um die LVM-Tools zu umgehen. Dort wird es allerdings haarig und ich kann keine bestimmten Operationen empfehlen.
Craig Miskell
Der Filter führt nichts aus, da lvmetad den Snapshot explizit als Reaktion auf ein udev-Ereignis scannt. Die Lösung stellte sich jedoch als etwas anderes in der Konfiguration heraus ...
Michael Hampton
1

Ich bin in Kombination mit ungefähr dem gleichen Problem aufgetreten vgimportclone. Es würde manchmal damit scheitern:

  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

Wenn ich den Snapshot zu diesem Zeitpunkt zerstören wollte, musste ich ihn zunächst vorübergehend deaktivieren, udevda unter https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081 ein Fehler beschrieben wurde

Aber selbst dann, nachdem die Volumengruppe des verschachtelten LVM scheinbar erfolgreich deaktiviert worden war, blieb die Partitionszuordnung für die verschachtelte PV, die von erstellt wurde kpartx, irgendwie in Gebrauch.

Der Trick schien zu sein, dass der Geräte-Mapper eine zusätzliche übergeordnete Zuordnung unter Verwendung des alten Datenträgergruppennamens beibehielt, wie in der Baumliste angegeben:

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

Die Lösung bestand darin, diese bestimmte Zuordnung einfach mit zu entfernen dmsetup remove insidevgname-lvroot. Danach kpartx -dund hat gut lvremovefunktioniert.

Josip Rodin
quelle