Study · 운영체제 · 파일 만들기 · 파일과 디렉터리
파일 하나를 만들면 두 곳이 바뀐다
touch a.txt 한 번에 디스크에서 바뀌는 곳은 몇 군데일까? 이름과 내용은 같은 자리에 있을까?
$ touch a.txt
$ ls -i a.txt
1441801 a.txt
$ stat -c 'Inode: %i Links: %h' a.txt # 알맹이 번호와 이름 개수만 뽑아 본다
Inode: 1441801 Links: 1
# 번호는 만들 때마다 달라진다 — 아래 「어떻게 확인했나」의 344736 은 따로 잰 값이다
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
▶ 를 누르면 touch a.txt 한 번에 커널 안에서 무엇이 생기는지 따라간다. 여기서 알맹이라고 부르는 것은 inode 다 — 파일 하나의 크기와 주인과 권한을 모아 둔 커널 안의 기록이고, 파일 이름은 거기 없다. 이름과 알맹이가 서로 다른 자리에 따로 만들어진다는 것이 이 장면의 요지다. 이 장면은 우분투 기본 파일 시스템인 ext4 를 기준으로 한다 — XFS 나 Btrfs 면 VFS 아래 절반이 다르다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
파일 하나를 만들면 알맹이(inode)와 이름(디렉터리 한 줄)이 각각 따로 만들어진다. 둘이 다른 곳에 있다는 것이 뒤의 세 항목을 푸는 열쇠다.
어떻게 확인했나
소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.
- touch 가 지나는 길에 vfs_create 는 없다. openat(O_CREAT) → path_openat(fs/namei.c:4980) → open_last_lookups(:4734) → lookup_open(:4431) 이고, 실제로 만드는 줄은 lookup_open 안의 dir_inode->i_op->create(:4567)다. vfs_create(:4177)는 filename_mknodat(:5293)이 들어오는 다른 문이고, 둘 다 ext4 에서는 ext4_create(fs/ext4/namei.c:2815)로 간다. 소스에서 확인했다.
- 알맹이와 이름이 서로 다른 함수에서 만들어진다 — inode 번호는 __ext4_new_inode(fs/ext4/ialloc.c:933)가 inode->i_ino(:1260)에 매기고, 이름 한 줄은 ext4_add_nondir(fs/ext4/namei.c:2786)이 부른 ext4_add_entry(:2791)가 부모 디렉터리에 적는다. 둘을 잇는 것은 d_instantiate_new(:2796)다.
- 새 inode 의 i_nlink 는 inode_init_always_gfp(fs/inode.c:223)에서 1 로 초기화된다(:238). 권한 아홉 자리와 주인은 inode_init_owner(:2719)가 i_mode(:2731)와 i_uid 에 적는다 — 이름 쪽이 아니라 알맹이 쪽이다.
- 만들 권한은 만들려는 파일이 아니라 부모 디렉터리에 묻는다 — may_o_create(fs/namei.c:4315)의 inode_permission(idmap, dir->dentry->d_inode, MAY_WRITE | MAY_EXEC)(:4326).
- touch new.txt 뒤 stat 은 Inode: 344736, Links: 1 이었다. 갓 만든 파일의 링크 수가 1 인 것은 그 알맹이를 가리키는 이름이 하나뿐이라는 뜻이다.
항목 지도목차 ›
- 계정과 권한
- 1 로그인 — 로그인하면 무슨 일이 일어나나
- 2 계정 만들기 — 계정을 만들면 어디에 무엇이 쓰이나
- 3 권한 주기 — chmod 가 바꾸는 것은 어디에 있나
- 4 권한 검사 — 파일을 열 때 권한을 언제 보나
- 파일과 디렉터리
- 5 파일 만들기 — 파일을 만들면 무엇이 생기나
- 6 디렉터리 — 디렉터리를 만들면 무엇이 생기나
- 7 파일 읽기 — 파일을 읽으면 어디를 거치나
- 8 파일 지우기 — 파일을 지우면 정말 사라지나
- 프로세스
- 9 명령 실행 — 명령 하나를 치면 무슨 일이 벌어지나
- 10 파일 디스크립터 — 프로세스가 파일을 열면 무엇이 늘어나나
- 11 CPU 나누기 — CPU 하나를 여럿이 어떻게 나눠 쓰나
- 메모리
- 12 메모리 요청 — 메모리를 달라고 하면 바로 주나
- 13 페이지 폴트 — 처음 건드릴 때 무슨 일이 일어나나
- 14 OOM — 메모리가 모자라면 누가 죽나
- 네트워크
- 15 소켓 만들기 — 소켓을 만들면 무엇을 받나
- 16 연결 받기 — 연결이 들어오면 누가 먼저 받나
- 17 주고받기 — 데이터가 오갈 때 무엇이 움직이나