Unix 파일 시스템에서 디렉토리는 어떻게 구현됩니까?


19

내 질문은 디렉토리가 어떻게 구현됩니까? 변수, 예를 들어 테이블, 배열 또는 이와 유사한 데이터 구조를 믿을 수 있습니다. UNIX는 오픈 소스이므로 새 디렉토리를 만들 때 프로그램이 수행하는 작업을 소스에서 확인할 수 있습니다. 주제를 어디에서 보거나 자세히 설명 할 수 있습니까? 그 디렉토리는 내가 이해할 수있는 파일이고 그 디렉토리는 실제로 파일인가? 파일에 "파일"이 저장되어 있는지 거의 확실하지 않지만 거의 모든 것에 대해 단어 파일을 말할 수 있으며 변수를 호출 할 수 있기 때문에 파일이 아닌 것이 무엇인지 확실하지 않습니다. 파일. 예를 들어 링크는 확실히 파일이 아니며 링크는 디렉토리와 비슷하지만 디렉토리가 파일이라는 것을 위반합니까?


1
특정 파일 시스템에 관심이 있습니까?
Ignacio Vazquez-Abrams 1

3
유닉스에서는 모든 것이 파일이다 (역사적 지혜). 그러나 모든 UNIX가 오픈 소스 인 것은 아닙니다. Gnu 's Unix가 아닙니다. Open Solaris는 Open Source Unix이고 Linux는 유닉스 OS 일뿐입니다. :) 그리고 그렇습니다-파일 시스템-Reiserfs? Ext2-3-4? XFS? NFS?
사용자가 알 수 없음

2
링크 실제로 파일이기도합니다.
mattdm

5
심볼릭 링크는 파일입니다. 하드 링크는 파일 시스템 그래프의 가장자리입니다.
dmckee

3
광고 : 운영 체제 개발 사이트 제안에 관심이있을 수 있습니다 .
Gilles 'SO- 악마 그만해'

답변:


22

디렉토리의 내부 구조는 사용중인 파일 시스템에 따라 다릅니다. 무슨 일이 일어나는지 정확히 알고 싶다면 파일 시스템 구현을 살펴보십시오.

기본적으로 대부분의 파일 시스템에서 디렉토리는 파일 이름 (키)과 inode 번호 (값) 사이 의 연관 배열 입니다. 이와 같은 ¹ :

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

이 목록은 (보통) 4KB 블록 체인 내에서 다소 효율적인 방식으로 코딩됩니다. 일반 파일의 내용은 비슷하게 저장됩니다. 디렉토리의 경우 이러한 블록 내에서 실제로 사용되는 크기를 알 필요가 없습니다. 이것이보고 한 디렉토리의 크기 du가 4KB의 배수 인 이유 입니다.

아이 노드는 블록을 함께 묶어 단일 엔티티, 즉 일반적으로 '파일'을 형성합니다. 그것들은 어떤 종류의 주소 인 숫자로 식별되며 각 주소는 일반적으로 단일의 특수 블록으로 저장됩니다.

이 모든 관리는 커널 모드에서 이루어집니다. 소프트웨어 int mkdir(const char *pathname, mode_t mode);는 시스템 호출을 유도 하는 함수를 사용하여 디렉토리를 생성하기 만하면 나머지는 모두 뒤에서 수행됩니다.

링크 구조 정보 :

하드 링크는 파일이 아니며 기존의 inode 엔티티 ²를 참조 하는 새로운 디렉토리 항목 (예 : 이름 – inode 번호 연결) 일뿐입니다. 이는 다른 경로 이름에서 동일한 inode에 액세스 할 수 있음을 의미합니다. 특히 메타 데이터 (권한, 소유권, 타임 스탬프 등)가 inode에 저장되므로 파일에 액세스하기 위해 선택한 경로 이름과는 독립적이며 고유합니다.

심볼릭 링크 파일이며 대상과 구분됩니다. 이는 자체 inode가 있음을 의미합니다. 예전에는 일반 파일처럼 처리 했었습니다. 대상 경로는 데이터 블록에 저장되었습니다. 그러나 이제는 최근 ext 파일 시스템의 효율성상의 이유로 60 바이트보다 짧은 경로가 inode 자체에 저장됩니다 (일반적으로 데이터 블록에 대한 포인터를 저장하는 데 사용되는 필드 사용).


1.를 사용하여 얻었습니다 ls -ai1 testdir.
2. 요즘 유형이 'directory'와 달라야합니다.


프로그래밍 방식으로 디렉토리와 파일의 차이점을 이해할 수 있도록 정교하게 감사합니다.
Niklas

