주어진 파일 시스템의 파일은 색인 노드 일명 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의 디스크 파일이 "게으른"프로비저닝되고 대부분 비어있는 경우 cp
with 옵션을 사용 --sparse=always
하는 것이 좋습니다.