리눅스 파일 시스템의 맨 밑바닥 이야기, 3 판
다른 어느 책에도 나오지 않는, 덮개는 다 벗긴 맨 밑바닥 이야기

김 경석 지음;
2016.03.07. 발행 (제일 출판). 422 쪽, ISBN 978-89-6544-026-0

[Title: Book: A Story of the Bottom of Linux File Systems, 3rd edition (published in Mar. 2016)
by GIM, Gyeongseog/KIM, Kyongsok; in Hangeul (Korean)]

- 고침과 바로 잡음 표, 새로 넣은 내용 (errata)
- 이 책을 구하시려면 직접 주문하세요.
. How to order book(s) outside of South Korea:

머리말 (1 판)

유닉스를 처음 쓰게 된 때는 1982 년 미국 유학 갔을 때이다. 그 전에는 명령 한 줄을 펀치 카드(punch card) 한 장에 쳐서 읽히던 IBM 대형 기계 환경에서 간단한 명령(JCL)에 익숙했던 터라 처음 써보는 유닉스는 굉장히 낯설었다. 이제는 정말 편안한 마음으로 리눅스를 쓴다. 그러고 보니 유닉스/리눅스를 쓴 지가 벌써 30 년이 넘었다. 2000 년쯤부터 그리 비싸지 않은 인텔 칩 PC에서 리눅스를 연구실에서 많이 쓰고 있지만, 그 전에는 유닉스를 쓸 수 있는 워크스테이션(workstation)은 일반 PC보다 엄청나게 비쌌다. 리눅스가 일반인들에게 널리 퍼진 이유 가운데 하나는 싼 인텔 칩 PC에서 공개 리눅스를 쓸 수 있기 때문이 아닌가 한다. 세상이 참 많이 바뀌었다.

이 책에서 가장 중요하고 자랑할 수 있는 부분은 제 6 장이다. 2011 년 농협 전산망 해킹 때 썼다고 하여 유명해진 dd 명령이 기본 도구이다. 제 6 장에서 dd 명령을 마음껏 써보자. 구체적으로 dd와 xxd 명령으로 directory entry, Inode, Data Block 등을 거쳐서 마지막에는 보통 파일(regular file), fast symlink (= fast symbolic link = fast soft link)와 slow symlink(= slow symbolic link = slow soft link), 그리고 directory의 내용을 찍어낸다. 중요한 것은 리눅스 함수를 통하여 파일을 읽는 것이 아니라, dd 명령으로 디스크의 바닥을 그냥 읽는다는 것이다.

그런데 이 방식은 다른 책에서는 거의 볼 수 없는 접근 방식이며, 이 접근 방식이 이 책의 특징이자 크나큰 자랑이다. 또한 이 책에서 가장 중요한 부분이기도 하다. 어찌 보면 제 1 ~ 5 장은 제 6 장을 위하여 바탕을 다지는 과정이라고 볼 수 있다. 제 6 장까지 마치고 나면, 리눅스 파일 시스템 ext2에 대한 이해가 크게 늘어날 것이라고 믿는다.

2008 년에 이런 내용의 강의를 구상하고 인터넷 등을 통하여 자료를 찾아보았지만 찾을 수 없었다. 리눅스를 잘 아는 사람들에게 물어보니 모두를 그런 자료는 아예 없다고 하였다. 그래서 글쓴이는 "자료가 없으면 내가 만들면 되지" -- 하는 무모한(?) 생각으로 2008 년에 자료를 준비하기 시작하여 2009 년에 처음으로 제 6 장의 dd/xxd 접근 방식을 강의하였다. 처음에는 정말 힘들었다. 흔히들 말하는 맨 땅에 뭐하는 셈이었다. 거의 아무런 기초 자료도 없이 스스로 생각하면서 헤쳐나갔다. 그리고 강의를 해나가면서 자료를 점점 더 보완하여, 4 년이 지나자 이제 강의 자료도 어느 정도 안정되어 책을 쓰기에 이른 것이다. 제 6 장의 접근 방식을 찾아낸 뒤 약 4 년 만에 책을 쓰게 된 것이다.

