실수로 lxc 이미지 파일을 삭제했습니다. 컨테이너는 계속 실행 중이므로 컨테이너를 중지하기 전에는 파일이 실제로 삭제되지 않았습니다. 매우 민감하므로 컨테이너를 중지하지 않고 싶습니다.
다음 명령을 사용하여 삭제된 파일을 찾으려고 했지만
for i in $(ls /proc/|grep '^[0-9]*$'); do ls -l /proc/$i/fd|grep delete; done
루프 장치를 찾을 수 없습니다. 단순함과 동일lsof | vm-
삭제되지 않은 다른 이미지에 대해 lsof를 실행하면 해당 이미지를 사용하는 프로세스가 표시되지 않습니다 lsof /var/lib/vz/images/100/vm-100-disk-0.raw
. 아마도 프로세스가 아닌 커널에 의해 열렸기 때문일 것입니다.
의견에서 제안한대로 :
# losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO
/dev/loop1 0 0 1 0 /var/lib/vz/images/200/vm-200-disk-0.raw (deleted) 0
/dev/loop0 0 0 1 0 /var/lib/vz/images/100/vm-100-disk-0.raw 0
나는 시도했다:
debugfs /dev/mapper/pve-data
debugfs: cd images/200
debugfs: lsdel
Inode Owner Mode Size Blocks Time deleted
0 deleted inodes found.
아직 삭제되지 않아서 그런 것 같아요. 삭제하도록 두고 여기에 표시되고 손상되지 않기를 바라는 것은 약간 위험합니다(300GB 이상).
컨테이너 내부에는 mount
다음이 제공됩니다.
/var/lib/vz/images/200/vm-200-disk-0.raw (deleted) on / type ext4 (rw,relatime,data=ordered)
전체 파일 시스템을 덤프하고 컨테이너를 완전히 다시 만드는 것 외에 다른 해결책이 있습니까? (또한 호스트 드라이브가 거의 꽉 차서 옆에 두 번째 컨테이너를 만들 공간이 이제 부족합니다. 스토리지를 축소하면 실제로 실제 삭제가 발생할까 걱정됩니다. :(
답변1
[완전한 답변은 아니지만 코멘트가 너무 깁니다.]
LOOP_GET_STATUS
또는 ioctl을 사용하여 루프 장치의 백업 파일(삭제되었을 수 있음)의 inode를 찾을 수 있습니다 . 이는 and 구조의 필드 LOOP_GET_STATUS64
입니다 ..lo_inode
loop_info
loop_info64
이 정보를 노출하는 명령줄 유틸리티를 찾을 수 없으므로 다음은 트릭을 수행해야 하는 Perl 단일 라이너입니다.
perl -le 'ioctl STDIN, 0x4C05, $s = pack "a512" or die "ioctl: $!"; print unpack "x[Q]Q", $s' </dev/loop1
1179684
loop(4)
자세한 내용은 맨페이지와 설명서를 참조하십시오 /usr/include/linux/loop.h
.
하지만 삭제된 파일을 inode로 복구하는 안전한 방법이 있는지는 모르겠습니다. debugfs(8)
마운트된 라이브 파일 시스템에서 복구할 수 없을 정도로 손상시키지 않고는 그렇게 할 수 없다고 생각합니다.절대삭제된 파일에 대한 링크를 만듭니다.
내가 생각할 수 있는 유일한 안전한 방법은 전체 루프 장치/파티션이 아직 존재하는 동안 복사하는 것입니다.
cp --sparse=always /dev/loop1 /path/where/to/save/it
답변2
컨테이너가 실행되는 동안에는 이 파일을 하드 드라이브에서 삭제하면 안 됩니다.
Andrew Gallagher의 답변에서 언급한 대로 inode를 찾고 lsof
파일을 복구 할 수 있습니다.debugfs
이 문제.
외부 디스크를 서버에 마운트할 수 있는 경우 허용되는 답변을 시도하고 거기에 파일을 복사할 수 있습니다.