Как работают разрежённые файлы в Linux
Вечерок вчера весёлый получился в плане отвала RU-зоны. Ну да ладно, само всё починилось, меня даже ночью не дёрнули, удалось поспать 5 часов.
читать первым в телеграм читать первым в макс
Сегодня продолжим тему с нулями, но на этот раз обсудим такое понятие, как разрежённый файл. Или, как их звать-величать, «дырявые файлы».
Ты всяко в курсе: когда в виртуалке создаёшь жёсткий диск размером 500 гигабайт, то физический размер этого диска на хостовой машине будет около 1–2 гигабайт, само собой, с установленной Linux-системой.
Ты суслика видишь? Нет. И я не вижу, а он есть.
А где же всё остальное место? А нигде, есть только информация, которая хранится об этом размере в метаданных файловой системы. И по мере необходимости это физическое место на диске выделяется и используется. Сам же файл представляет собой последовательность тех самых нулевых байт (magic zero).
Короче, сохраняется только местоположение и количество последовательности нулевых байт. А при чтении такого файла файловая система генерирует нужное количество нулевых байт.
Чтобы стало понятнее, давай тыкать палкой.
Создаём дырявый файл:
dd if=/dev/zero of=./bashdays bs=1 count=0 seek=100M
Создался файл bashdays размером 4 мегабайта. Да, не 100, а именно 4. Открываем в режиме просмотра и видим в нём нули. По факту его можно растянуть как гандон до 100 мегабайт. Размер будет увеличиваться по мере заполнения этого файла данными, но не сможет превысить 100 мегабайт.
Как альтернатива, ты можешь создать такой файл так:
truncate -s100M ./bashdays
Окей, файл есть, и что дальше? А дальше этот файл нужно чем-то заполнить.
Дырявые файлы обычно применяются для:
- экономии места на диске;
- виртуализации;
- резервных копий;
- баз данных;
- файловых систем.
Очевидно, это связано с оптимизацией, ну и с тем, чтобы твой любимый жёсткий диск не насиловать физическими записанными нулями.
Из всего перечисленного я использую такие разрежённые файлы как файловую систему для экспериментов. Создаю файл, а затем просто монтирую его как файловую систему, провожу опыты, издеваюсь, растягиваю, а затем удаляю.
Чтобы примонтировать такой файл как ФС, делаешь так:
mkfs.ext4 ./bashdays
mount ./bashdays /mnt
Первая накатит туда ext4, а вторая смонтирует в /mnt. А ещё в такой дырявый файл можно установить операционную систему и даже загрузиться в неё. Короче, тут кейсов много всяких, всё зависит от твоих задач и предпочтений. Но тема да, прикольная. Всякие VirtualBox и т. п. это активно используют.
Теперь про хостеров
Хостеры и не только часто используют данную фичу, чтобы раскатывать тебе VPS за несколько секунд, единицы ставят ОС с нуля и выдают «честные» гигабайты на жёстком диске.
Логично, что хостеры НЕ будут резервировать тебе 100 гигабайт места на диске. Возможно, ты ими пользоваться вообще не будешь. Чо оно будет просто так болтаться? А денежку, конечно же, будут брать именно за 100 гигабайт. По факту ты платишь за дырявый файл, который, возможно, никогда и не заполнится до конца.
Например, если в Яндекс Облаке выключить все виртуалки, денежка всё равно будет капать за дисковое пространство. Улавливаешь?
Как это работает: есть эталонные образы дырявого файла разного размера. Ты выбираешь у хостера тариф, например 2/2/30, затем берётся заранее подготовленный дырявый файл с нужным размером диска и отдаётся тебе.
Ты видишь (через df -h), что на винте 30 гигабайт, радуешься, но на самом деле это место ещё никак не распределено. Используется только 4–5 гигабайт. По мере заполнения данными заполняется и твой дырявый файл, который тебе продали за 10$ в месяц. Получается так, что в большинстве случаев у тебя в запасе всегда болтается процентов 20 от объёма диска, которые ты не используешь, но исправно оплачиваешь.
Такая вот замечательная бизнес-модель, такие вот замечательные разрежённые файлы.
/dev/zero. Делайте ваши ставки, дамы и господа!UPD: Коллеги отметили, что лучше так:
fallocate -l 1G --punch-hole sparsefile
