diff options
author | Helmut Grohne <helmut@subdivi.de> | 2024-03-25 10:58:42 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2024-03-25 10:58:42 +0100 |
commit | 4db215b6edba4b9d79c5439f3c9c4596915069b2 (patch) | |
tree | 2aa7edf830f3e97a52eb9aee0c8870b2b5575cc6 /bin | |
parent | c3ceb1929c4154db42003350d54d41ba4beb20e5 (diff) | |
parent | fd97cb52975a11ba2e019f12c1aecd5123bd2204 (diff) | |
download | debvm-4db215b6edba4b9d79c5439f3c9c4596915069b2.tar.gz |
Merge feature-mkfs.ext4 into main
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/debvm-create | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/bin/debvm-create b/bin/debvm-create index bfc02e3..1c59a83 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 @@ -305,9 +305,16 @@ set -- \ --verbose \ --variant=apt \ "--format=$MMFORMAT" \ + --skip=output/dev \ '--customize-hook=echo "LABEL=debvm / ext4 defaults 0 0" >"$1/etc/fstab"' \ "$@" +if test "$(id -u)" = 0; then + set -- --mode=root "$@" +else + set -- --mode=unshare "$@" +fi + if test -n "$ARCHITECTURE"; then set -- "--architecture=$ARCHITECTURE" "$@" fi @@ -393,20 +400,41 @@ if ! check_skip autologin; then set -- "--customize-hook=$SHARE_DIR/customize-autologin.sh" "$@" fi -set -- "$SUITE" "$IMAGE" "$@" +if test "$(id -u)" = 0; then + run_inside_userns() { + "$@" + } +else + run_inside_userns() { + unshare --user --map-auto --map-user=65536 --map-group=65536 --keep-caps -- "$@" + } +fi -set -ex +if check_skip ext4; then + set -- "$SUITE" "$IMAGE" "$@" + set -x + exec mmdebstrap "$@" +fi -mmdebstrap "$@" +TEMPROOT= +cleanup() { + if test -n "$TEMPROOT"; then + run_inside_userns rm -Rf "$TEMPROOT" + fi +} -{ set +x; } 2>/dev/null -check_skip ext4 && exit +trap cleanup EXIT +# The default action for these signals does not invoke the EXIT trap. +trap 'exit 1' HUP INT QUIT TERM +TEMPROOT="$(mktemp -d)" -set -x +set -- "$SUITE" "$TEMPROOT" "$@" + +set -ex + +# Create and truncate the file with "normal" permission. +: >"$IMAGE" + +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" +run_inside_userns /sbin/mkfs.ext4 -L debvm -d "$TEMPROOT" "$IMAGE" "$SIZE" |