아직도 해결하지 못 한 중요한 문제가 하나 있다. 새로 파일을 만들고 나서 리눅스의 함수를 거치지 않고 dd/xxd 명령으로 디스크를 바로 읽어보면 아직 반영되어 있지 않은 때가 더러 있었다. sync 명령도 도움이 되지 않았다. 현재까지 찾아낸 임시(?) 해결 방안은 reboot이다. 6.1 절 바로 앞에 이 얘기가 좀 더 자세하게 나와 있는데, reboot가 아닌 더 좋은 해결 방안을 아시는 분은 지은이에게 알려줄 것을 부탁한다.

한 가지 아쉬운 점은, 이 책의 내용이 다른 책에서는 거의 찾아볼 수 없는 새로운 내용이고 또한 컴퓨터 안에서도 상당히 전문적인 분야이다 보니 영어 용어를 한글로 제대로 바꾸지 못 했다는 점이다. 이 점은 앞으로 고칠 점이다.

늘 바쁘게 살다보니 밤에도 늦게 자고 주말에도 이런 저런 일로 집안 일을 잘 하지 못 할 때가 많아, 아내에게 많이 미안하다. 언제쯤이면 일 때문에 바쁘게 살지 않아도 될 날이 올지 모르겠다.

2013 년 (단기 4346 년) 2 월, 금샘 기슭에서, 지은이 김 경석


머리말 (2 판)

1 판 책으로 두 해 동안 강의하면서 학생들의 물음에 대한 답변 내용을 이번 2 판에 전반적으로 많이 보완했을 뿐만 아니라, 그 밖에 오타, 사소한 잘못 등을 바로잡았다. 2 판의 책 내용이 훨씬 더 알차졌다고 믿는다.

이 책(첫째 보따리)은 디스크를 읽고 분석하기만 한다. 그런데 inode의 쓰지 않는 자리에 사용자가 정의한 자료를 넣어서 디스크에 write 하기에 대한 분석을 마쳤고 기초 자료도 다 준비되어 있다. 하지만 그것을 리눅스 둘째 보따리 책으로 출판할 수 있을지는 잘 모르겠다. 책을 한 권 쓰려면 엄청난 시간이 들어가기 때문에 시작할 엄두가 나지 않는다.

2015 년 (단기 4348 년) 1 월, 금샘 기슭에서, 지은이 김 경석


머리말 (3 판)

6 장에 dd/xxd를 위한 양식을 새로 넣고, 중요한 structure를 끝의 붙임에 모아서 찾아보기 쉽게 하였다. 그리고 전체적으로 내용을 잘 가다듬고 바로잡았다.

2016 년 (단기 4349 년) 1 월, 금샘 기슭에서, 지은이 김 경석

* 책에서 틀린 부분을 바로잡거나 보완한 내용은 아래 주소에 올려 놓겠다. http://asadal.pnu.kr/~gimgs0/book/


책 주요 내용: 목차 (장, 절 제목만)
목차 (장, 절 제목)

머리말 (1 판)	1
머리말 (2 판)	2
머리말 (3 판)	2
목차 (장, 절 제목)	3
상세 목차 (장, 절, 세절 제목)	5

제 1 장 Inode란 무엇인가?	13
1.1 directory, Inode, Data Block의 개념	15
1.2 cp, hard link (link/ln), soft link (ln -s) 명령과 Inode, Data Block	22
1.3 rm 명령과 Inode, Data Block	37
1.4 디렉토리의 참조 회수 (reference count)	53
1.5 cp, link (ln), ln -s 한 뒤 파일 둘의 내용이 같이 바뀌는지?	55
1.6 partition 안에서 mv 명령으로 파일을 다른 디렉토리에 옮기면?	60
1.7 Inode 번호와 Data Block 번호는 각 partition 안에서만 유일하다	63
1.8 partition을 넘어가는 mv 명령의 결과는?	66
1.9 hard link로는 안 되지만 soft link로는 되는 것은?	68
1.10 mount와 umount 명령, /etc/fstab, /etc/mtab 파일	70

