모든 디렉토리의 크기가 4096 바이트 (4K) 인 이유는 무엇입니까?


32

주제가 말한대로; 크기가 4K보다 큰 파일을 포함하더라도 모든 디렉토리의 크기가 4K 인 이유를 알고 싶습니다.

다음을 살펴보십시오 :-

$ ls -lh
total 2.0M
drwxr-xr-x 4 ankit ankit 4.0K Sep 11 07:28 Desktop

$ ls -lrh Desktop/
-rw-rw-r-- 1 ankit ankit 9.1M Aug 4 11:15 sophosthreatsaurusaz.pdf
-rw------- 1 ankit ankit 107K Dec 27 2010 KP 3 0.pdf
drwxrwsr-x 9 ankit ankit 4.0K Sep 10 19:26 eclipse

추신 : du -sh커맨드 라인 유틸리티를 알고 있습니다.

편집 : 디렉토리를 파일 컨테이너로 가정합니다.


디렉토리의 메타 데이터입니다
Tachyons

답변:


33
  • 너무 기술적이지 않고 디렉토리 항목을 단순히 목록에 대한 "링크"라고 생각 하십시오. 디렉토리에 포함 된 파일 에 .
  • 그런 다음 모든 것과 마찬가지로 해당 링크ls 의 크기 보여줍니다. 과 마찬가지로 디렉토리의 내용이 차지하는 총 공간이 아니라 .
  • 파일 또는 디렉토리 항목 / 링크가 차지해야하는 최소 크기는 하나의 블록으로, 대부분의 ext3 / 4 파일 시스템에서 보통 4096 바이트 / 4K입니다.

7
"파일 또는 디렉토리 항목 / 링크가 차지해야하는 최소 크기는 하나의 블록"이라고 말하지만 파일 크기가 4K 미만인 것을 확신합니다.
Lakshay Garg

1
@LakshayGarg 파일은 4K 미만일 수 있지만 작은 파일을 저장하는 데 몇 바이트의 블록 만 사용 된 "내부 조각화"라는 원인이됩니다.
phyloflash

@phyloflash 일부 파일 시스템 (예 : NTFS)은 작은 파일을 파일 항목 자체에 저장합니다 (NTFS의 경우 MFT 항목에 있음). 이러한 방식으로 내용이 0 할당 블록을 차지하고 내부 조각화가 줄어 듭니다.
Ruslan

26

이를 이해하려면 다음 (파일 시스템)에 대한 기본 지식이 있어야합니다.

  • inode (파일 속성, 파일 메타 데이터, 포인터 구조 포함)
  • 파일 ( 파일 이름 및 inode라는 2 개의 열이있는 테이블로 간주 될 수 있음, inode는 블록 장치의 원시 데이터 블록을 가리킴)
  • directory (특수 파일, 다른 파일 이름의 컨테이너. 각 파일 이름의 파일 이름 및 inode 번호 배열을 포함합니다. 또한 부모와 자식 사이의 관계를 설명합니다.)
  • 심볼릭 링크 VS 하드 링크
  • dentry (디렉토리 항목)
  • ...

일반적인 ext4파일 시스템 (대부분의 사람들이 사용하는 것)에서 기본 inode크기는 256 바이트이고 블록 크기는 4096 바이트입니다.

디렉토리는 파일 이름과 inode 번호의 배열을 포함하는 특수 파일입니다. 디렉토리가 작성 될 때 파일 시스템은 "filename"(실제로 디렉토리 이름)을 가진 디렉토리에 1 개의 inode를 할당했습니다. inode는 4096 바이트 인 단일 데이터 블록 (최소 오버 헤드)을 가리 킵니다. 따라서을 사용할 때 4096 / 4.0K가 ​​표시됩니다 ls.

tune2fs& 를 사용하여 세부 사항을 얻을 수 있습니다 dumpe2fs.

root@ubuntu:~# tune2fs -l /dev/ubuntu/root 
tune2fs 1.42 (29-Nov-2011)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          2fca4cbb-22f1-4328-ab13-cacedb360930
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              967680
Block count:              3931136
Reserved block count:     0
Free blocks:              2537341
Free inodes:              517736
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      416
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8064
Inode blocks per group:   504
RAID stride:              35637
Flex block group size:    16
Filesystem created:       Thu Mar 15 14:31:04 2012
Last mount time:          Sat Oct 20 20:28:04 2012
Last write time:          Sat Oct 20 20:23:32 2012
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Oct 20 20:22:57 2012
Check interval:           0 (<none>)
Lifetime writes:          54 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       272350
Default directory hash:   half_md4
Directory Hash Seed:      d582ad79-75a0-4964-9a48-33ddba04df5c
Journal backup:           inode blocks

7

파일에 데이터가 포함 된 경우 (단일 바이트조차도) 디스크의 한 블록 (일반적으로 요즘 4k)을 차지합니다. 파일간에 하나의 블록을 공유 할 수 없습니다. 이는 전체 블록의 공간을 다른 파일에 사용할 수 없으므로 "사용 된"것으로 간주됩니다.

출처

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.