summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/debvm-create60
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"