Study · 운영체제 · 디렉터리 · 파일과 디렉터리
디렉터리는 「이름 → 번호」를 적어 둔 파일이다
mkdir work 를 하면 링크 수(= 이것을 가리키는 이름의 개수)가 2 로 시작한다. 왜 1 이 아니라 2 일까?
$ mkdir work
$ ls -ld work
drwxrwxr-x 2 tghan tghan 4096 Sep 21 14:05 work
# ↑ 이 2 가 링크 수다
$ ls -di work # work 자신의 번호
1441802 work
$ ls -ai work # work 안에 있는 두 줄 — . 의 번호가 work 자신과 같다
1441802 . 1441795 ..
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
▶ 를 누르면 mkdir work 한 번에 링크 수가 왜 1 이 아니라 2 에서 시작하는지 따라간다. 디렉터리도 알맹이를 가진 파일이고, 그 알맹이에 적히는 첫 두 줄이 . 과 .. 이라는 것이 이 장면의 요지다. 이 장면은 우분투 기본 파일 시스템인 ext4 를 기준으로 한다 — XFS 나 Btrfs 면 VFS 아래 절반이 다르다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
디렉터리도 파일이고, 그 안에는 처음부터 . 과 .. 두 줄이 있다. 링크 수가 1 이 아니라 2 로 시작하는 것이 그 증거다.
어떻게 확인했나
소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.
- . 과 .. 을 만드는 것은 vfs_mkdir(fs/namei.c:5381)이 아니라 ext4 다. vfs_mkdir 은 dir->i_op->mkdir(:5410)로 넘기고, ext4_mkdir(fs/ext4/namei.c:2997) → ext4_init_new_dir(:2971) → ext4_init_dirblock(:2925)이 새 디렉터리의 첫 블록에 두 줄을 직접 쓴다 — . 은 자기 i_ino(:2936 · :2940), .. 은 parent_ino(:2944 · :2946)를 가리킨다. 소스에서 확인했다.
- 링크 수 2 는 ext4_init_new_dir 의 set_nlink(inode, 2)(fs/ext4/namei.c:2986) 한 줄이다. 파일이 1 로 시작하는 것(fs/inode.c:238)과 다른 이유가 그 두 줄이다.
- 하위 디렉터리를 만들 때 부모가 느는 자리는 ext4_mkdir 의 ext4_inc_count(dir)(fs/ext4/namei.c:3042)이고, 그 함수는 inc_nlink(:2763)를 부른다. 늘려도 되는지는 만들기 전에 vfs_mkdir 이 dir->i_nlink >= max_links(fs/namei.c:5403)로 미리 막는다 — 아직 아무것도 안 만든 자리에서 부모의 링크 수를 보고 있다는 것이 뒤의 증가를 미리 말해 준다.
- mkdir work 직후 링크 수가 2 였고(자기 안의 . 과 부모 안의 work 줄), work/sub 을 만들자 work 가 3 으로 늘고 sub 은 2 로 시작했다. 늘어난 1 은 sub 안의 .. 다.
항목 지도목차 ›
- 계정과 권한
- 1 로그인 — 로그인하면 무슨 일이 일어나나
- 2 계정 만들기 — 계정을 만들면 어디에 무엇이 쓰이나
- 3 권한 주기 — chmod 가 바꾸는 것은 어디에 있나
- 4 권한 검사 — 파일을 열 때 권한을 언제 보나
- 파일과 디렉터리
- 5 파일 만들기 — 파일을 만들면 무엇이 생기나
- 6 디렉터리 — 디렉터리를 만들면 무엇이 생기나
- 7 파일 읽기 — 파일을 읽으면 어디를 거치나
- 8 파일 지우기 — 파일을 지우면 정말 사라지나
- 프로세스
- 9 명령 실행 — 명령 하나를 치면 무슨 일이 벌어지나
- 10 파일 디스크립터 — 프로세스가 파일을 열면 무엇이 늘어나나
- 11 CPU 나누기 — CPU 하나를 여럿이 어떻게 나눠 쓰나
- 메모리
- 12 메모리 요청 — 메모리를 달라고 하면 바로 주나
- 13 페이지 폴트 — 처음 건드릴 때 무슨 일이 일어나나
- 14 OOM — 메모리가 모자라면 누가 죽나
- 네트워크
- 15 소켓 만들기 — 소켓을 만들면 무엇을 받나
- 16 연결 받기 — 연결이 들어오면 누가 먼저 받나
- 17 주고받기 — 데이터가 오갈 때 무엇이 움직이나