방금 로그 파일 이름을 "foo.log.old"로 바꾸고 애플리케이션이 "foo.log"에 새 로그 파일을 쓰기 시작할 것이라고 가정했습니다. 나는 로그 파일을 추적하여 새로운 이름을 찾고 "foo.log.old"에 줄을 계속 추가한다는 사실에 놀랐습니다.
저는 Windows에서의 이 동작에 익숙하지 않습니다. 구현이 가능한지 모르겠습니다. 이 동작은 Linux에서 어떻게 구현됩니까? 이에 대해 더 자세히 알아볼 수 있는 곳은 어디인가요?
답변1
프로그램은 파일 시스템(기존 UNIX 파일 시스템에서는 inode라고 함)에 의해 유지되는 번호로 파일에 연결되며, 이름은 단지 참조일 뿐입니다(유일한 참조가 아닐 수도 있음).
따라서 다음 사항에 주의를 기울여야 합니다.
- 파일 이동을 사용해도
mv
이 하위 번호는 파일 시스템 간에 이동하지 않는 한 변경되지 않습니다(원본 파일 시스템에서 then을 사용하는 것과 동일cp
).rm
- 여러 이름이 하나의 파일에 연결될 수 있기 때문에(즉, 하드 링크가 있음) "삭제된" 파일의 데이터는 다음까지 사라지지 않습니다.모두기본 파일에 대한 참조가 사라집니다.
- 아마도 가장 중요한 점은 프로그램이
open
파일에 액세스할 때 파일 이름을 파일에 연결하는 것과 동일하게 (데이터 삭제 목적으로) 파일을 참조한다는 것입니다.
이로 인해 다음과 같은 여러 동작이 발생합니다.
- 프로그램은
open
파일을 읽을 수 있지만rm
사용자가 명령줄에서 편집할 때까지는 실제로 읽지 않습니다.프로그램은 여전히 데이터에 액세스할 수 있습니다.. - 당신이 직면하고 있는 것은 다음과 같습니다:
mv
파일을 호출해도 파일을 여는 프로그램에서 파일의 연결이 끊어지지 않습니다(파일 시스템 경계를 넘지 않는 한, 이 경우 프로그램은 여전히 원래 버전을 사용할 수 있습니다). - 프로그램이
open
쓰기 위해 파일을 편집했고 사용자가rm
명령줄에 마지막 파일 이름을 입력한 경우 프로그램은 계속해서 파일에 콘텐츠를 넣을 수 있지만 일단 닫히면 데이터는 더 이상 참조되지 않으며 사라지다. - 하나 이상의 파일을 통해 통신하는 두 프로그램은 완료되면 파일을 삭제하여 대략적인 부분 보안을 얻을 수 있습니다
open
. (이것은 아니다실제보안 인식은 취약점을 경쟁 조건으로 전환합니다. )
답변2
이 동작이 어떻게 달성되는지 실제로 이해하려면 일부 Unix 프로그래밍 책을 확인하세요. Mathepic은 inode와 관련되어 있기 때문에 정확합니다. 실제 경로 이름은 파일을 여는 데만 사용되며, 일단 완료되면 프로그램은 열린 파일 설명자를 통해 이를 참조합니다. 파일 설명자는 차례로 inode를 참조하며, 이 경우 기본 파일 이름이 변경되었는지 여부는 신경 쓰지 않습니다.
Windows에서 이것을 구현하는 것은 다른 사이트에 대한 질문입니다.
책을 읽지 않고 이에 대해 더 자세히 읽으려면 Linux 파일 시스템과 inode를 검색하면 됩니다. 명확한 답은 없을 수도 있지만, 그 이유를 이해할 수 있을 것입니다.