Огромный файл Docker и поведение tar
Когда я сделал резервную копию в моей системе Linux с tar -czv
Я заметил, что процесс застрял очень долго /var/lib/docker/devicemapper/devicemapper/data
(намного дольше, чем должна занять копия всех моих изображений и контейнеров), пока файл результата не увеличивается.
Проверяя этот размер файла с ls -lh
, это выводит меня 100G
размер на 20G
раздел. Что это за файл и что tar
делаешь здесь?
1 ответ
Похоже, у вас там редкий файл.
Разреженный файл - это тип компьютерного файла, который пытается более эффективно использовать пространство файловой системы, когда сам файл в основном пуст. Это достигается путем записи краткой информации (метаданных), представляющей пустые блоки на диск, вместо фактического "пустого" пространства, которое составляет блок, используя меньше дискового пространства. Полный размер блока записывается на диск как фактический размер, только когда блок содержит "реальные" (непустые) данные.
Есть этот ответ, который говорит:
/var/lib/docker/devicemapper/devicemapper
Каталог содержит файлы разреженных циклов, которые содержат все остальные данные, которые монтирует Docker.
Ваш файл состоит в основном из пустых блоков (все нули) и как разреженный файл может вписаться в ваш небольшой раздел. По-видимому tar
просто читает все нули и обрабатывает их. Они сжимаются очень хорошо, поэтому результирующий файл немного увеличивается, когда заканчивается поток нулей.
Существует опция командной строки для tar
что делает его осведомленным о редких файлах. Это описано здесь.
-S
--sparse
В вашем случае очень важно следующее:
При извлечении (...) любые такие файлы также имеют дыры, созданные везде, где были найдены дыры. (…) Рассмотрите возможность использования
--sparse
при выполнении резервного копирования файловой системы, чтобы избежать архивирования расширенных форм файлов, редко хранимых в системе.
Я думаю, вы не использовали --sparse
вариант, поэтому, когда дело доходит до извлечения вашего 100G
файл будет создан как не разреженный и не помещается в 20G
раздел.