diff --git a/bin/disk-image-create b/bin/disk-image-create index 2b6a94d96..4bb06f2da 100755 --- a/bin/disk-image-create +++ b/bin/disk-image-create @@ -335,7 +335,9 @@ if [ -n "$MAX_ONLINE_RESIZE" ]; then fi LOOPDEV=$(sudo losetup --show -f $TMP_IMAGE_PATH) -export EXTRA_UNMOUNT="detach_loopback $LOOPDEV" +# Definied here for backward compat against set -u +export EXTRA_UNMOUNT="" +export EXTRA_CLEANUP="detach_loopback $LOOPDEV" export IMAGE_BLOCK_DEVICE=$LOOPDEV eval_run_d block-device "IMAGE_BLOCK_DEVICE=" sudo mkfs $MKFS_OPTS -t $FS_TYPE -L ${DIB_ROOT_LABEL} ${IMAGE_BLOCK_DEVICE} @@ -382,6 +384,13 @@ done unmount_image cleanup_build_dir +# Write zeros to free blocks to aid compression of images. +if echo "$FS_TYPE" | grep -q "^ext" && which zerofree ; then + sudo zerofree $IMAGE_BLOCK_DEVICE +fi +# We are done with the loopback device make sure it is detached. +$EXTRA_CLEANUP + has_raw_type= if [ "$IS_RAMDISK" == "0" ]; then for IMAGE_TYPE in ${IMAGE_TYPES[@]} ; do diff --git a/doc/source/user_guide/installation.rst b/doc/source/user_guide/installation.rst index 169c088d3..2ef7b8e70 100644 --- a/doc/source/user_guide/installation.rst +++ b/doc/source/user_guide/installation.rst @@ -27,6 +27,11 @@ It is recommended you check the documentation for each element you are using to determine if there are any additional dependencies. Of particular note is the need for the `dev-python/pyyaml` package on Gentoo hosts. +If the zerofree utility is present on the build system and you are building +an image with an ext filesystem zerofree will be used to zero out free +blocks in the image. This makes the resulting images much smaller if +compressed. + Source Installation ------------------- diff --git a/lib/img-functions b/lib/img-functions index cf817ae89..6285c0b93 100644 --- a/lib/img-functions +++ b/lib/img-functions @@ -24,6 +24,8 @@ function unmount_image () { # unmount from the chroot # Don't use TMP_MOUNT_PATH here, it might not have been set. unmount_dir "$TMP_BUILD_DIR/mnt" + + # Left here for backward compatibility if [ -n "$EXTRA_UNMOUNT" ]; then $EXTRA_UNMOUNT fi @@ -39,6 +41,9 @@ function cleanup () { unmount_image cleanup_build_dir cleanup_image_dir + if [ -n "$EXTRA_CLEANUP" ]; then + $EXTRA_CLEANUP + fi } function ensure_nbd () { diff --git a/tests/install_test_deps.sh b/tests/install_test_deps.sh index bbf661518..7925f10ff 100755 --- a/tests/install_test_deps.sh +++ b/tests/install_test_deps.sh @@ -8,8 +8,10 @@ sudo apt-get install -y \ debootstrap \ inetutils-ping \ kpartx \ + zerofree \ qemu-utils || \ sudo yum -y install \ debootstrap \ kpartx \ + zerofree \ qemu-img