Sparse files: почему файл на 100 ГБ может занимать несколько мегабайт
Размер файла и реально занятое место на диске не всегда совпадают.
Можно создать файл, который логически имеет размер 100 ГБ, но физически занимает всего несколько мегабайт.
Для этого используются sparse files.
▪️Создаём sparse-файл
truncate -s 100G test.img
Теперь:
ls -lh test.img
покажет:
-rw-r--r-- 1 user user 100G test.img
Но:
du -h test.img
может показать всего несколько килобайт.
ls смотрит на логический размер, а du - на реально выделенные filesystem blocks.
▪️Что произошло
Файл содержит большой диапазон нулей, для которого файловая система не обязана физически выделять блоки.
Условно:
логический файл:
[данные][ огромная область нулей ][данные]
↓ ↓ ↓
блоки hole блоки
Эта незаполненная область называется hole.
▪️Можно посмотреть оба размера
stat test.img
Обратите внимание на:
Size:
Blocks:
Size — логический размер файла.
Blocks — сколько filesystem blocks реально выделено.
▪️Почему это важно
Sparse files часто используются для образов виртуальных машин и контейнеров:
VM disk image → 100 GB
actual allocated space → 12 GB
Пока виртуальная машина не записала данные в свободные области, физическое место не требуется.
Но если эти области постепенно заполняются, реальное потребление диска начинает расти.
▪️Как проверить sparse-файл
du -h test.img
du --apparent-size -h test.img
Второй вариант показывает размер так, будто sparse-областей нет.
Например:
8.0K test.img
100G test.img
▪️Практический сценарий
Есть сервер виртуализации, и администратор видит:
ls -lh /var/lib/images/*
Образы занимают:
500G
Но:
du -sh /var/lib/images
показывает:
180G
Это не обязательно ошибка подсчёта.
Часть образов может быть sparse.
▪️Важный нюанс
Копирование sparse-файла не всегда сохраняет holes.
Например, некоторые способы копирования могут превратить разреженный файл в обычный и реально записать нулевые блоки.
Проверить результат можно снова через:
du -h file
du --apparent-size -h file
Поэтому при работе с большими VM-образами важно различать логический размер файла и реально выделенное дисковое пространство.
BashTex 📱 #bash #systemd
Размер файла и реально занятое место на диске не всегда совпадают.
Можно создать файл, который логически имеет размер 100 ГБ, но физически занимает всего несколько мегабайт.
Для этого используются sparse files.
▪️Создаём sparse-файл
truncate -s 100G test.img
Теперь:
ls -lh test.img
покажет:
-rw-r--r-- 1 user user 100G test.img
Но:
du -h test.img
может показать всего несколько килобайт.
ls смотрит на логический размер, а du - на реально выделенные filesystem blocks.
▪️Что произошло
Файл содержит большой диапазон нулей, для которого файловая система не обязана физически выделять блоки.
Условно:
логический файл:
[данные][ огромная область нулей ][данные]
↓ ↓ ↓
блоки hole блоки
Эта незаполненная область называется hole.
▪️Можно посмотреть оба размера
stat test.img
Обратите внимание на:
Size:
Blocks:
Size — логический размер файла.
Blocks — сколько filesystem blocks реально выделено.
▪️Почему это важно
Sparse files часто используются для образов виртуальных машин и контейнеров:
VM disk image → 100 GB
actual allocated space → 12 GB
Пока виртуальная машина не записала данные в свободные области, физическое место не требуется.
Но если эти области постепенно заполняются, реальное потребление диска начинает расти.
▪️Как проверить sparse-файл
du -h test.img
du --apparent-size -h test.img
Второй вариант показывает размер так, будто sparse-областей нет.
Например:
8.0K test.img
100G test.img
▪️Практический сценарий
Есть сервер виртуализации, и администратор видит:
ls -lh /var/lib/images/*
Образы занимают:
500G
Но:
du -sh /var/lib/images
показывает:
180G
Это не обязательно ошибка подсчёта.
Часть образов может быть sparse.
▪️Важный нюанс
Копирование sparse-файла не всегда сохраняет holes.
Например, некоторые способы копирования могут превратить разреженный файл в обычный и реально записать нулевые блоки.
Проверить результат можно снова через:
du -h file
du --apparent-size -h file
Поэтому при работе с большими VM-образами важно различать логический размер файла и реально выделенное дисковое пространство.
BashTex 📱 #bash #systemd