Как рассчитать правильный размер образа файловой системы loopback для debootstrap

Я использую debootstrap для создания rootfs для устройства, которое я хочу записать в файл изображения. Чтобы вычислить размер, необходимый для моих rootfs, я делаю следующее:

local SIZE_NEEDED=$(du -sb $CHROOT_DIR|awk '{print $1}') SIZE_NEEDED=$(($SIZE_NEEDED / 1048576 + 50)) # in MB + 50 MB space dd if=/dev/zero of=$ROOTFS_IMAGE bs=1M count=$SIZE_NEEDED 

Как вы можете видеть, я оставляю 50MB отступов за пределами того, что рассчитывает dd .

Затем я создаю loopback-устройство, создаю таблицу разделов и файловую систему:

 LO_DEVICE=$(losetup --show -f $ROOTFS_IMAGE) parted $LO_DEVICE mktable msdos mkpart primary ext4 0% 100% partprobe $LO_DEVICE local LO_ROOTFS_PARTITION="${LO_DEVICE}p1" mkfs.ext4 -O ^64bit $LO_ROOTFS_PARTITION 

Похоже, что некоторые попытки выполнить некоторое выравнивание сектора (?), Поскольку раздел не совсем захватывает весь виртуальный диск, но достаточно близко.

Затем я монтирую новый раздел и начинаю писать файлы. Но тогда у меня заканчивается дисковое пространство прямо до конца!

 mount $LO_ROOTFS_PARTITION $LO_MOUNT_POINT cp -rp $CHROOT_DIR/* $LO_MOUNT_POINT ..... cp: cannot create directory '/root/buildimage/rootfs_mount/var': No space left on device 

Я подозреваю, что это проблема с изменением размера блока или, может быть, разница между MiB и MB? Поскольку до определенного размера изображения кажется, что у меня достаточно запаса с 50 МБ отступов. (Я хочу, чтобы по умолчанию было свободное место в изображении, но не много.) Размер изображения не выключен фактором-два, поэтому есть некоторые ползучие или накладные расходы, которые становятся увеличенными по мере увеличения размера изображения, Я не знаю, откуда он.

Для контекста, вот последний, который я сделал, который не подходит:

 # du -sb build/rootfs 489889774 build/rootfs 

Ok, 489MB / 1024 ** 2 + 50MB = 517MB размер изображения. Поэтому dd выглядел так:

 # dd if=/dev/zero of=build/rootfs.img size=1M count=517 517+0 records in 517+0 records out 542113792 bytes (542 MB, 517 MiB) copied, 2.02757 s, 267 MB/s 

Подтвержденный на диске выглядит несколько больше:

 # du -sb build/rootfs.img 542113792 build/rootfs.img 

Раздел выглядит так:

 # parted /dev/loop0 print Model: Loopback device (loopback) Disk /dev/loop0: 542MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 542MB 541MB primary ext4 

и смонтированная файловая система:

 # df -h /dev/loop0p1 Filesystem Size Used Avail Use% Mounted on /dev/loop0p1 492M 482M 0 100% /root/buildimage/build/rootfs_mount 

Так что, возможно, накладные расходы в файловой системе ext4, возможно, для суперблоков / журнала / etc? Как я могу объяснить это в моем расчете размера?

РЕДАКТИРОВАТЬ:

Посмотрите на служебные данные ext4, такие как этот вопрос ServerFault .

Также смотрите в опции mkfs.ext4, такие как -m (зарезервировано) и различные варианты ведения журнала и inode. В общем, если я знаю, что есть 5% накладных расходов, поступающих из файловой системы, я могу это сделать достаточно легко.

РЕДАКТИРОВАТЬ № 2:

Думая, что du может быть недостаточно отчет о фактических требованиях к размеру диска (например, 10-байтовый файл по-прежнему занимает 4-килобайтный блок, верно?) Я попробовал несколько других опций:

 # du -sb build/rootfs # This is what I was using 489889774 build/rootfs # du -sm build/rootfs # bigger 527 build/rootfs # du -sk build/rootfs # bigger-est 539088 build/rootfs 

Кроме того, man-страница для -b отмечает, что это псевдоним для --apparent-size который может быть меньше, чем «фактическое использование диска». Так может быть (большинство), где моя математика была неправильной.

  • Debian VPS, не существует никаких устройств loop, modprobe не работает
  • Цитирование через файл с использованием столбца
  • Правило UDEV для запуска partprobe на устройстве loop
  • Монтирование изображения squashfs с наложением чтения и записи для rootfs
  • Выполнение команды в выражении `if` и при успешном выполнении последующих действий
  • Как удалить ограничение длины от losetup -a
  • Получить целевое устройство с помощью записи / dev / dm-X
  • Bourne Shell do while loop возвращает все данные, но имеет две ошибки, нет такого файла или каталога и повторяет имя оболочки
  • 2 Solutions collect form web for “Как рассчитать правильный размер образа файловой системы loopback для debootstrap”

    Возможно, самое простое решение состоит в том, чтобы вначале переназначить пространство, скопировать все файлы, а затем использовать resize2fs -M чтобы уменьшить размер до минимума, который может управлять этой утилитой. Вот пример:

     dir=/home/meuh/some/dir rm -f /tmp/image size=$(du -sb $dir/ | awk '{print $1*2}') truncate -s $size /tmp/image mkfs.ext4 -m 0 -O ^64bit /tmp/image sudo mount /tmp/image /mnt/loop sudo chown $USER /mnt/loop rsync -a $dir/ /mnt/loop sync df /mnt/loop sudo umount /mnt/loop e2fsck -f /tmp/image resize2fs -M /tmp/image newsize=$(e2fsck -n /tmp/image | awk -F/ '/blocks$/{print $NF*1024}') truncate -s $newsize /tmp/image sudo mount /tmp/image /mnt/loop df /mnt/loop diff -r $dir/ /mnt/loop sudo umount /mnt/loop 

    Некоторые выдержки из вывода для примера каталога:

     + size=13354874 Creating filesystem with 13040 1k blocks and 3264 inodes + df /mnt/loop Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop1 11599 7124 4215 63% /mnt/loop + resize2fs -M /tmp/image Resizing the filesystem on /tmp/image to 8832 (1k) blocks. + newsize=9043968 + truncate -s 9043968 /tmp/image + df /mnt/loop Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop1 7391 7124 91 99% /mnt/loop 

    Для записи я изменил свой оригинальный код, чтобы использовать du -sm который, похоже, решил мою проблему. Я думаю, что суть проблемы заключалась в том, что -sb является псевдонимом для --apparent-size .

    Кроме того, зная, что ext4 требует, например, 5% накладных расходов, достаточно легко включить в расчет, но я не думаю, что это была актуальная проблема, поскольку она терпела неудачу при написании в качестве суперпользователя.

    Interesting Posts

    скопировать один файл из локального репозитория Git

    Linux (3.4) Использование раздела подкачки SSD вызывает экстремальную задержку – как устранить?

    Добавить аргументы для последнего вызова `find … -exec $ COMMAND {} +`

    Как добавить пользователя в SVN?

    последний файл времени открыт

    Как работает обновление драйвера linux?

    Как освободить пространство в динамически растущем изображении qcow2 VM?

    Как решить nsf-общую связанную ошибку при установке zsh в ubuntu?

    Как перезагрузить / закрыть изящно в Awesome WM?

    Может ли оператор «case» Linux иметь концепцию «или»?

    Как переместить гостевую машину vmware другому пользователю?

    Определение нескольких зависимостей библиотек

    Почему я могу подключиться к IP-интерфейсу сетевого интерфейса (на сервере с несколькими сетевыми интерфейсами) при удалении сетевого кабеля?

    Как можно было бы установить имена сетевых интерфейсов (wifi / ethernet) в arch

    Как заставить «sox» признать «хромой»?

    Linux и Unix - лучшая ОС в мире.