summaryrefslogtreecommitdiff
path: root/debvm-create
diff options
context:
space:
mode:
Diffstat (limited to 'debvm-create')
-rwxr-xr-xdebvm-create123
1 files changed, 86 insertions, 37 deletions
diff --git a/debvm-create b/debvm-create
index 0dc619b..d21fd7b 100755
--- a/debvm-create
+++ b/debvm-create
@@ -11,7 +11,7 @@ debvm-create - Create a VM image for various Debian releases and architectures
=head1 SYNOPSIS
-B<debvm-create> [B<-a> I<architecture>] [B<-h> I<hostname>] [B<-k> F<sshkey>] [B<-m> I<mirror>] [B<-o> F<output>] [B<-p> I<package>] [B<-r> I<release>] [B<-z> I<size_in_GB>] [B<--> I<mmdebstrap options>]
+B<debvm-create> [B<-a> I<architecture>] [B<-h> I<hostname>] [B<-k> F<sshkey>] [B<-m> I<mirror>] [B<-o> F<output>] [B<-p> I<package>] [B<-r> I<release>] [B<-s> <task>] [B<-z> I<size_in_GB>] [B<--> I<mmdebstrap options>]
=head1 DESCRIPTION
@@ -59,13 +59,45 @@ By default, it is written to F<rootfs.ext4>.
Request additional packages to be installed into the virtual machine image.
This option can be specified multiple times and packages can be separated by a comma.
Package recommendations are not honoured.
-If a linux-image is passed here, it will replace the one selected by default.
+If a linux-image is passed here, it will also C<--skip=kernel>.
=item B<-r> I<release>, B<--release>=I<release>
Use the given Debian release.
By default, B<unstable> is being used.
+=item B<-s> I<task>, B<--skip>=I<task>
+
+Skip a particular task or feature.
+The option may be specified multiple times or list multiple tasks to be skipped by separating them with a comma.
+By default, no tasks are skipped.
+The following tasks may be skipped.
+
+=over 4
+
+=item B<kernel>
+
+skips installing a linux kernel image.
+This can be useful to install a custom kernel or to install a different kernel variant than is selected by default.
+
+=item B<packagelists>
+
+reduces the package lists inside the image.
+The B<available> database for B<dpkg> is not created.
+The package lists used by B<apt> are deleted.
+This generally produces a smaller image, but you need to run B<apt update> before installing packages and B<dpkg --set-selections> does not work.
+
+=item B<systemdnetwork>
+
+skips installing B<libnss-resolve> as well as automatic network configuration via B<systemd-networkd>.
+
+=item B<usrmerge>
+
+By default B<debvm> adds a hook to enable merged-/usr without the B<usrmerge> package given a sufficiently recent Debian release.
+Without the hook, dependencies will pull the B<usrmerge> package as needed, which may result in a larger installation.
+
+=back
+
=item B<-z> I<size_in_GB>, B<--size>=I<size_in_GB>
Specify the minimum image size in giga bytes.
@@ -93,6 +125,7 @@ IMAGE=rootfs.ext4
INCLUDE_PACKAGES=init
MIRROR="http://deb.debian.org/debian"
SIZE=$((1024*1024*1024))
+SKIP=,
SSHKEY=
SUITE=unstable
VMNAME=testvm
@@ -123,6 +156,9 @@ opt_hostname() {
opt_mirror() {
MIRROR=$1
}
+opt_skip() {
+ SKIP="$SKIP$1,"
+}
opt_sshkey() {
SSHKEY=$1
}
@@ -131,6 +167,9 @@ opt_output() {
}
opt_package() {
INCLUDE_PACKAGES="$INCLUDE_PACKAGES,$1"
+ case "$1" in linux-image*)
+ opt_skip kernel
+ ;; esac
}
opt_release() {
SUITE=$1
@@ -139,7 +178,7 @@ opt_size() {
SIZE=$(($1*1024*1024*1024))
}
-while getopts :a:h:k:m:o:p:r:z:-: OPTCHAR; do
+while getopts :a:h:k:m:o:p:r:s:z:-: OPTCHAR; do
case "$OPTCHAR" in
a) opt_architecture "$OPTARG" ;;
h) opt_hostname "$OPTARG" ;;
@@ -148,18 +187,19 @@ while getopts :a:h:k:m:o:p:r:z:-: OPTCHAR; do
o) opt_output "$OPTARG" ;;
p) opt_package "$OPTARG" ;;
r) opt_release "$OPTARG" ;;
+ s) opt_skip "$OPTARG" ;;
z) opt_size "$OPTARG" ;;
-)
case "$OPTARG" in
help)
usage
;;
- architecture|hostname|mirror|output|package|release|size|sshkey)
+ architecture|hostname|mirror|output|package|release|size|skip|sshkey)
test "$OPTIND" -gt "$#" && usage_error "missing argument for --$OPTARG"
"opt_$OPTARG" "$(nth_arg "$OPTIND" "$@")"
OPTIND=$((OPTIND+1))
;;
- architecture=*|hostname=*|mirror=*|output=*|package=*|release=*|size=*|sshkey=*)
+ architecture=*|hostname=*|mirror=*|output=*|package=*|release=*|size=*|skip=*|sshkey=*)
"opt_${OPTARG%%=*}" "${OPTARG#*=}"
;;
*)
@@ -184,6 +224,13 @@ if test -n "$SSHKEY" && ! test -f "$SSHKEY"; then
die "error: ssh keyfile '$SSHKEY' not found"
fi
+check_skip() {
+ case "$SKIP" in
+ *",$1,"*) return 0 ;;
+ *) return 1 ;;
+ esac
+}
+
case "$SUITE" in
jessie)
DEBVER=8
@@ -239,29 +286,27 @@ case "$ARCHITECTURE" in
;;
esac
-case ",$INCLUDE_PACKAGES," in
- *,linux-image-*)
- ;;
- *)
- INCLUDE_PACKAGES="$INCLUDE_PACKAGES,linux-image$KERNEL_SUFFIX"
- ;;
-esac
+if ! check_skip kernel; then
+ INCLUDE_PACKAGES="$INCLUDE_PACKAGES,linux-image$KERNEL_SUFFIX"
+fi
if test -n "$SSHKEY"; then
INCLUDE_PACKAGES="$INCLUDE_PACKAGES,openssh-server"
fi
-# add a DNS resolver
-if test "$DEBVER" -ge 9; then
- INCLUDE_PACKAGES="$INCLUDE_PACKAGES,libnss-resolve"
-fi
-if test "$DEBVER" -le 11; then
- set -- '--customize-hook=chroot "$1" systemctl enable systemd-resolved.service' "$@"
-fi
-if test "$DEBVER" -le 9; then
- set -- '--customize-hook=ln -fs ../run/systemd/resolve/resolv.conf "$1/etc/resolv.conf"' "$@"
-elif test "$DEBVER" -le 11; then
- set -- '--customize-hook=ln -fs ../run/systemd/resolve/stub-resolv.conf "$1/etc/resolv.conf"' "$@"
+if ! check_skip systemdnetwork; then
+ # add a DNS resolver
+ if test "$DEBVER" -ge 9; then
+ INCLUDE_PACKAGES="$INCLUDE_PACKAGES,libnss-resolve"
+ fi
+ if test "$DEBVER" -le 11; then
+ set -- '--customize-hook=chroot "$1" systemctl enable systemd-resolved.service' "$@"
+ fi
+ if test "$DEBVER" -le 9; then
+ set -- '--customize-hook=ln -fs ../run/systemd/resolve/resolv.conf "$1/etc/resolv.conf"' "$@"
+ elif test "$DEBVER" -le 11; then
+ set -- '--customize-hook=ln -fs ../run/systemd/resolve/stub-resolv.conf "$1/etc/resolv.conf"' "$@"
+ fi
fi
# construct mmdebstrap options as $@:
@@ -284,16 +329,18 @@ set -- \
# allow password-less root login
set -- '--customize-hook=chroot "$1" passwd --delete root' "$@"
-# dhcp on all network interfaces
-SYSD_NET_MATCH='Name=en*\n'
-test "$DEBVER" -le 8 && SYSD_NET_MATCH="${SYSD_NET_MATCH}Name=eth*\\n"
-SYSD_NET_NET='DHCP=yes\n'
-# This anchor is included by default since bullseye. Fails DNSSEC validation when missing.
-test "$DEBVER" -le 11 && SYSD_NET_NET="${SYSD_NET_NET}DNSSECNegativeTrustAnchors=home.arpa\\n"
-set -- \
- '--customize-hook=chroot "$1" systemctl enable systemd-networkd.service' \
- "--customize-hook=printf \"[Match]\\n$SYSD_NET_MATCH\\n[Network]\\n$SYSD_NET_NET"'\n[DHCP]\nUseDomains=yes\n" > "$1/etc/systemd/network/20-wired.network"' \
- "$@"
+if ! check_skip systemdnetwork; then
+ # dhcp on all network interfaces
+ SYSD_NET_MATCH='Name=en*\n'
+ test "$DEBVER" -le 8 && SYSD_NET_MATCH="${SYSD_NET_MATCH}Name=eth*\\n"
+ SYSD_NET_NET='DHCP=yes\n'
+ # This anchor is included by default since bullseye. Fails DNSSEC validation when missing.
+ test "$DEBVER" -le 11 && SYSD_NET_NET="${SYSD_NET_NET}DNSSECNegativeTrustAnchors=home.arpa\\n"
+ set -- \
+ '--customize-hook=chroot "$1" systemctl enable systemd-networkd.service' \
+ "--customize-hook=printf \"[Match]\\n$SYSD_NET_MATCH\\n[Network]\\n$SYSD_NET_NET"'\n[DHCP]\nUseDomains=yes\n" > "$1/etc/systemd/network/20-wired.network"' \
+ "$@"
+fi
# add ssh key for root
if test -n "$SSHKEY"; then
@@ -303,10 +350,12 @@ if test -n "$SSHKEY"; then
"$@"
fi
-set -- --skip=cleanup/apt/lists "$@"
+if ! check_skip packagelists; then
+ set -- --skip=cleanup/apt/lists "$@"
-# We need /var/lib/dpkg/available for dpkg --set-selections to work.
-set -- '--customize-hook=chroot "$1" apt-cache dumpavail | chroot "$1" dpkg --update-avail' "$@"
+ # We need /var/lib/dpkg/available for dpkg --set-selections to work.
+ set -- '--customize-hook=chroot "$1" apt-cache dumpavail | chroot "$1" dpkg --update-avail' "$@"
+fi
if test "$DEBVER" -le 8; then
# Use obsolete and expired keys.
@@ -315,7 +364,7 @@ if test "$DEBVER" -le 8; then
set -- --hook-dir=/usr/share/mmdebstrap/hooks/jessie-or-older "$@"
fi
-if test "$DEBVER" -ge 12; then
+if test "$DEBVER" -ge 12 && ! check_skip usrmerge; then
# Avoid the usrmerge package
set -- --hook-dir=/usr/share/mmdebstrap/hooks/merged-usr "$@"
fi