Чому існує так багато різних способів вимірювання використання диска?


113

Коли я підсумовую розміри своїх файлів, я отримую одну цифру. Якщо я біжу du, я отримую ще одну цифру. Якщо я запускаю duвсі файли на своєму розділі, він не відповідає тому, що dfвикористовуються претензії. Чому так багато різних цифр для загального розміру моїх файлів? Не можете комп'ютери додати?

Якщо говорити про додавання: коли я додаю стовпці "Використовувані" та "Доступні" df, я не отримую загальної цифри. І ця загальна цифра менша за розмір мого розділу. І якщо я додаю розміри розділів, я не отримую розмір свого диска! Що дає?

Відповіді:


143

Додавання чисел легко. Проблема в тому, що можна додати багато різних чисел.

Скільки місця на диску використовується файл?

Основна ідея полягає у тому, що файл, що містить n байтів, використовує n байтів дискового простору, а також трохи інформації про керування: метадані файлу (дозволи, часові позначки тощо) та трохи накладних даних для інформації, необхідній системі знайти, де зберігається файл. Однак є багато ускладнень.

Мікроскопічні ускладнення

Подумайте про кожен файл як про ряд книг у бібліотеці. Менші файли складають лише один об'єм, а більші файли складаються з багатьох томів, як енциклопедія. Для того, щоб можна було знайти файли, існує каталог карт, який посилається на кожен том. Кожен том має трохи накладних витрат через кришки. Якщо файл дуже маленький, ця накладні витрати відносно великі. Також сам каталог картки займає трохи місця.

Перейшовши трохи технічніше, у типовій простій файловій системі простір розділено на блоки . Типовий розмір блоку - 4 Кбіт. Кожен файл займає цілу кількість блоків. Якщо розмір файлу не кратний розміру блоку, останній блок використовується лише частково. Отже, 1-байтовий і 4096-байтний файл обидва займають 1 блок, тоді як 4097-байтний файл займає два блоки. Ви можете це спостерігати за допомогою duкоманди: якщо ваша файлова система має розмір блоку 4KiB, тоді duбуде повідомляти про 4KiB для 1-байтового файлу.

Якщо файл великий, то додаткові блоки необхідні тільки для зберігання списку блоків, що становлять файли (це непрямі блоки , більш складні файлові системи можуть оптимізувати це у вигляді екстентів ). Вони не показують розмір файлу, як повідомляється ls -lабо GNU du --apparent-size; du, який повідомляє про використання диска на відміну від розміру, враховує їх.

Деякі файлові системи намагаються повторно використовувати вільний простір, що залишився в останньому блоці, щоб запакувати кілька файлових хвостів в один і той же блок . Деякі файлові системи (наприклад, ext4, оскільки Linux 3.8 використовують 0 блоків для крихітних файлів (всього кілька байтів)), які повністю вміщуються в inode.

Макроскопічні ускладнення

Як правило, як показано вище, загальний розмір, про який повідомляється, du- це сума розмірів блоків або розширень, використовуваних файлом.

Розмір, про який повідомляє, duможе бути меншим, якщо файл стиснений. Системи Unix традиційно підтримують грубу форму стиснення: якщо блок файлів містить лише нульові байти, то замість того, щоб зберігати блок нулів, файлова система може взагалі опустити цей блок. Файл із опущеними блоками, подібними до цього, називається розрідженим файлом . Розріджені файли не створюються автоматично, коли файл містить велику серію нульових байтів, програма повинна впорядкувати, щоб файл став рідким.

Деякі файлові системи, такі як btrfs та zfs, підтримують стиснення загального призначення .

Поширені ускладнення

Дві основні особливості дуже сучасних файлових систем, такі як zfs та btrfs, роблять залежність між розміром файлу та використанням диска значно більш віддаленою: знімки та дедуплікація.

Знімки - це заморожений стан файлової системи на певну дату. Файлові системи, що підтримують цю функцію, можуть містити кілька знімків, зроблених у різні дати. Ці знімки, звичайно, займають місце. На крайньому випадку, якщо ви видалите всі файли з активної версії файлової системи, файлова система не стане порожньою, якщо залишилися знімки.

Будь-який файл або блок, який не змінився з моменту зйомки або між двома знімками, існує однаково як на знімку, так і в активній версії або іншому знімку. Це реалізується за допомогою копіювання під час запису . У деяких крайніх випадках можливо, що видалення файлу у повній файловій системі не вдасться через недостатнє доступне місце - тому що для видалення цього файла потрібно буде зробити копію блоку в каталозі, і для цього блоку немає місця.

