이 머신을 백업하려는 계획이 정말 엉망입니다 …
여러 가상 머신의 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_list
in 을 설정하여이 동작을 제어 할 수 있습니다 /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 -d
및 lvremove
벌금을했다.