데비안 8.9 복원 삭제되었지만 잠긴 파일


0

실수로 rm -R / home /을 실행했습니다. 내 홈 폴더에는 현재 사용중인 여러 가상 머신 디스크가 포함되어 있습니다. 또한 일부 파일을 삭제할 수 없다는 오류가 발생했습니다. 그럼에도 불구하고 더 이상 / home / 폴더의 파일에 액세스 할 수 없습니다.

내가 찾은 해결책을 찾고 cp / proc / PID / fd / 12 / target /을 사용하여 파일을 복원하려고 시도했습니다.

이제 약간 혼란스러워합니다. 가상 컴퓨터가 여전히 작동하고 있기 때문에 복구하려는 디스크에 기록합니다.

해당 디스크에 불일치가 있습니까? 아니면 다른 힌트가 있습니까?

모든 도움을 주셔서 감사합니다!

대단히 감사합니다!


1
POSIX 시스템에서 열린 파일 디스크립터는 파일에 대한 참조 (링크)로 계산되므로 해당 파일이 차지하는 공간은 그대로 파일 시스템에 남아 있습니다. 파일 시스템 자체에는 액세스 할 수있는 이름이 없습니다.
kostix

1
sleep 99999 < /proc/PID/fd/12 &cp 백업에 불일치가 없는지 확인하기 위해 이름없는 파일 (예 :)에 대한 두 번째 참조를 열어 삭제를 방지 한 다음 VM을 정지 또는 중지 할 수 있습니다. 물론 VM을 중지하면 이후 (및 이전 : 참조를 유지하는 데 사용되는 명령에서) 실수가 허용되지 않습니다.
AB

이 훌륭한 조언에 감사드립니다! 두 번째 참조가없는 일부 VM과 일시 중단 및 설명 된 방법으로 일부 VM을 복사했습니다. 일부 머신은 부팅하는 동안 저널의 도움으로 일부 블록을 복원해야했지만 두 방법 모두 제대로 작동했습니다. 파일을 복사하는 동안 쓰기가 있었기 때문일 수 있습니다. 그러나 모든 VirtualMachines를 복원 할 수 있습니다. @AB 당신이 좋아하면 대답을 쓸 수 있으므로 그렇게 표시 할 수 있습니다. 도와 주셔서 감사합니다 !!
SevenOfNine

1
완료, 몇 가지 설명과 함께 답변을 추가
AB

답변:


1

주어진 파일 시스템의 파일은 색인 노드 일명 inode로 참조됩니다 . 이 inode에 대한 참조가있는 한 디스크 (파일 이름으로 링크되어 여러 번 존재할 수 있음) 또는 "메모리"(파일 열기 디스크립터 aka fd, 마운트 지점, mmaped ...)에서 데이터는 디스크에 유지됩니다. 더 이상 참조가 없으면 실제로 삭제되고 공간이 회수됩니다. 디스크 참조가 0이되면, 여전히 "메모리에"참조가 있어도, 새로운 이름으로 다시 링크 할 방법이 없습니다. 예를 들어 사용자가 fd에서 참조하는 inode를 링크 할 수있는 커널 API가 없기 때문입니다. 아이 노드 값 자체가 파일 이름에 의해서만 사용할 수 (사용하여 적절한 파일 시스템 않는 어둡고 위험한 마법을 : debugfs ln).

Linux 커널은 여전히 /proc의사 파일 시스템 으로이 파일에 액세스 할 수있는 기능을 제공합니다 . 열린 각 파일은 파일을 가리키는 심볼릭 링크로 표시됩니다. 파일의 이름은 화장품 정보 (그리고 파일이 연결되지 때 잘못 될 수 있습니다)하지만, 파일 자체로 간주 될 커널에 의해 볼 때, 실제 파일./proc/PID/fd/

따라서이 경우 VM이 실행되는 동안 VM의 디스크 백엔드로 사용 된 파일은 여전히 ​​존재하지만 디스크에서 다시 연결할 수는 없습니다. 쉽게 수행 할 수있는 것은 다음과 같은 적절한 명령으로 복사하는 것입니다.

cp --sparse=always /proc/PID/fd/12 > backup.

VM이 실행 중이므로이 작업을 수행하면 일관성이없는 결과가 발생할 수 있습니다. 파일 시스템 (파일 내부)은 복사 중에 변경되어 일관성이없고 손상 될 수 있습니다. 하이퍼 바이저가 허용한다면 어느 VM을 동결 하고 동결 때 VM의 디스크 파일을 닫습니다, 어느 이름없는 파일에 새 참조를 추가하고 VM을 중지하지 않습니다. 기회를 원하지 않는다면 어쨌든 참조를 추가 한 후 정지하십시오. 파일을 읽고 충분히 오래 지속되는 명령은 괜찮습니다. 예를 들면 다음과 같습니다.

$ sleep 99999 < /proc/PID/fd/12 &
[1] 12087

이제 /proc/12087/fd/0동일한 ... (deleted)파일을 참조하고 있는지 확인해야 합니다.

이제 VM을 중지하거나 중지 할 수 있습니다 (그러나 다시 시작할 수는 없습니다). 파일 시스템에 대한 활동이 더 이상 없으므로 백업은 일관되어야합니다 (단순히 동결 된 경우 파일 시스템 저널 복구 사용). 더 적은 공간을 사용하기 위해 VM의 디스크 파일이 "게으른"프로비저닝되고 대부분 비어있는 경우 cpwith 옵션을 사용 --sparse=always하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.