Дедуплікація - це техніка оптимізації зберігання, яка полягає у униканні зберігання однакових блоків. З типовими даними пошук дублікатів не завжди коштує зусиль. Як zfs, так і btrfs підтримують дедупликацію як необов'язкові функції.

Чому загальна duвеличина відрізняється від суми розмірів файлів?

Як ми вже бачили вище, розмір, про який повідомляється duдля кожного файлу, як правило, є сумою розмірів блоків або розширень, використовуваних файлом. Зауважте, що за замовчуванням ls -lперераховує розміри в байтах, але duперераховує розміри в KiB або в 512-байтових одиницях (секторах) для деяких більш традиційних систем ( du -kзмушує використовувати кілобайти). Більшість сучасних уніцій підтримують ls -lhі du -hвикористовувати «читабельні людиною» номери, використовуючи K, M, G тощо, достатньо (для KiB, MiB, GiB).

Запускаючи duкаталог, це підсумовує використання диска всіх файлів у дереві каталогів, включаючи самі каталоги . Каталог містить дані (назви файлів та вказівник на те, де є метадані файлу), тому йому потрібно трохи місця для зберігання. Невеликий каталог займе один блок, а більший каталог вимагатиме більше блоків. Обсяг пам’яті, що використовується в каталозі, іноді залежить не тільки від файлів, які він містить, але і порядку, в який вони були вставлені, і в якому деякі файли видаляються (при деяких файлових системах це може залишити дірки - компроміс між дисковим простором та продуктивністю ), але різниця буде мініатюрною (додатковий блок тут і там). Коли ти біжишls -ld /some/directory, розмір каталогу вказаний. (Зверніть увагу, що рядок "загальний NNN" у верхній частині результату з ls -l- це неспоріднене число; це сума розмірів у блоках перерахованих елементів, виражена в KiB або секторах.)

Пам’ятайте, що duвключає файли з крапками, які lsне відображаються, якщо ви не використовуєте параметр -Aабо -a.

Іноді duзвіти менше, ніж очікувана сума. Це трапляється, якщо в дереві каталогів є жорсткі посилання : duпідраховує кожен файл лише один раз.

У деяких файлових системах, таких як ZFSLinux, duне повідомляється про повний дисковий простір, займаний розширеними атрибутами файлу.

Слідкуйте за тим, що якщо в каталозі є точки монтажу, вони також duбудуть рахувати всі файли на цих точках монтажу, якщо не надано -xможливість. Отже, якщо, наприклад, ви хочете загальний розмір файлів у вашій кореневій файловій системі, запустіть du -x /, не du /.

Якщо файлова система встановлена ​​в не порожній каталог , файли в цьому каталозі приховані змонтованою файловою системою. Вони все ще займають їх простір, але duне знайдуть їх.

Видалені файли

Коли файл видаляється , це видаляє лише запис каталогу, не обов'язково сам файл. Дві умови необхідні для того, щоб фактично видалити файл і таким чином відновити його місце на диску:

  • Кількість посилань у файлі має впасти до 0: якщо файл має декілька жорстких посилань, видалення одного не впливає на інші.
  • Поки файл відкритий деяким процесом, дані залишаються. Файл видаляється лише тоді, коли всі процеси закриті. Вихідні дані fuser -mабо lsofточки монтажу включають процеси, у яких відкрита файл у цій файловій системі, навіть якщо файл видалений.
  • навіть якщо жоден процес не має відкритого видаленого файлу, можливо, простір файлу не буде повернено, якщо цей файл є резервним loopпристроєм. losetup -a(як root) може вказати, які loopпристрої зараз налаштовані та в якому файлі. Цифровий пристрій повинен бути знищений (разом losetup -d), перш ніж буде накопичено місце на диску.

Якщо ви видалите файл у деяких файлових менеджерах чи графічному інтерфейсі, він може бути поміщений у кошик, де його можна буде відмінити. Поки файл може бути відмінено, його простір все ще витрачається.

З чого саме ці цифри df?

Типова файлова система містить:

  • Блоки, що містять файлові (включаючи каталоги) дані та деякі метадані (включаючи непрямі блоки та розширені атрибути в деяких файлових системах).
  • Безкоштовні блоки.
  • Блоки, зарезервовані для кореневого користувача.
  • суперблоки та інша контрольна інформація.
  • Вузли
  • журнал

