Додавання чисел легко. Проблема в тому, що можна додати багато різних чисел.
Скільки місця на диску використовується файл?
Основна ідея полягає у тому, що файл, що містить 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
підраховує кожен файл лише один раз.
У деяких файлових системах, таких як ZFS
Linux, 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 ТиБ.
tune2fs
вимагає доступу для читання до блокового пристрою, що містить файлову систему, яка, як правило, вимагає кореневого зв’язку, оскільки це дозволяє читати вміст будь-якого файлу.