실수로 libvirt 이미지 파일을 삭제했는데 다시 만들 수 있나요?

실수로 libvirt 이미지 파일을 삭제했는데 다시 만들 수 있나요?

실수로 /var/lib/libvirt/images 디렉토리에서 잘못된 이미지 파일을 삭제했습니다. 다시 생성하거나 삭제를 취소하는 방법을 모르겠습니다. 어떤 팁이 있나요?

답변1

가상 머신을 종료하지 않았기 때문에 이미지 파일을 사용하는 프로세스에는 여전히 파일이 열려 있으며 파일이 실제로 삭제되지 않았습니다. 프로세스가 계속 실행되는 동안에는 프로세스를 재개할 수 있습니다.

이 답변에는 이라는 kvm 이미지가 있습니다 testdelete. 가상 머신이 시작되었지만 파일을 삭제했습니다.

먼저 파일을 사용하는 프로세스를 찾아야 합니다. 가장 쉬운 방법은 을 사용하는 것입니다 lsof.

# lsof | grep /var/lib/libvirt/images/testdelete.img
qemu-kvm  29627      qemu    9u      REG                9,0  2147483648     399357 /var/lib/libvirt/images/testdelete.img (deleted)

이것은 프로세스 29627과 파일 설명자 9임을 알려줍니다. 이것을 보자

# cd /proc/29627/fd
# ls -l 9
lrwx------ 1 qemu qemu 64 Jul 21 18:13 9 -> /var/lib/libvirt/images/testdelete.img (deleted)

알았어, 좋아. 일치합니다. 이제 복원해 볼까요! 전체 이미지를 담을 수 있을 만큼 여유 공간이 충분한 디스크가 필요합니다.

이상적으로는 가상 머신이 가능한 한 정지 상태여야 합니다. 원시 디스크 이미지를 복사하고 있기 때문에 일부 프로세스가 디스크에 쓰는 경우 손상될 위험이 있습니다. 정지 신호를 보내 이러한 위험을 최소화하려고 노력할 수 있습니다.

# kill -STOP 29627

이는 프로세스를 효과적으로 "동결"시킵니다. 지금 수행하는 백업은 심각한 충돌 후 발생하는 것과 동일하며 재부팅 후 운영 체제 fsck(또는 이에 상응하는 항목)가 복원됩니다.

이제 데이터를 복사할 수 있습니다.

# dd if=9 of=/home/sweh/recovered.img bs=1M
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 5.74931 s, 374 MB/s

완벽해 보입니다. 디스크 이미지의 크기는 2GB이고 그것이 복사되는 것입니다.

이 사진이 괜찮아 보이나요?

# cd /home/sweh
# sfdisk -l recovered.img 
Disk recovered.img: cannot get geometry

Disk recovered.img: 261 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
recovered.img1          0+     65-     66-    524288   82  Linux swap / Solaris
recovered.img2   *     65+    261-    196-   1571840   83  Linux
recovered.img3          0       -       0          0    0  Empty
recovered.img4          0       -       0          0    0  Empty

예, 이것은 내 파티션 테이블과 같습니다. 이 시점에서 추가 테스트를 수행하여 이미지가 좋아 보이는지 확인할 수 있습니다.

그게 다야! 이미지 파일을 복구했습니다.

참고: 이 예에서는 기존 프로세스를 종료합니다 qemu. 이 단계를 수행하면 디스크가 해제되므로 되돌릴 수 없습니다. "병렬 실행" 테스트를 수행하려면 새 이미지 파일과 virsh define이를 사용할 새 가상 머신을 생성하면 됩니다.

이를 사용하여 가상 머신을 다시 시작해 보겠습니다. 기존 가상 머신을 삭제하고 데이터 파일을 제자리에 복사한 후 재부팅합니다.

# virsh destroy testdelete
# cp -v recovered.img /var/lib/libvirt/images/testdelete.img
`recovered.img' -> `/var/lib/libvirt/images/testdelete.img'
# virsh start testdelete
Domain testdelete started

콘솔에 연결할 수 있나요?

# virsh console testdelete
Connected to domain testdelete
Escape character is ^]

CentOS release 6.8 (Final)
Kernel 2.6.32-642.3.1.el6.x86_64 on an x86_64

dhcp226.spuddy.org login: 

복원이 완료되었습니다 :-)

답변2

libvirt 이미지의 기본값은 다음과 같습니다./var/lib/libvirt/images

일부 삭제 취소 소프트웨어를 사용하여 파일을 복구하는 방법을 찾아야 합니다. 이 문서는 다음 사항에 도움이 될 수 있습니다.Unix/Linux 삭제 취소/삭제된 파일 복구

관련 정보