Пример минимальной гранулярности блока
Давайте немного поиграем, чтобы посмотреть, что происходит.
mount
говорит мне, что я нахожусь на разделе ext4, смонтированном в/
.
Я нахожу его размер блока с:
stat -fc %s .
, что дает:
4096
Теперь давайте создадим несколько файлов сразмеры 1 4095 4096 4097
:
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
и результаты:
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
Таким образом, мы видим, что все, что ниже или равно 4096
, на самом деле занимает 4096
байт.
Затем, как только мы пересечем 4097
, оно поднимется до 8192
, что составляет 2 * 4096
.
Тогда ясно, что диск всегда хранит данные на границе блока4096
байт.
Что происходит с разреженными файлами?
Я не исследовал, что такое точное представление, но ясно, что --apparent
делаетучитывайте это.
Это может привести к тому, что видимые размеры будут больше, чем фактическое использование диска.
Например:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
дает:
8192 f
1073741825 f
Похожие: Как проверить, поддерживается ли разреженный файл
Что делать, если я хочу сохранить несколько небольших файлов?
Некоторые возможности:
Библиография:
Протестировано в Ubuntu 16.04.