Почему каждый каталог имеет размер 4096 байт (4 КБ)?


33

Как говорит субъект; Я хочу знать, почему каждый каталог имеет размер 4 КБ, даже если они содержат файлы размером более 4 КБ.

Пожалуйста, обратите внимание на следующее:

$ 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

PS: я в курсе du -shутилиты командной строки.

Изменить: я предполагаю, каталог в качестве контейнера для файлов.


Это метаданные справочника
Тахионс

Ответы:


34
  • Не вдаваясь в технические аспекты, представьте, что запись в каталоге - это просто «ссылка» на список файлов, которые «содержит» каталог.
  • Затем, как и все, lsпоказывает размер этой ссылки , а не общее пространство, занимаемое содержимым каталога.
  • Минимальный размер файла / записи каталога / ссылки должен занимать один блок, который обычно составляет 4096 байт / 4 КБ в большинстве файловых систем ext3 / 4.

7
Вы говорите, что «минимальный размер файла / записи каталога / ссылки должен занимать один блок», но я уверен, что я видел файлы размером менее 4 КБ.
Лакшай Гарг

1
@LakshayGarg, хотя размер файла может быть меньше 4 КБ, это приведет к так называемой «внутренней фрагментации», когда для хранения небольшого файла использовалось всего несколько байтов блока.
phyloflash

@phyloflash некоторые файловые системы (например, NTFS) хранят небольшие файлы в самих записях файлов (для NTFS это в записи MFT). Таким образом, их содержимое занимает нулевые блоки распределения, и внутренняя фрагментация уменьшается.
Руслан

26

Чтобы понять это, вам лучше иметь базовые знания о следующем (файловая система):

  • inode (содержит атрибуты файла, метаданные файла, структуру указателя)
  • файл (можно рассматривать как таблицу с 2 столбцами, именем файла и его индексом, индекс указывает на блоки необработанных данных на блочном устройстве)
  • каталог (просто специальный файл, контейнер для других имен файлов. Он содержит массив имен файлов и номеров узлов для каждого имени файла. Также он описывает отношения между родителем и потомками.)
  • символическая ссылка VS жесткая ссылка
  • Дентри (записи каталога)
  • ...

В типичной ext4файловой системе (которую использует большинство людей) inodeразмер по умолчанию составляет 256 байт, размер блока - 4096 байт.

Каталог - это просто специальный файл, который содержит массив имен файлов и номеров узлов. Когда каталог был создан, файловая система выделила 1 индекс для каталога с именем «имя файла» (фактически имя dir). Индекс указывает на один блок данных (минимальные издержки), который составляет 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

Если файл вообще содержит какие-либо данные (даже один байт), он будет занимать один блок на диске (который обычно составляет 4 КБ в наши дни). Один блок не может быть разделен между файлами. Это означает, что пространство этого целого блока не будет доступно для других файлов, поэтому оно считается «использованным».

Источник

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.