[Unix]디렉토리파일(inode number+filename)의 내용

gyxor의 이미지

unix책에서 디렉토리 관련 부분을 봤습니다.
만약 현재 디렉토리안에 fred,bookmark,abc라는 파일이 있다면
123.\0
247..\0
120fred\0
207bookmark\0
235abc\0
뭐이런식으로 가장먼저 inode number가 오고
그다음에 화일명이 온다고 그림으로 그려져 있습니다.
________________________________________________________
위 내용대로 되어있는지 Unix OSF/1 v.4.0d 시스템에서
디렉토리 내용을 확인해 봤습니다.
(리눅스에서는 "od -c ." 명령을 혀용하지 않았습니다.)

__현재(.) 디렉토리 내용__
.
..
dir1
dir2
__(./dir1) 디렉토리 내용__
.
..
nnn
ppp
__(./dir2) 디렉토리 내용__
.
..
test
a.out
.hid

inhavision.inha.ac.kr> od -c .
0000000 W 253 \n \0 \f \0 001 \0 . \0 \0 \0 211 ` \t \0
0000020 \f \0 002 \0 . . \0 \0 300 346 \n \0 020 \0 004 \0
0000040 d i r 1 \0 d 0 \0 036 005 \v \0 330 001 004 \0
0000060 d i r 2 \0 d 0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0001000
inhavision.inha.ac.kr> od -c ./dir1
0000000 300 346 \n \0 \f \0 001 \0 . \0 \0 \0 W 253 \n \0
0000020 \f \0 002 \0 . . \0 \0 공백 347 \n \0 \f \0 003 \0
0000040 n n n \0 " 347 \n \0 334 001 003 \0 p p p \0
0000060 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0001000
inhavision.inha.ac.kr> od -c ./dir2
0000000 036 005 \v \0 \f \0 001 \0 . \0 \0 \0 W 253 \n \0
0000020 \f \0 002 \0 . . \0 \0 037 005 \v \0 020 \0 004 \0
0000040 t e s t \0 9 6 3 공백 005 \v \0 020 \0 005 \0
0000060 a . o u t \0 6 3 ! 005 \v \0 310 001 004 \0
0000100 . h i d \0 9 6 3 \0 \0 \0 \0 \0 \0 \0 \0
0000120 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0001000

저의 파일 시스템의 총 inode블록 개수를 df명령어로 확인해본 결과
3바이트 사이즈만 있어도 inode블록모두를 주소 지정을 할 수 있는 사이즈 였습니다.
그런데 위 내용을 보면 파일명 앞의 공간이 8바이트+a 가 되는것을 알수 있었습니다.
크기가 파일마다 다른것도 이상했고 왜 8바이트나 되는지도 이상했습니다.
그런데 자세히 살펴본 결과
inode number를 위해서는 null을 포함해서 4바이트를 사용하고 있었고(여기까진 생각한대로 였지만)
그외에 파일의 종류에 따라서 고유의 값들이 들어가 있었습니다.

"."의 경우에
036 005 \v \0 \f \0 001 \0 . \0 \0 \0
앞의 네자리 036 005 \v \0 는 inode number이고
그 뒤로 \f \0 001 \0 는 모든 디렉토리에서 "." 파일인 경우에 들어갑니다.
그리고 파일명 뒤쪽으로 한개의 null을 제외하고 \0 \0 두개의 null이 나옵니다.

".."의 경우엔
W 253 \n \0 \f \0 002 \0 . . \0 \0
앞의 네자리 W 253 \n \0 는 inode number이고
그 뒤로 \f \0 002 \0 는 모든 디렉토리에서 ".." 파일인 경우에 들어갑니다.
그리고 파일명 뒤쪽으로 한개의 null을 제외하고 \0 한개의 null이 더 나옵니다.

"dir1" "dir2" 디렉토리 파일의 경우엔
300 346 \n \0 020 \0 004 \0 d i r 1 \0 d 0 \0
036 005 \v \0 330 001 004 \0 d i r 2 \0 d 0 \0
앞의 네자리 inode number
그 뒤로 알수 없는 네자리가 오고
파일명 뒤쪽으로 d 0 \0 이런 값이 옵니다.

"test" "a.out" "의경우엔 뒤쪽으로 이상한 값들이 오는것을 봤습니다.
파일의 종류에 따라 붙는것인줄 알았는데 파일이름의 길이에 따라 붙는것이었습니다.
1글자 : r 2
2글자 : 2
3글자 : 안붙습니다.
4글자 : 9 6 3
5글자 : 6 3
6글자 : 3
7글자 : 안붙습니다.
8글자 : n \0 c
9글자 : \0 c

0000000 036 005 \v \0 \f \0 001 \0 . \0 \0 \0 W 253 \n \0
0000020 \f \0 002 \0 . . \0 \0 037 005 \v \0 020 \0 004 \0
0000040 t e s t \0 9 6 3 005 \v \0 020 \0 005 \0
0000060 a . o u t \0 6 3 ! 005 \v \0 020 \0 004 \0
0000100 . h i d \0 9 6 3 " 005 \v \0 020 \0 005 \0
0000120 b . o u t \0 6 3 # 005 \v \0 020 \0 004 \0
0000140 k l d p \0 9 6 3 $ 005 \v \0 \f \0 003 \0
0000160 e l e \0 % 005 \v \0 020 \0 004 \0 t t t t
0000200 \0 9 6 3 & 005 \v \0 020 \0 005 \0 k k k k
0000220 k \0 6 3 ' 005 \v \0 020 \0 005 \0 u u u u
0000240 u \0 6 3 ( 005 \v \0 020 \0 006 \0 h h h h
0000260 h h \0 3 ) 005 \v \0 \f \0 001 \0 y \0 r 2
0000300 * 005 \v \0 \f \0 001 \0 j \0 r 2 + 005 \v \0
0000320 \f \0 002 \0 g g \0 2 , 005 \v \0 020 \0 \a \0
0000340 7 7 7 7 7 7 7 \0 - 005 \v \0 024 \0 \b \0
0000360 8 8 8 8 8 8 8 8 \0 n \0 c . 005 \v \0
0000400 024 \0 \t \0 9 9 9 9 9 9 9 9 9 \0 \0 c
0000420 / 005 \v \0 360 \0 \b \0 8 c c c c c c c
0000440 \0 n \0 c \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000460 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

각 파일의 mode값 같은것도 inode block에 들어가 있고
따라서
디렉토리 화일의 구성한는것은 inode number와 filename 그리고 위에서 처럼
값들을 구분해줄 수 있는 delimeter (null) 만 있으면 된다고 생각합니다.

질문을 하자면

파랑색으로 표시된 4bytes 값과 오렌지색으로 표시된 파일명 뒤에 나오는
파일이름길이에 따라 다른 고유의 값들이 왜 필요한지 모르겠습니다.
이런 값들이 있어야 하는 이유를 알고 싶습니다.
답변 부탁드립니다.

cjh의 이미지

dirent 매뉴얼 페이지를 보세요.

--
익스펙토 페트로눔

sangwoo의 이미지

FreeBSD 기준으로 말씀드리겠습니다. (아마 딴 운영체제도 비슷하리라 생각됩니다.)

먼저 처음의 4바이트는, 생각하신대로 inode가 맞습니다. 다만, 네번째에
공통적으로 등장하는 '\0'은 nul 캐릭터가 아니라, 0입니다. :-) 리틀 엔디안의
32bit unsigned integer 값인거죠. 이건 ls -i 의 값과, od -t u4 . 의 값을 비교하면
금방 알아챌 수 있으실 겁니다.

그리고 그 이후의 파란색 값들은, 사실은 하나의 16bit unsigned 값과, 두개의
8bit unsigned 값으로 구성되어 있습니다.
첫번째의 16bit unsigned 값은, 이 디렉토리 엔트리의 길이입니다. 그리고 그 다음
한 바이트는 파일의 타입, 그리고 마지막의 한 바이트는 filename의 길이입니다.
님이 올려주신 데이터를 참고하면

inhavision.inha.ac.kr> od -c .
0000000 W 253 \n \0 \f \0 001 \0 . \0 \0 \0

od -t u4 . 를 하시면 처음 4바이트에 해당하는 값, 즉 inode number가
나올 것입니다. 그리고, \f \0 은 12, 즉 이 엔트리의 길이가 12바이트라는
뜻입니다. 그리고 그다음 001 \0은 1, 파일 네임의 길이가 1이라는 뜻이죠.
그리고 파일이름 뒤에 붙는 값들은 의미없는 쓰레기값들로 생각됩니다.
아마 패딩을 위해서 4바이트씩 allocation이 되고, 파일이름을 저장하고 남은
공간에 먼저 들어있던 의미없는 값들이 남아있는게 아닌가 생각됩니다.

좀더 자세한 설명은 getdirentries(2)를 보시면 되겠습니다.

----
Let's shut up and code.

gyxor의 이미지

학기중이라 확인해 보는데 시간이 많이 걸렸습니다...
getdirentries 페이지를 살펴보니
말씀하신대로 파란색의 첫 두 바이트는 디렉토리 엔트리 길이 였습니다. 그 길이는 다음에 생성되는
파일 또는 디렉토리 정보를 해당 디렉토리 파일에서 처음 위치로 부터 offset를 계산해서 마지막에
추가하기 위해 필요하다는것을 알았습니다.
또한 파일이름 길이가 한바이트여서 파일 길이가 255가 최대라는것도 알게 됐습니다. 감사합니다
마지막에 추가된 파일 또는 디렉토리의 reclen(엔트리길이) 는
256바이트를 기준으로 남은 바이트 수가 되던데요.. 그래서
앞서..
0000000 W 253 \n \0 \f \0 001 \0 . \0 \0 \0 211 ` \t \0
0000020 \f \0 002 \0 . . \0 \0 300 346 \n \0 020 \0 004 \0
0000040 d i r 1 \0 d 0 \0 036 005 \v \0 330 001 004 \0
0000060 d i r 2 \0 d 0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

여기에서
\f + \f + 020 + 330 = 12 + 12 + 16 + 216 = 256
이 되는데요..
디렉토리 사이즈가 512인데 왜 512를 기준으로 안하는지
의문이 남습니다.

또한 오렌지 색으로 되어있는것은 파일이름 길이에 따라서 분명히
규칙적으로 적용이 되고 있는데요 따라서 garbage값은 아닌것
으로 보이는데... 무엇인지 모르겠습니다. 설명도 없고..
나중에 더 자세히 봐야겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.