From 5184d02a7c80cf4b2d2851695f0a205994129ef7 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Sun, 6 Mar 2016 09:43:59 -0800 Subject: [PATCH] Zerofree the image if possible If the image has an ext filesystem and the zerofree utility is present on the build system then run zerofree. This should make images as compressable as possible which is a nice feature when building compressed qcow2 images. Change-Id: Ia6062c291f7a3f58b85a4f408ecb3d0574c65d53 --- bin/disk-image-create | 11 ++++++++++- doc/source/user_guide/installation.rst | 5 +++++ lib/img-functions | 5 +++++ tests/install_test_deps.sh | 2 ++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/bin/disk-image-create b/bin/disk-image-create index 2b6a94d9..4bb06f2d 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 169c088d..2ef7b8e7 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 cf817ae8..6285c0b9 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 bbf66151..7925f10f 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