Linux 장치 맵퍼는 스냅 샷을 작성할 때 LV 내에 중첩 된 LVM PV를 매핑합니다.

이 머신을 백업하려는 계획이 정말 엉망입니다 …

여러 가상 머신의 KVM 하이퍼 바이저 인 서버가 있습니다. 이 중 하나가 Docker를 실행 중입니다. / dev / vdb에 Docker 볼륨이 있으며 LVM PV로 설정되며 Docker는 direct-lvm 드라이버 를 사용 하여 Docker 컨테이너 데이터를 저장합니다. 이 가상 디스크는 호스트 로컬 디스크의 LVM LV입니다.

호스트와 게스트 모두 Fedora 21을 실행합니다.

이 볼륨의 호스트보기는 다음과 같습니다 (관련 볼륨 만 표시됨).

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

이 볼륨에 대한 손님의 관점은 다음과 같습니다 (다시 관련 볼륨 만 표시됨).

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

호스트의 다른 모든 LVM 볼륨을 사용하여을 사용하여 스냅 샷을 생성하고 스냅 샷을 lvcreate --snapshot백업 한 다음 lvremove문제없이 수행 할 수 있습니다 . 그러나이 특정 볼륨 lvremove으로는 사용 중이므로 할 수 없습니다 .

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

결국 호스트의 device-mapper가이 논리 볼륨 스냅 샷 에 LVM PV가 포함되어 있음을 알아 낸 다음 스냅 샷 내의 논리 볼륨을 호스트에 매핑했습니다 (관련 볼륨 만 표시됨).

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

이들은 VM 내부의 논리적 볼륨과 정확히 일치합니다.

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

특히 시스템 부팅시 LVM LV에 대해 시도하지 않고 스냅 샷을 찍을 때만 시도합니다.

무슨 일이야? 장치 매퍼가 LVM 스냅 샷의 내용을 검사하여 그 안에 아무것도 도움이되지 않는지 확인하는 것을 원하지 않습니다. 이 동작을 억제 할 수 있습니까? 아니면 다른 방법으로 스냅 샷을 만들어야합니까?



답변

때로는 관련 문서가 문서가 아닌 구성 파일에 숨겨져있는 경우가 있습니다. 따라서 LVM과 같습니다.

기본적으로 LVM은 모든 PV가 있고 lvmetad 및 udev (또는 가장 최근에 시스템화 된)가 실행되는 한 부팅 후 시스템에 연결된 모든 물리적 장치에서 볼륨 활성화를 자동으로 시도합니다 . LVM 스냅 샷이 작성되면 udev 이벤트가 발생하고 스냅 샷에 PV가 포함 pvscan되므로 lvmetad가 자동으로 실행 됩니다.

살펴본 /etc/lvm/backup/docker-volumes결과 lvmetad가 pvscan장치 주 및 부 번호를 사용하여 스냅 샷에서 명시 적으로 실행되었음을 확인할 수있었습니다 . 파일에 포함 된 내용 :

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

auto_activation_volume_listin 을 설정하여이 동작을 제어 할 수 있습니다 /etc/lvm/lvm.conf. 자동으로 활성화 할 수있는 볼륨 그룹, 볼륨 또는 태그를 설정할 수 있습니다.

따라서 간단히 호스트에 대한 두 볼륨 그룹을 모두 포함하도록 필터를 설정했습니다. 필터와 일치하지 않는 항목은 자동으로 활성화되지 않습니다.

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

게스트의 LVM 볼륨이 더 이상 호스트에 나타나지 않으며 마지막으로 백업이 실행되고 있습니다.


답변

KVM 호스트의 물리적 장치 만 검사하도록 /etc/lvm/lvm.conf에서 ‘filter’값을 편집하려고합니다. 기본값은 LV 자체를 포함하는 ‘모든 블록 장치’를 허용합니다. 기본값 위의 주석은 상당히 포괄적이며 사용 방법을 설명하는 것보다 나을 수 있습니다.


답변

와 비슷한 문제가 발생했습니다 vgimportclone. 때로는 다음과 같이 실패합니다.

  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

이 시점에서 스냅 샷을 삭제하려면 https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081에udev 설명 된 버그로 인해 먼저 일시적으로 비활성화해야했습니다.

그러나 그럼에도 불구하고 중첩 LVM의 볼륨 그룹을 성공적으로 비활성화 한 후에 의해 생성 된 중첩 PV에 대한 파티션 매핑이 kpartx어떻게 든 사용되었습니다.

트릭은 장치 맵퍼가 트리 목록에서 다음과 같이 이전 볼륨 그룹 이름을 사용하여 추가 상위 맵핑을 유지 한 것으로 보입니다.

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

해결책은로 특정 매핑을 간단히 제거하는 것이 었습니다 dmsetup remove insidevgname-lvroot. 그 후, kpartx -dlvremove벌금을했다.


답변