나는 차고 세일에서 Kernighan과 Pike가 쓴 "The Unix 프로그래밍 환경"의 사본을 받았습니다. 나는 UNIX 파일 시스템에 관한 장에 매우 관심이 있었습니다. 물론 나는 이 구절도 흥미롭다고 생각한다.
이제 디렉토리의 바이트를 살펴볼 차례입니다.
$ od -cb . 0000000 4 ; . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 064 073 056 000 000 000 000 000 000 000 000 000 000 000 000 000 ....
너무 길어서 다 쓰지는 않겠습니다. 요점은 시스템에 저장된 디렉토리를 표시한다는 것입니다. 나는 그것을 시험해 보기 위해 재빨리 내 노트북(Debian)으로 달려갔습니다. 책에 나온대로 명령어를 입력했어요.
$ od -cb .
od: .: read error: Is a directory
0000000
분명히 디렉토리의 원래 내용을 볼 수는 없습니다. 이것이 내 문제입니다.
Linux 커널은 원래 UNIX 커널과 다르게 디렉토리를 저장합니까? 그렇지 않다면 사용자에게 디렉토리의 실제 바이트를 숨겨야 하는 이유는 무엇입니까?
답변1
각파일 시스템유형은 디렉토리를 다양한 방식으로 저장합니다. 높은 처리량에 적합, 높은 동시성에 적합, 제한된 메모리 환경에 적합, 읽기 및 쓰기 성능 간의 다양한 절충, 복잡성 및 안정성 등 다양한 특성을 지닌 다양한 파일 시스템 유형이 있습니다. 당신의 책은 초기 유닉스 시스템에서 사용된 파일 시스템을 설명합니다. 최신 시스템은 다양한 파일 시스템을 지원합니다.
초기 버전의 Unix에는 커널 외부에서 많은 파일 시스템 작업이 있었습니다. 예를 들어 일부 파일 시스템 데이터 구조를 직접 편집하여 작업할 수 있습니다 mkdir
. rmdir
이는 통합 디렉터리 액세스 인터페이스로 빠르게 대체되었습니다.opendir
readdir
//closedir
시리즈는 애플리케이션이 뒤에서 어떻게 구현되는지 알지 못한 채 디렉토리를 조작할 수 있게 해줍니다.
Linux에서 디렉터리 내용을 읽을 수 없는 이유는 디렉터리 내용을 숨겨야 하기 때문이 아니라 해당 기능이 구현되어야만 존재하고 이 기능은 의미가 없으며 비용이 발생하기 때문입니다. 형식이 파일 시스템에 따라 다르다는 점을 고려하면 이는 무의미한 기능입니다. 프로그램은 읽고 있는 내용의 형식을 알 수 있는 방법이 없습니다. 두 가지를 모두 지원하는 것은 완전히 사소한 기능이 아닙니다. 일부 파일 시스템은 바이트 스트림보다 더 많은 방법으로 디렉터리를 구성합니다. 예를 들어 다음과 같이 구성할 수 있습니다.B-트리. 일부 Unix 변종에서는 이전 버전과의 호환성을 위해 여전히 응용 프로그램이 디렉터리 내용을 직접 읽을 수 있도록 허용하지만 Linux에는 이 기능이 없습니다(제가 기억하는 한 한 번도 없었습니다. 이 기능은 이미 1990년대 초반에 사용되지 않는 기능이었습니다).
답변2
네,하지만:
- 최신 시스템은 파일 이름을 다양한 방식으로 저장합니다. 원래 Unix에서는 이름이 14자로 제한되었으며 그 중 2바이트가 inode로 사용되었습니다.
- 디렉토리에 대한 인터페이스는 다음 함수를 통해 이루어집니다.
opendir
,readdir
,closedir
open
,read
가 아닌close
조직의 변화를 반영합니다. - 실제로 16바이트 디렉토리 항목을 읽을 필요가 있는 사람은 없기 때문에 디자이너는 원시 디렉토리 파일을 읽도록 설계된 프로그램에서 원시 디렉토리 파일을 읽는 기능을 무시했습니다.문서.
추가 자료:
- 가이드: Linux에서 C 프로그래밍을 위한 디렉터리 사용
- opendir, readdir 등에 대한 질문입니다., 1990년 유즈넷 스레드에 대한 논의현대의구현
opendir
등
답변3
예, Linux 커널은 VFS를 사용하여 다양한 파일 시스템을 추상화하며 디렉토리 사용을 허용하지 않습니다 read(2)
.
그러나 Linux EXT2/3/4 파일 시스템에 있는 디렉토리의 원시 내용에 정말로 관심이 있다면 이 debugfs(8)
유틸리티를 사용할 수 있습니다. 이 유틸리티를 사용하면 e2fsprogs
디렉토리를 일반 파일로 읽거나 덤프할 수 있습니다.