열린 파일 핸들이 죽은 후 어디로 가나요?

열린 파일 핸들이 죽은 후 어디로 가나요?

파일 핸들이 열려 있는 동안 삭제된 파일은 어떻게 되나요?

비디오 파일이 재생되는 동안 삭제할 수 있다는 것을 알게 된 이후로 이것에 대해 궁금했습니다.플레이어그리고 끝까지 재생됩니다. 어디에서 데이터를 가져오나요? 아직도 하드 드라이브에서 나오나요? 파일을 삭제하면 RAM에 복사되나요?

아직 하드 드라이브에 있는 경우 프로그램이 실행되는 동안 기본적으로 할당되지 않은 공간에서 데이터를 읽어 파일 시스템을 채우면 어떻게 되나요? RAM에 버퍼링되어 있는 경우 버퍼를 플러시하면 어떻게 되나요?

파일이 NFS 공유에 있으면 어떻게 되나요? 서버에 저장되나요? (이것은 보안 위험이 아닌가? 열려 있는 원격 파일 핸들이 너무 많으면 DoS가 발생할 수 있습니까?)

어떤 일을 하면 lsof -n |grep '(deleted)'때로는 흥미로운 결과가 나올 수 있습니다. 공유 라이브러리 파일을 교환하는 패키지를 업그레이드하면 해당 라이브러리를 사용하는 프로그램을 실행하면 아무 것도 변경되지 않은 것처럼 계속 사용할 수 있습니다.

보너스 질문: 이 상황에서 데이터를 다시 활성화할 수 있는 방법이 있습니까?

답변1

더 이상 inode에 대한 하드 링크가 없지만 inode는 디스크에 남아 있습니다. 파일 설명자가 닫히면 삭제됩니다. 그때까지는 파일 이름/하드 링크 조작이 필요하지 않는 한 파일을 정상적으로 수정할 수 있습니다.

debugfs유사한 도구를 사용하여 inode의 내용을 복원할 수 있습니다.

답변2

커널은 inode에 대한 참조에 대한 참조 계산을 수행합니다. 내 답변 보기파일 설명자를 닫으면() 무슨 일이 발생하나요?.

열린 파일을 삭제하는 것은 파일을 여는 것보다 더 효율적인 DOS 메커니즘이 아닐 것입니다. 열린 파일은 ulimit그러한 DOS 시도에 대해 어느 정도 보호 기능을 제공합니다. 삭제 여부에 관계없이 열려 있는 모든 파일에서 작동합니다.

답변3

파일에 대한 모든 참조가 사라진 경우에만 파일 시스템에서 파일이 삭제됩니다. 이름과 열린 핸들 모두 참조로 간주됩니다. 파일이 프로그램에 열려 있는 동안에는 삭제되지 않습니다. 하지만 대부분의 시스템에서는 파일 이름을 다시 만들 수 없습니다.

데이터는 여전히 드라이브에 있지만 파일의 링크 개수는 0으로 표시됩니다. 시스템이 충돌하면 다음에 fsck를 재부팅할 때 데이터를 삭제해야 한다는 것을 알게 됩니다. 이로 인해 삭제되지 않은 파일보다 더 이상 서비스 거부가 발생하지 않습니다.

내가 아는 한, 기존 Linux 시스템에서 파일에 대한 링크를 다시 만들 수는 없지만( debugfs또는 유사한 방법을 사용하여 파일 시스템 드라이버를 우회하지 않는 한) 내용을 쉽게 복원할 수 있습니다. cat /proc/12345/fd/42여기서 12345는 열린 프로세스 ID입니다. 파일 42는 파일 설명자입니다.

NFS를 사용하면 클라이언트에 아직 열려 있는 파일을 삭제하면 NFS 서버는 서버에 있는 파일의 이름을 바꾸지만 모든 클라이언트가 파일을 해제할 때까지 삭제하지 않습니다. 내 경험에 따르면 새 이름은 이지만 .nfs…해당 이름이 모든 NFS 구현에서 동일한지는 알 수 없습니다.

관련 정보