ext4는 디렉토리 크기를 어디에 저장합니까?

ext4는 디렉토리 크기를 어디에 저장합니까?

ext4는 디렉토리 크기를 어디에 저장합니까? 디렉토리 inode에 저장되어 있습니까?

예를 들어, 실행하면 du -h디렉터리의 크기가 즉시 반환되므로 그 당시에 계산한다고는 믿을 수 없습니다.

저는 Linux에서 ext4를 사용하고 있습니다.

답변1

사용법은 strace실제로 파일에 대한 디렉터리를 쿼리하여 파일 크기가 계산되었음을 나타내는 것 같습니다.

3개의 1MB 파일로 디렉토리를 채운다고 가정해 보겠습니다.

$ mkdir adir
$ fallocate -l 1M adir/afile1.txt
$ fallocate -l 1M adir/afile2.txt
$ fallocate -l 1M adir/afile3.txt

du -h이제 명령을 추적하면 다음과 같습니다 .

$ strace -s 2000 -o du.log du -h adir/
3.1M    adir/

strace생성된 로그 파일 보기 du.log:

...
newfstatat(AT_FDCWD, "adir/", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
fcntl(3, F_DUPFD, 3)                    = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getdents(3, /* 5 entries */, 32768)     = 144
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
newfstatat(4, "afile2.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile3.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile1.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
brk(0)                                  = 0x231a000
...

newfstatat시스템 호출을 발견하셨나요 ? 그러면 각 파일의 크기가 결정됩니다.

다른 배경

관심이 있으시면 여기에서 이 주제에 대한 추가 정보를 확인하세요.

  1. 이 동작은 EXT4와 무관합니다. 이것이 Unix에서 파일 시스템이 작동하는 방식입니다.
  2. stat명령은 파일 시스템 개체(디렉터리 또는 파일)의 크기 이외의 항목을 쿼리하는 기능을 제공하지 않습니다.

    $ stat adir/
      File: ‘adir/’
      Size: 4096        Blocks: 8          IO Block: 4096   directory
    Device: fd02h/64770d    Inode: 11539929    Links: 2
    Access: (0775/drwxrwxr-x)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
    Context: unconfined_u:object_r:user_home_t:s0
    Access: 2014-04-15 22:29:25.289639888 -0400
    Modify: 2014-04-15 22:29:44.977638542 -0400
    Change: 2014-04-15 22:29:44.977638542 -0400
     Birth: -
    

    4096바이트라는 점에 유의하세요. 이는 디렉터리에 포함된 내용이 아니라 디렉터리 자체의 실제 크기입니다.

인용하다

관련 정보