Perangkat Linux-mapper memetakan LVM PV di dalam LV saat mengambil snapshot

13

Yang benar-benar mengacaukan rencanaku untuk membuat cadangan mesin ini ...

Saya memiliki server yang merupakan hypervisor KVM ke beberapa mesin virtual. Salah satunya adalah menjalankan Docker. Ini memiliki volume Docker pada / dev / vdb, yang diatur sebagai LVM PV, di mana Docker menggunakan driver direct-lvm untuk menyimpan data kontainer Docker. Disk virtual ini adalah LVM LV pada disk lokal host.

Tuan rumah dan tamu menjalankan Fedora 21.

Tampilan host dari volume ini adalah (hanya volume yang relevan ditampilkan):

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

Pandangan tamu tentang volume ini adalah (sekali lagi, hanya volume yang relevan ditampilkan):

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

Dengan semua volume LVM lainnya di host, saya dapat mengambil snapshot dengan lvcreate --snapshot, membackup snapshot dan kemudian lvremovetanpa masalah. Tetapi dengan volume khusus ini, saya tidak bisa lvremovekarena sedang digunakan:

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

Akhirnya saya tahu bahwa device-mapper pada host entah bagaimana menemukan bahwa snapshot volume logis ini mengandung LVM PV, dan kemudian melanjutkan untuk memetakan volume logis dalam snapshot ke host (hanya volume yang relevan ditampilkan):

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

Ini sesuai persis dengan volume logis di dalam VM:

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

Khususnya, itu tidak mencoba melakukan ini ke LVM LV ketika sistem boot, tetapi hanya ketika saya mengambil snapshot.

Apa yang terjadi disini? Saya benar-benar tidak ingin device-mapper memeriksa isi snapshot LVM untuk melihat apakah ada sesuatu di dalamnya yang dapat membantu saya memetakannya. Bisakah saya menekan perilaku ini? Atau apakah saya perlu membuat snapshot melalui beberapa metode lain?

Michael Hampton
sumber

Jawaban:

8

Kadang-kadang dokumentasi yang relevan disembunyikan di file konfigurasi daripada di, katakanlah, dokumentasi. Jadi sepertinya dengan LVM.

Secara default LVM akan secara otomatis mencoba untuk mengaktifkan volume pada perangkat fisik apa pun yang terhubung ke sistem setelah boot, selama semua PV hadir, dan lvmetad dan udev (atau yang lebih baru systemd) sedang berjalan. Ketika snapshot LVM dibuat, sebuah peristiwa udev ditembakkan, dan karena snapshot tersebut berisi PV, lvmetad secara otomatis berjalan pvscan, dan sebagainya.

Dengan melihat /etc/lvm/backup/docker-volumessaya dapat menentukan bahwa lvmetad telah secara eksplisit berjalan pvscanpada snapshot dengan menggunakan perangkat nomor utama dan kecil, yang memintas filter LVM yang biasanya akan mencegah hal ini. File tersebut berisi:

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

Perilaku ini dapat dikontrol dengan mengatur auto_activation_volume_listin /etc/lvm/lvm.conf. Ini memungkinkan Anda untuk mengatur grup volume, volume, atau tag mana yang diizinkan untuk diaktifkan secara otomatis.

Jadi, saya cukup mengatur filter untuk memuat kedua grup volume untuk host; hal lain tidak akan cocok dengan filter dan tidak diaktifkan secara otomatis.

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

Volume LVM tamu tidak lagi muncul di host, dan akhirnya, backup saya berjalan ...

Michael Hampton
sumber
4

Anda ingin mengedit nilai 'filter' di /etc/lvm/lvm.conf untuk memeriksa hanya perangkat fisik pada host KVM; nilai default menerima 'setiap perangkat blok' yang mencakup LV sendiri. Komentar di atas nilai default cukup komprehensif dan dapat melakukan pekerjaan yang lebih baik untuk menjelaskan penggunaan daripada yang saya bisa.

Craig Miskell
sumber
Perhatikan bahwa saya menambahkan filter, dan berlari pvscan --cacheuntuk memberi tahu lvmetad tentang filter baru, dan pvscansekarang menyatakan PV ditolak oleh filter, tetapi masalahnya tetap ada.
Michael Hampton
Saya menganggap maksud Anda ketidakmampuan untuk menghapus snapshot. Pada tahap ini, mungkin rumit, dan saya hanya bisa memberikan saran yang tidak jelas. Jika me-reboot host KVM keluar dari pertanyaan (dan saya mengakui itu adalah pendekatan godam), maka mungkin 'lvchange -an / path / ke / LV' dari host akan melepaskan cengkeramannya. Jika tidak, maka Anda mungkin bereksperimen dengan berbagai operasi dmsetup untuk mencoba dan memotong alat LVM. Itu jadi berbulu di sana, dan saya tidak merasa nyaman merekomendasikan operasi tertentu.
Craig Miskell
Filter tidak melakukan apa-apa karena lvmetad memindai snapshot secara eksplisit sebagai respons terhadap peristiwa udev. Solusinya ternyata menjadi sesuatu yang lain dalam konfigurasi, meskipun ...
Michael Hampton
2

Saya mengalami masalah yang hampir sama dalam kombinasi dengan vgimportclone. Terkadang gagal dengan ini:

  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

Pada saat itu, jika saya ingin menghancurkan snapshot, pertama-tama saya harus menonaktifkan sementara udevkarena bug yang dijelaskan di https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081

Tetapi meskipun begitu, setelah tampaknya berhasil menonaktifkan grup volume LVM bersarang, pemetaan partisi untuk PV bersarang, yang dibuat oleh kpartx, entah bagaimana tetap digunakan.

Triknya adalah bahwa mapper perangkat menyimpan pemetaan induk tambahan menggunakan nama grup volume lama, seperti ini di daftar pohon:

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

Solusinya adalah dengan menghapus pemetaan tertentu dengan dmsetup remove insidevgname-lvroot. Setelah itu, kpartx -ddan lvremovebekerja dengan baik.

Josip Rodin
sumber