제 2 장 directory, Data Block, 참조 회수, Endian	97
2.1 디렉토리(directory)와 데이터 블록(Data Block)	99
2.2 참조 회수(reference count, hard link count)	100
2.3 ls -F 명령으로 directory, soft link, pipe, socket 확인하기	106
2.4 readdir ( )과 struct dirent, lstat ( )과 struct stat	109
2.5 sync ( ) 함수	115
2.6 man -k 명령과 원하는 section에 있는 man page 찾기	117
2.7 Endian 엔디안	120
2.8 그 밖에 알아두면 좋은 점	140

제 3 장 디렉토리 항목 (directory entry) 프로그램: readdir ( ), struct dirent	141
3.1 directory: 보통의 파일과 비슷하지만 조금은 다른 파일	143
3.2 conditional compilation: cpp (c preprocessor)	149
3.3 struct dirent	151
3.4 directory entry를 다루는 보기 프로그램	153
3.5 scandir ( ) 함수를 활용하기	165
3.6 strerror ( ), perror ( ), error ( ), err, errno, errno.h	167

제 4 장 Inode 프로그램: lstat ( ), struct stat	179
4.1 /etc/passwd, /etc/group 파일과 chdir ( ) 함수	183
4.2 chmod, permission, file type, directory search	195
4.3 sticky bit, sticky directory	206
4.4 SetUID, SetGID	211
4.5 lstat ( ) 함수, struct stat (2.4.2, 5.8, 5.9.1 절 참조)	221
4.6 lstat ( )과 struct stat를 활용하는 프로그램	228
4.7 stat 명령	244

제 5 장 ext2 구조 소개: Superblock (SB), Group Descriptor Table (GDT), Data Block (DB)	249
5.1 ext2의 구조 소개	252
5.2 BG 당 Data Block 최대 개수, BG 크기, IT 크기	260
5.3 partition 당 BG 수, GDT 크기	267
5.4 BG 안에서 여섯 가지 자료가 차지하는 비율	270
5.5 Superblock (SB): struct ext2_super_block	272
5.6 GDT (Group Descriptor Table): ext2_group_desc	279
5.7 Block bitmap(Bbm)과 Inode bitmap(Ibm)	280
5.8 Inode: struct ext2_inode와 struct stat의 차이 (2.4.2, 4.5 절 참조)	281
5.9 Inode의 i_mode(file mode)와 i_block [ ] (블록 포인터) 	288
5.10 directory entry: struct ext2_dir_entry_2와 struct dirent의 차이	299
5.11 dumpe2fs 명령	309
5.12 디스크 (SCSI/SATA, IDE/PATA) volume 이름, partition 이름	315
5.13 그 밖에 ext2 관련 명령 몇 가지	316
5.14 터미널 프로그램에서 리눅스에 연결하여 한글을 제대로 보기	320

제 6 장 dd와 xxd 명령으로 dir_entry, Inode, Data Block 찾아가기	323
6.1 dd와 xxd 명령 사용법	328
6.2 root directory에 있는 directory entry를 분석하기	333
6.3 dd와 xxd 명령으로 /B.TXT 파일의 내용을 찍어내기	338
6.4 dumpe2fs, ls -il, dd, xxd 명령으로 f21.txt 내용을 찍어내기	358
6.5 dumpe2fs, ls -il, dd, xxd 명령으로 fastsym5 내용을 찍어내기	367
6.6 dumpe2fs, ls -il, dd, xxd 명령으로 slowsym7 내용을 찍어내기	375
6.7 dumpe2fs, ls -il, dd, xxd 명령으로 dir9 내용을 찍어내기	389
6.8 MBR (Master Boot Record)	401

붙임. 중요한 structure와 그림 모음	403

찾아 보기 (index)	413

지은이 소개	423
김 경석이 지은 다른 책 소개	424