diff options
author | Helmut Grohne <helmut@subdivi.de> | 2024-02-26 14:39:12 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2024-02-26 14:39:12 +0100 |
commit | f0979fae03bcc4767ac4df1cb8fad9277e952637 (patch) | |
tree | 6784eb09ab5e00730f20a270c70a47372b565e4f /bin | |
parent | c3ceb1929c4154db42003350d54d41ba4beb20e5 (diff) | |
download | debvm-f0979fae03bcc4767ac4df1cb8fad9277e952637.tar.gz |
debvm-create: switch from genext2fs to mkfs.ext4
Why?
genext2fs is slow. It has O(n^2) behaviour, which becomes annoying with
larger filesystems. It also creates an ext2 image and we have to upgrade
it to ext4 in multiple steps. Even then, the image has an inode size of
128, which is incompatible with 2038 and does not allow storing
sub-second precision time stamps.
How?
We use mkfs.ext4 from e2fsprogs (which is required anyway) instead.
Running this from within a --customize-hook does not work, because the
user namespace used for the hook often has no privileges to write to the
output image. Instead, we now ask mmdebstrap to output to a directory
and create the filesystem separately. We construct a special namespace
that has both access to the tree and to the output image and perform the
mkfs.ext4 there. As a consequence, we no longer support any mode but
unshare and since mkfs.ext4 consumes the size parameter, the size syntax
is reduced a bit.
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/debvm-create | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/bin/debvm-create b/bin/debvm-create index bfc02e3..b93fa23 100755 --- a/bin/debvm-create +++ b/bin/debvm-create @@ -74,8 +74,8 @@ This is specific to using B<finit>, B<runit>, B<systemd> or B<sysv> as init syst =item B<ext4> -Internally, B<mmdebstrap> creates a tar archive first and converts that to ext2, which is then upgraded to ext4. -This option causes the conversion to ext2 and further steps to be skipped and the output image will be a tar archive instead. +Normally, B<mmdebstrap> bootstraps to a temporary directory and we create the output ext4 image from that directory. +This option causes the creation of the ext4 image to be skipped and the output file becomes a tar archive of the temporary directory instead. Such a tar archive is not suitable for being booted by B<debvm-run>. =item B<ifupdown> @@ -116,7 +116,7 @@ Without the hook, dependencies will pull the B<usrmerge> package as needed, whic =item B<-z> I<size>, B<--size>=I<size> Specify the minimum image size as an integer and optional unit (example: 10K is 10*1024). -Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000). +Units are K,M,G,T (powers of 1024). The resulting image will be grown as a sparse file to this size if necessary. The default is 1 GB. @@ -294,7 +294,7 @@ if ! check_skip kernel; then set -- "--customize-hook=$SHARE_DIR/customize-kernel.sh" "$@" fi -MMFORMAT=ext2 +MMFORMAT=directory # output a tarball if the ext4 step is skipped if check_skip ext4; then MMFORMAT=tar @@ -303,6 +303,7 @@ fi # construct mmdebstrap options as $@: set -- \ --verbose \ + --mode=unshare \ --variant=apt \ "--format=$MMFORMAT" \ '--customize-hook=echo "LABEL=debvm / ext4 defaults 0 0" >"$1/etc/fstab"' \ @@ -393,20 +394,34 @@ if ! check_skip autologin; then set -- "--customize-hook=$SHARE_DIR/customize-autologin.sh" "$@" fi -set -- "$SUITE" "$IMAGE" "$@" +run_inside_userns() { + unshare --user --map-auto --map-user=65536 --map-group=65536 --keep-caps -- "$@" +} -set -ex +TEMPROOT= +cleanup() { + if test -n "$TEMPROOT"; then + run_inside_userns rm -Rf "$TEMPROOT" + fi +} -mmdebstrap "$@" +if check_skip ext4; then + set -- "$IMAGE" "$@" +else + trap cleanup EXIT + trap 'exit 1' HUP INT QUIT TERM + TEMPROOT="$(mktemp -d)" -{ set +x; } 2>/dev/null -check_skip ext4 && exit + set -- "$TEMPROOT" "$@" +fi + +set -- "$SUITE" "$@" -set -x +set -ex + +mmdebstrap "$@" -truncate -s ">$SIZE" "$IMAGE" -/sbin/resize2fs "$IMAGE" -/sbin/tune2fs -L debvm -c 0 -i 0 -O dir_index,dir_nlink,extents,extra_isize,flex_bg,has_journal,huge_file "$IMAGE" -/sbin/resize2fs -b "$IMAGE" -# Must fsck after tune2fs: https://ext4.wiki.kernel.org/index.php/UpgradeToExt4 -/sbin/fsck.ext4 -fDp "$IMAGE" +# Create and truncate the file with "normal" permission. +: >"$IMAGE" +check_skip ext4 || + run_inside_userns /sbin/mkfs.ext4 -L debvm -d "$TEMPROOT" "$IMAGE" "$SIZE" |