12

Stéphane Gimenez의 게시물을 확장하려면 새 디렉토리를 작성하는 것은 st_mode 값이 S_IFDIR (권한 모드가 있음) 인 새 inode를 작성하고 링크를 사용하여 새 inode의 첫 번째 데이터 블록에 두 개의 항목을 작성하는 프로세스입니다 ( 2) 시스템 호출 : '.' 이 새로운 inode를 가리키고 '..'는 부모 디렉토리를 가리키고, inode와 새로운 디렉토리의 이름으로 부모 디렉토리에 엔트리를 생성합니다-첫 번째와 마지막 부분은 시스템 호출 mknod ( 2). 또한 요즘 우리가 이야기하는 작업에는 root 만 mknod (2)를 사용할 수 있습니다.

예를 들어 mkdir("/home/larry.user/xyzzy", 0666)본질적으로 다음과 같습니다 (SysV days [1]의 C 코드 임).

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "UNIX 시스템 프로그래밍", 1987, pp69-71.

이것은 오류가 발생하기 쉽고 fsck의 주된 이유 중 하나이므로 mkdir (2) 시스템 호출이 작성되었습니다.

amy 파일 시스템 객체는 mknod (2)로 생성 될 수 있습니다 : 일반 파일, 디렉토리, 장치 파일, 심볼릭 링크 등. OP의 질문 중 하나에 대답하기 위해 디렉토리는 파일입니다. "I / O 인터페이스로 작동하는 파일 시스템에 상주하는 inode로 표시되는 객체입니다."


매우 흥미로운 답변에 감사드립니다. 나는 touch빈 파일을 만드는 프로그램의 소스를 보고 그것이 무엇을하는지 알 수 있다고 생각 합니다.
Niklas

2

유닉스 / 리눅스 파일 시스템에 대한 더 많은 정보가 필요하다면 리눅스 커널리눅스 커널 개발에 대한 2 권의 책을 추천합니다 . 리눅스 커널을 이해하기위한 최고의 책입니다.

"공통 파일 모델"Unix 시스템에서 각 디렉토리는 파일로 간주되며 파일 및 디렉토리 목록이 포함됩니다.

VFS (Virtual File Systems)에서 디렉토리는이라는 구조로 표시됩니다 dentry. 는 dentry 캐릭터 이름 (C 갖는 구조이다 d_name ), 아이 노드 (포인터 d_inode ) 및 상위 dentry (포인터 d_parent ). inode는 파일 시스템에서 파일에 대한 정보를 처리하기위한 구조입니다. 예를 들어, 디렉토리가있는 경우 /tmp/test/fooVFS는 경로 이름의 모든 구성 요소에 대해 dentry 오브젝트를 작성합니다. 따라서,에 대한 dentry 객체 , 루트 디렉토리에 /대한 두 번째 dentry 객체 testfoo테스트 디렉토리에 대한 세 번째 dentry 객체를 만듭니다 .


디미트리 감사합니다. 일부 프로젝트가 B-Tree, 이진 트리, trie 또는 연관 배열과 같은 특정 데이터 구조를 선택한 이유를 이해하고 싶습니다. 적절한 데이터 구조 / 데이터 모델을 선택하는 것이 중요하다고 생각합니다. 다른 구현에 대해 배우면 내가 찾고있는 세부 정보가 제공됩니다.
Niklas

1

http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM 을 읽으 면서 시작할 수 있습니다. 보다 자세한 내용은 "4.4 BSD 운영 체제의 설계 및 구현"이라는 훌륭한 고전 서적을 참조하십시오.


링크 주셔서 감사합니다. 두 파일 모두 디렉토리는 기본적으로 파일 또는 디렉토리로 해석되는 배열이라는 것을 알고 있습니다. 내가 틀렸다면 저를 바로 잡으십시오 ..
Niklas

1
디렉토리는 전통적으로 특수하게 형식화 된 파일이지만 더 이상 사실이 아닙니다. en.wikipedia.org/wiki/ReiserFS#Design ReiserFS 및 기타 디렉토리에서 디렉토리는 데이터베이스의 항목입니다. 디렉토리는 배열로 작동 할 수 있지만 이는 프로그래밍 추상화 일뿐입니다.
Bruce Ediger

세부 사항을 지적 해 주셔서 대단히 감사합니다. 이제 파일 시스템이 프로그램 locate이 작동 하는 방법과 이유를 궁금해하는 방법과 실행하여로 케이트 프로그램을 업데이트하는 방법과 관련하여 여전히 궁금 updatedb합니다. 및 인터페이스)
Niklas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.