Про це повідомляє лише перший вид du. Що стосується того df, що переходить у стовпці "використані", "доступні" та загальні стовпці залежить від файлової системи (звичайно використовувані блоки (включаючи непрямі) завжди знаходяться у стовпчику "використані", а невикористані блоки завжди знаходяться у розділі " доступно ").

Файлові системи в ext2 / ext3 / ext4 залишають 5% місця для кореневого користувача. Це корисно для кореневої файлової системи, щоб продовжувати роботу системи, якщо вона заповнюється (зокрема, для ведення журналів, а також дозволити системному адміністратору зберігати трохи даних під час виправлення проблеми). Навіть для таких розділів даних, як /homeзбереження зарезервованого простору корисно, оскільки майже повна файлова система схильна до фрагментації. Linux намагається уникнути фрагментації (що уповільнює доступ до файлів, особливо на обертових механічних пристроях, таких як жорсткі диски), попередньо виділяючи багато послідовних блоків під час запису файлу, але якщо послідовних блоків не багато, це не може працювати .

Традиційні файлові системи, включаючи ext4, але не btrfs, резервують фіксовану кількість inode під час створення файлової системи. Це суттєво спрощує дизайн файлової системи, але має і менший бік, що кількість входів має бути розміщена належним чином: при занадто великій кількості входів витрачається місце; із занадто малою кількістю вкладень, файлова система може закінчитись, але не вистачить місця. Команда df -iповідомляє, скільки входів використовується, а скільки доступних (файлові системи, де концепція не застосовується, можуть повідомляти 0).

Запуск tune2fs -lна томі, що містить файлову систему ext2 / ext3 / ext4, повідомляє про деякі статистичні дані, включаючи загальну кількість та кількість вільних вводів та блоків.

Ще одна особливість, яка може сплутати матерію, - це підпункти (підтримуються в btrfs та zfs під наборами даних імен ). Кілька підпунктів поділяють один і той же простір, але мають окремі корені дерева каталогів.

Якщо файлова система встановлена ​​через мережу (NFS, Samba тощо) і сервер експортує частину цієї файлової системи (наприклад, сервер має /homeфайлову систему та експортує/home/bob ), то dfна клієнті відображаються дані для всієї файлової системи, а не лише для тієї частини, яка експортується та монтується на клієнта.

Для чого використовується простір на моєму диску?

Як ми бачили вище, загальний розмір, про який повідомляється, dfне завжди враховує всі контрольні дані файлової системи. Використовуйте спеціальні інструменти для файлової системи, щоб отримати точний розмір файлової системи, якщо потрібно. Наприклад, за допомогою ext2 / ext3 / ext4 запустіть tune2fs -lі помножте розмір блоку на кількість блоків.

Коли ви створюєте файлову систему, вона, як правило, заповнює наявний простір на розділі або томі, що додається. Іноді у вас може виникнути менша файлова система, коли ви переміщуєте файлові системи навколо або змінюєте розмір томів.

У Linux lsblkпредставлений хороший огляд наявних обсягів зберігання. Для отримання додаткової інформації або якщо у вас немає lsblk, використовуйте спеціалізовані засоби управління обсягом або розділення, щоб перевірити, які у вас розділи. У Linux, там lvs, vgs, pvsдля LVM , fdiskдля традиційних PC-стилю ( «MBR») розділи (як і GPT в останніх системи), gdiskдля GPT розділів, disklabelдля дискової мітки, Parted і т.д. Під Linux, cat /proc/partitionsдає короткий огляд. У типових установках є щонайменше два розділи або томи, що використовуються операційною системою: файлова система (іноді і більше) і об'єм swap .

Деякі комп'ютери мають розділ, що містить BIOS або інше діагностичне програмне забезпечення. Комп'ютери з UEFI мають спеціальний розділ завантажувача.

Нарешті, зауважте, що більшість комп'ютерних програм використовують одиниці, засновані на потужностях 1024 = 2 10 (адже програмісти люблять бінарні та потужності 2). Отже, 1 кБ = 1024 В, 1 МБ = 1048576 Б, 1 ГБ = 1073741824, 1 ТБ = 1099511627776 Б,… Офіційно ці блоки відомі як кібібайт KiB, мебібайт MiB тощо. M або MB і т. Д. З іншого боку, виробники жорстких дисків систематично використовують метрику (1000 одиниць на основі). Так що на 1 ТБ накопичувач всього 931 ГіБ або 0,904 ТиБ.


