Куда могло исчезнуть дисковое пространство? (2/5)
Разрежённые файлы (файлы с "дыркой")
Другая проблема может появиться, например, во время создания бэкапа:
Тут возникает вопрос. А как из каталога размером 12 мегабайт получился архив на 426 мегабайт, который занял всё место?
Давайте глянем, какой самый большой файл располагается в каталоге /var/lib/docker:
Интересно, откуда у нас образовался 100 гиговый файл на разделе размером в 5 гигабайт?
Копнём дальше:
Наиболее вероятно, дальнейшее гугление симптомов приведёт вас на страничку wiki, посвящённую разрежённым файлам. И да, здесь мы имеем дело именно с ними (Unix - Профессиональное программирование, стр 157, или М.Керриск - Linux API исчерпывающее руководство, стр. 118).
Да, в описываемом случае Docker использовал в качестве драйвера хранилища Devicemapper, который на данный момент устарел (рекомендуется использовать или overlay2 или fuse-overlayfs для rootless режима). Однако в целом использование разрежённых файлов довольно распространённое решение для хранения файловых систем в файлах, поэтому для devicemapper оно не уникально, и может встречаться достаточно часто.
Заключение
Большинство современных файловых систем поддерживают разрежённые файлы. Полный список доступен на вики.
Разрежённые файлы - это файлы которые не используют блоки до тех пор, пока туда не будут записаны данные.
Разрежённые файлы легко могут быть найдены с помощью однострочника:
где:
указывает что нужно искать на машине все объекты с типом файл
Эта часть распечатает «разреженность» файла и его полное имя.
На этом этапе вывод будет выглядеть примерно так:
Если первое число меньше 1.0, то файл считается «разреженным».
Дальше мы фильтруем вывод с помощью awk:
и получаем список разрежённых файлов.
Файлы можно конвертировать в разрежённые и обратно
Некоторым утилитам (tar, rsync) нужно передать дополнительные аргументы (например "--sparse" для tar) для работы с разрежёнными файлами