1
@Kiwy tune2fsвимагає доступу для читання до блокового пристрою, що містить файлову систему, яка, як правило, вимагає кореневого зв’язку, оскільки це дозволяє читати вміст будь-якого файлу.
Жиль

20
Я знаю, що "спасибі" відштовхується в SE, але Гілль ти заслужив величезне "спасибі" за цей надзвичайний пост.
dotancohen

1
Я пам’ятаю, як бачив каталог карт, коли мені було 6 років. Цікаво, скільки хто не знатиме, що вони є?
Ізката

1
@ iluminÉ Це занадто розвинений для мене Solaris, я не знаю, на якому рівні він підходить.
Жиль

1
du робить рахунок непрямих блоків. Це основна відмінність від розміру файлу, про який повідомляється ls -l.
Стефан Шазелас

4

Короткий підсумок ускладнень при обчисленні розмірів файлів та місця на диску:

  • Простір, який файл займає на диску, є множником кількості блоків, які він займає, залежно від розміру кожного блоку + кількості входів, які він займає. Файл довжиною в 1 байт займе щонайменше 1 блок, 1 вклад і один запис каталогу.

    Але це може зайняти лише 1 додатковий запис у каталозі, якщо файл є жорстким посиланням на інший файл. Це було б просто черговим посиланням на той самий набір блоків.

  • Розмір вмісту файлу. Це те, що lsвідображається.
  • Вільний простір на диску - це не розмір найбільшого файлу, який ви можете вмістити, або сума всіх розмірів вмісту файлів, які вмістяться на диску. Це десь посеред. Це залежить від кількості файлів (які займають вставки) розміру блоку та того, наскільки близько вміст кожного файлу заповнює блоки повністю.

Це просто дряпає поверхню файлових систем, і це надмірно спрощується. Також пам’ятайте, що різні файлові системи працюють по-різному.

statдуже корисно при виявленні частини цієї інформації. Ось кілька прикладів використання stat і для чого це корисно: http://landoflinux.com/linux_stat_command_examples.html


1
1-байтовий файл, як правило, займає один блок, а не 8. Створення жорсткого посилання взагалі не створює inode: один файл - це один inode, незалежно від кількості посилань на файл. Створення жорсткого посилання вимагає лише місця для введення каталогу.
Жиль

Дякую за виправлення, правда, моя пам'ять про: вивчення поглиблення ext2 зараз трохи нечітке. Я слідкував за результатами stat re: кількість блоків - він відчував себе надмірним, але ось що там. Я виправлю відповідь.
Педро

1
Це тому, що 1 блок ext2 = 8 статичних блоків, якщо файлова система ext2 використовує блоки 4 кБ: stat вважає 512-байтними блоками з історичних причин. Дивіться unix.stackexchange.com/questions/14409/…
Жиль

2

Я проілюструю тут різні випадки, які викликають duвідмінність від df.

dfпідраховує виділені блоки файлової системи, duвикористовує інформацію про розмір кожного файлу. Різниця може мати багато причин:

1) Від’єднані (видалені) файли, які все ще відкриваються програмою. Інформація про файл відсутня, блок все ще виділяється. lsof +aL1 <filesystem>допоможе вам ідентифікувати процеси. Більшість часу вам доводиться вбивати процеси, щоб звільнити простір (це залежить від процесу, іноді достатньо перезавантаження конфігурації).

2) Файли під точками кріплення, прихованими, duале не для них df. debugfsможе допомогти вам прочитати файлову систему.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) Рідкі файли, які виглядають більше, ніж реальність. не виділені блоки не враховуються, dfале видимий розмір файлу підраховується du.

Зауважте, що жорсткі посилання не дурні du


2

dfЗазвичай використовується для того, щоб побачити, які файлові системи, наскільки повна кожна та де вони встановлені. Дуже корисно, коли у файловій системі не вистачає місця, і, можливо, ви хочете перенести речі серед файлових систем, або придбати більший диск тощо.

duпоказує детальну інформацію про те, скільки споживає кожен каталог каталогів (на зразок windirstatWindows). Відмінно підходить для пошуку місця, де ви забираєте місце, намагаючись очистити файл.

Крім невеликих числових відмінностей, пояснених іншими, я думаю, що duі dfутиліти служать зовсім іншим цілям.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.