From 6cd0bef858db460ecb4a6b153225d15bdc62a5fd Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Fri, 23 Dec 2022 12:18:26 +0100 Subject: add documentation in pod2man format Fixes: #2 --- debvm-create | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index a8f164d..6026a7c 100755 --- a/debvm-create +++ b/debvm-create @@ -4,6 +4,85 @@ # shellcheck disable=SC2016 # Intentional quoting technique +: <<'POD2MAN' +=head1 NAME + +debvm-create - Create a VM image for various Debian releases and architectures + +=head1 SYNOPSIS + +B [B<-a> I] [B<-h> I] [B<-k> I] [B<-m> I] [B<-o> I] [B<-p> I] [B<-r> I] [B<-s> I] [B<--> I] + +=head1 DESCRIPTION + +B is essentially a thin wrapper around B for creating a raw ext4 filesystem image for booting with B. +The purpose of these images primarily is testing the different releases and architectures. +Beyond essential packages, the image will contain B, an init system and a suitable kernel package. +Notably absent is a bootloader and partition table. +In order to boot such an image, one is supposed to extract the kernel and initrd from the image and pass it to a suitable bootloader. +No user account is created and root can login without specifying a password. + +=head1 OPTIONS + +=over 8 + +=item B<-a> I + +Specify a Debian architecture name. +By default, the native architecture is being used. +A suitable kernel image is automatically selected and installed into the image. + +=item B<-h> I + +Set the hostname of the virtual machine. +By default, the hostname is B. + +=item B<-k> I + +Install the given ssh public key file into the virtual machine image for the root user. +This option also causes the ssh server to be installed. +By default, no key or server is installed. + +=item B<-m> I + +Specify the Debian mirror to be used for downloading packages and to be configured inside the virtual machine image. +By default, B is being used. + +=item B<-o> I + +Specify the file name of the resulting virtual machine image. +By default, it is written to B. + +=item B<-p> I + +Request additional packages to be installed into the virtual machine image. +This option can be specified multiple times and packages can be separated with comma. +Package recommendations are not honoured. + +=item B<-r> I + +Use the given Debian release. +By default, B is being used. + +=item B<-s> I + +Specify the image size in giga bytes. +The default image size is 1 GB. + +=item B<--> I + +All options beyond a double dash are passed to B before the suite, target and mirror specification. +This can be used to provide additional hooks for image customization. + +=back + +=head1 SEE ALSO + + debvm-run(1) mmdebstrap(1) + +=cut +POD2MAN + set -u ARCHITECTURE=$(dpkg --print-architecture) -- cgit v1.2.3 From 4f4eaae62f21c8229d0e3779d1b1045cdf818dfe Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 23 Dec 2022 17:08:29 +0100 Subject: Use jessie-or-older hook in latest mmdebstrap --- debvm-create | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index a8f164d..da1899c 100755 --- a/debvm-create +++ b/debvm-create @@ -205,8 +205,7 @@ if test "$DEBVER" -le 8; then # Use obsolete and expired keys. set -- '--keyring=/usr/share/keyrings/debian-archive-removed-keys.gpg' "$@" set -- --aptopt='Apt::Key::gpgvcommand "/usr/libexec/mmdebstrap/gpgvnoexpkeysig"' "$@" - # chfn does not work, because libpam-runtime.postinst is late setting up /etc/pam.d/common-auth et al, see #1026765 - set -- --extract-hook='chroot "$1" pam-auth-update --package --force' "$@" + set -- --hook-dir=/usr/share/mmdebstrap/hooks/jessie-or-older "$@" fi if test "$DEBVER" -ge 12; then -- cgit v1.2.3 From 9aa4cb7de93569c35994faea051b9e390da25008 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Fri, 23 Dec 2022 22:51:50 +0100 Subject: standardize on image name rootfs.ext4 Reported-by: Johannes Schauer Marin Rodrigues --- debvm-create | 4 ++-- debvm-run | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index 6026a7c..5fc8950 100755 --- a/debvm-create +++ b/debvm-create @@ -86,7 +86,7 @@ POD2MAN set -u ARCHITECTURE=$(dpkg --print-architecture) -IMAGE=rootfs.ext2 +IMAGE=rootfs.ext4 INCLUDE_PACKAGES=init MIRROR="http://deb.debian.org/debian" SIZE=$((1024*1024*1024)) @@ -304,4 +304,4 @@ truncate -s "$SIZE" "$IMAGE" /sbin/resize2fs "$IMAGE" /sbin/tune2fs -L debvm -i 0 -O extents,uninit_bg,dir_index,has_journal "$IMAGE" # Must fsck after tune2fs: https://ext4.wiki.kernel.org/index.php/UpgradeToExt4 -/sbin/fsck.ext4 -fDp rootfs.ext2 +/sbin/fsck.ext4 -fDp "$IMAGE" diff --git a/debvm-run b/debvm-run index 1081597..729ba6d 100755 --- a/debvm-run +++ b/debvm-run @@ -32,7 +32,7 @@ This configuration is skipped in the presence of this option. =item B<-i> I This option specifies the location of the virtual machine image file. -By default B in the working directory is used. +By default B in the working directory is used. =item B<-s> I @@ -60,7 +60,7 @@ POD2MAN set -u -IMAGE=rootfs.ext2 +IMAGE=rootfs.ext4 SSHPORT= GRAPHICAL= -- cgit v1.2.3 From 86ad5dc1f589d78053eeaa7054dd5a4e5d606422 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Fri, 23 Dec 2022 22:55:37 +0100 Subject: improve documentation wording and content Reported-by: Johannes Schauer Marin Rodrigues --- debvm-create | 6 +++--- debvm-run | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index 5fc8950..65b3c54 100755 --- a/debvm-create +++ b/debvm-create @@ -16,9 +16,9 @@ B [B<-a> I] [B<-h> I] [B<-k> I] [B =head1 DESCRIPTION B is essentially a thin wrapper around B for creating a raw ext4 filesystem image for booting with B. -The purpose of these images primarily is testing the different releases and architectures. +The purpose of these images primarily is testing the different releases and architectures without access to a physical machine of that architecture. Beyond essential packages, the image will contain B, an init system and a suitable kernel package. -Notably absent is a bootloader and partition table. +Notably absent is a bootloader and a partition table. In order to boot such an image, one is supposed to extract the kernel and initrd from the image and pass it to a suitable bootloader. No user account is created and root can login without specifying a password. @@ -56,7 +56,7 @@ By default, it is written to B. =item B<-p> I Request additional packages to be installed into the virtual machine image. -This option can be specified multiple times and packages can be separated with comma. +This option can be specified multiple times and packages can be separated by a comma. Package recommendations are not honoured. =item B<-r> I diff --git a/debvm-run b/debvm-run index 729ba6d..cb782db 100755 --- a/debvm-run +++ b/debvm-run @@ -13,7 +13,7 @@ B [B<-g>] [B<-i> I] [B<-s> I] [B<--> I] =head1 DESCRIPTION -B is essentially a thing wrapper around B for running a virtual machine image created by B or something compatible. +B is essentially a thin wrapper around B for running a virtual machine image created by B or something compatible. The virtual machine image is expected to be a raw ext4 image with file system label B. The architecture of the machine is detected from the contained B. It must contain a symbolic link pointing to a kernel image at B or B depending on the architecture and a symbolic link pointing to an initrd image at B. @@ -42,14 +42,16 @@ If given, B is configured to pass connections to I<127.0.0.1:sshport> to p All options beyond a double dash are passed to B. This can be used to configure additional hardware components. -Another use of this method is passing B<-snapshot> to avoid modifying the virtual machine image. +One possible use of this method is passing B<-snapshot> to avoid modifying the virtual machine image. =back =head1 LIMITATIONS -Due to the way kernel and bootloader are being extracted before running qemu, one cannot upgrade a kernel and then just reboot. +Due to the way kernel and bootloader are being extracted before running B, one cannot upgrade a kernel and then just reboot. +Attempting to do so, will still use the old kernel. Instead, B must be terminated and B should be launched again to pick up a new kernel. +In order to avoid accidental reboots, one may pass B<-no-reboot> to B. =head1 SEE ALSO -- cgit v1.2.3 From 99374d17fc20abc1659d46280971376f795babaf Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 23 Dec 2022 23:40:06 +0100 Subject: Fix image name for fsck --- debvm-create | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index a8f164d..7cc5e31 100755 --- a/debvm-create +++ b/debvm-create @@ -225,4 +225,4 @@ truncate -s "$SIZE" "$IMAGE" /sbin/resize2fs "$IMAGE" /sbin/tune2fs -L debvm -i 0 -O extents,uninit_bg,dir_index,has_journal "$IMAGE" # Must fsck after tune2fs: https://ext4.wiki.kernel.org/index.php/UpgradeToExt4 -/sbin/fsck.ext4 -fDp rootfs.ext2 +/sbin/fsck.ext4 -fDp "$IMAGE" -- cgit v1.2.3 From 98fd7c69af3dd9b2dc56399197dc1e441939012e Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Sun, 25 Dec 2022 17:35:22 +0100 Subject: debvm-create: do not truncate images beyond their minimum size --- debvm-create | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index da1899c..d3631fc 100755 --- a/debvm-create +++ b/debvm-create @@ -220,8 +220,11 @@ set -ex mmdebstrap "$@" -truncate -s "$SIZE" "$IMAGE" -/sbin/resize2fs "$IMAGE" +IMAGESIZE=$(stat -c %s "$IMAGE") +if test "$IMAGESIZE" -lt "$SIZE"; then + truncate -s "$SIZE" "$IMAGE" + /sbin/resize2fs "$IMAGE" +fi /sbin/tune2fs -L debvm -i 0 -O extents,uninit_bg,dir_index,has_journal "$IMAGE" # Must fsck after tune2fs: https://ext4.wiki.kernel.org/index.php/UpgradeToExt4 /sbin/fsck.ext4 -fDp rootfs.ext2 -- cgit v1.2.3 From c42caac69b5d32c6330716a829d33086b04f2b76 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Tue, 27 Dec 2022 13:05:00 +0100 Subject: support long options This change extends option parsing of the debvm tools: * Uses posix getopts. No additional dependencies. * Long option are supported. The option value may be a separate argument or separated with =. * Option value may follow short option immediately, e.g. -as390x * Multiple short options may be combined, e.g. -gs 2222 Technical limitation: * Short options are parsed inside a double dash, e.g. -g-image=rootfs.ext4 --- debvm-create | 111 +++++++++++++++++++++++++++++++++++------------------------ debvm-run | 66 +++++++++++++++++++++++++---------- 2 files changed, 113 insertions(+), 64 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index d3631fc..5ac62e7 100755 --- a/debvm-create +++ b/debvm-create @@ -15,67 +15,88 @@ SSHKEY= SUITE=unstable VMNAME=testvm +nth_arg() { + shift "$1" + printf "%s" "$1" +} + die() { echo "$*" 1>&2 exit 1 } - usage() { die "usage: $0 [-a architecture] [-h hostname] [-k sshkey] [-m mirror] [-o output] [-p packages] [-r release] [-s size_in_GB] [-- mmdebstrap options]" } +usage_error() { + echo "error: $*" 1>&2 + usage +} +opt_architecture() { + ARCHITECTURE=$1 +} +opt_hostname() { + VMNAME=$1 +} +opt_mirror() { + MIRROR=$1 +} +opt_sshkey() { + SSHKEY=$1 +} +opt_output() { + IMAGE=$1 +} +opt_package() { + INCLUDE_PACKAGES="$INCLUDE_PACKAGES,$1" +} +opt_release() { + SUITE=$1 +} +opt_size() { + SIZE=$(($1*1024*1024*1024)) +} -while test "$#" -gt 0; do - case "$1" in - -a) - test "$#" -eq 1 && usage - ARCHITECTURE=$2 - shift 2 - ;; - -h) - test "$#" -eq 1 && usage - VMNAME=$2 - shift 2 - ;; - -k) - test "$#" -eq 1 && usage - SSHKEY=$2 - shift 2 - ;; - -m) - test "$#" -eq 1 && usage - MIRROR=$2 - shift 2 - ;; - -o) - test "$#" -eq 1 && usage - IMAGE=$2 - shift 2 - ;; - -p) - test "$#" -eq 1 && usage - INCLUDE_PACKAGES="$INCLUDE_PACKAGES,$2" - shift 2 - ;; - -r) - test "$#" -eq 1 && usage - SUITE=$2 - shift 2 +while getopts :a:h:k:m:o:p:r:s:-: OPTCHAR; do + case "$OPTCHAR" in + a) opt_architecture "$OPTARG" ;; + h) opt_hostname "$OPTARG" ;; + k) opt_sshkey "$OPTARG" ;; + m) opt_mirror "$OPTARG" ;; + o) opt_output "$OPTARG" ;; + p) opt_package "$OPTARG" ;; + r) opt_release "$OPTARG" ;; + s) opt_size "$OPTARG" ;; + -) + case "$OPTARG" in + help) + usage + ;; + architecture|hostname|mirror|output|package|release|size|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=*) + "opt_${OPTARG%%=*}" "${OPTARG#*=}" + ;; + *) + usage_error "unrecognized option --$OPTARG" + ;; + esac ;; - -s) - test "$#" -eq 1 && usage - SIZE=$(($2*1024*1024*1024)) - shift 2 + :) + usage_error "missing argument for -$OPTARG" ;; - --) - shift - break + '?') + usage_error "unrecognized option -$OPTARG" ;; *) - usage + die "internal error while parsing command options, please report a bug" ;; esac done +shift "$((OPTIND - 1))" if test -n "$SSHKEY" && ! test -f "$SSHKEY"; then die "error: ssh keyfile '$SSHKEY' not found" diff --git a/debvm-run b/debvm-run index 972eac6..c800215 100755 --- a/debvm-run +++ b/debvm-run @@ -8,40 +8,68 @@ IMAGE=rootfs.ext2 SSHPORT= GRAPHICAL= +nth_arg() { + shift "$1" + printf "%s" "$1" +} + die() { echo "$*" 1>&2 exit 1 } - usage() { die "usage: $0 [-g] [-i image] [-s sshport] [-- qemu options]" } +usage_error() { + echo "error: $*" 1>&2 + usage +} -while test "$#" -gt 0; do - case "$1" in - -g) - GRAPHICAL=1 - shift - ;; - -i) - test "$#" -eq 1 && usage - IMAGE=$2 - shift 2 +opt_graphical() { + GRAPHICAL=1 +} +opt_image() { + IMAGE=$1 +} +opt_sshport() { + SSHPORT=$1 +} + +while getopts :gi:s:-: OPTCHAR; do + case "$OPTCHAR" in + g) opt_graphical ;; + i) opt_image "$OPTARG" ;; + s) opt_sshport "$OPTARG" ;; + -) + case "$OPTARG" in + help) + usage + ;; + graphical|image|sshport) + test "$OPTIND" -gt "$#" && usage_error "missing argument for --$OPTARG" + "opt_$OPTARG" "$(nth_arg "$OPTIND" "$@")" + OPTIND=$((OPTIND+1)) + ;; + image=*|sshport=*) + "opt_${OPTARG%%=*}" "${OPTARG#*=}" + ;; + *) + usage_error "unrecognized option --$OPTARG" + ;; + esac ;; - -s) - test "$#" -eq 1 && usage - SSHPORT=$2 - shift 2 + :) + usage_error "missing argument for -$OPTARG" ;; - --) - shift - break + '?') + usage_erro "unrecognized option -$OPTARG" ;; *) - usage + die "internal error while parsing command options, please report a bug" ;; esac done +shift "$((OPTIND - 1))" test -f "$IMAGE" || die "image '$IMAGE' not found" test -s "$IMAGE" || die "image '$IMAGE' is empty" -- cgit v1.2.3 From d43e76f6f4c3f2e6ce196c5544b7ff5653c024c8 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Wed, 28 Dec 2022 08:16:25 +0100 Subject: debvm-create: allow easily overriding the kernel image When adding your own kernel image via -p, it will now skip the automatically detected one. --- debvm-create | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index a903350..c4159e1 100755 --- a/debvm-create +++ b/debvm-create @@ -111,8 +111,6 @@ case "$SUITE" in ;; esac - - KERNEL_SUFFIX=-$ARCHITECTURE case "$ARCHITECTURE" in amd64|arm64) @@ -138,7 +136,13 @@ case "$ARCHITECTURE" in ;; esac -INCLUDE_PACKAGES="$INCLUDE_PACKAGES,linux-image$KERNEL_SUFFIX" +case ",$INCLUDE_PACKAGES," in + *,linux-image-*) + ;; + *) + INCLUDE_PACKAGES="$INCLUDE_PACKAGES,linux-image$KERNEL_SUFFIX" + ;; +esac if test -n "$SSHKEY"; then INCLUDE_PACKAGES="$INCLUDE_PACKAGES,openssh-server" -- cgit v1.2.3 From b666a2909890a7954b103388ec846cac8ce55722 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Wed, 28 Dec 2022 10:06:49 +0100 Subject: debvm-create: rename -s option to -z The idea is to eventually add a mechanism for skipping steps similar to how mmdebstrap allows skipping them. --- debvm-create | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index 2362beb..cddab8f 100755 --- a/debvm-create +++ b/debvm-create @@ -25,7 +25,7 @@ die() { exit 1 } usage() { - die "usage: $0 [-a architecture] [-h hostname] [-k sshkey] [-m mirror] [-o output] [-p packages] [-r release] [-s size_in_GB] [-- mmdebstrap options]" + die "usage: $0 [-a architecture] [-h hostname] [-k sshkey] [-m mirror] [-o output] [-p packages] [-r release] [-z size_in_GB] [-- mmdebstrap options]" } usage_error() { echo "error: $*" 1>&2 @@ -57,7 +57,7 @@ opt_size() { SIZE=$(($1*1024*1024*1024)) } -while getopts :a:h:k:m:o:p:r:s:-: OPTCHAR; do +while getopts :a:h:k:m:o:p:r:z:-: OPTCHAR; do case "$OPTCHAR" in a) opt_architecture "$OPTARG" ;; h) opt_hostname "$OPTARG" ;; @@ -66,7 +66,7 @@ while getopts :a:h:k:m:o:p:r:s:-: OPTCHAR; do o) opt_output "$OPTARG" ;; p) opt_package "$OPTARG" ;; r) opt_release "$OPTARG" ;; - s) opt_size "$OPTARG" ;; + z) opt_size "$OPTARG" ;; -) case "$OPTARG" in help) -- cgit v1.2.3 From 293a1fa978c0dff81bdf6f37f89eef22066783c6 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Wed, 28 Dec 2022 10:19:07 +0100 Subject: update pod2man documentation * Rename debvm-create -s to -z. * Add long options. * Improve documentation of debvm-create -p and -z. --- debvm-create | 24 +++++++++++++----------- debvm-run | 6 +++--- 2 files changed, 16 insertions(+), 14 deletions(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index 37fa514..b39330b 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 [B<-a> I] [B<-h> I] [B<-k> I] [B<-m> I] [B<-o> I] [B<-p> I] [B<-r> I] [B<-s> I] [B<--> I] +B [B<-a> I] [B<-h> I] [B<-k> I] [B<-m> I] [B<-o> I] [B<-p> I] [B<-r> I] [B<-z> I] [B<--> I] =head1 DESCRIPTION @@ -26,48 +26,50 @@ No user account is created and root can login without specifying a password. =over 8 -=item B<-a> I +=item B<-a> I, B<--architecture>=I Specify a Debian architecture name. By default, the native architecture is being used. A suitable kernel image is automatically selected and installed into the image. -=item B<-h> I +=item B<-h> I, B<--hostname>=I Set the hostname of the virtual machine. By default, the hostname is B. -=item B<-k> I +=item B<-k> I, B<--sshkey>=I Install the given ssh public key file into the virtual machine image for the root user. This option also causes the ssh server to be installed. By default, no key or server is installed. -=item B<-m> I +=item B<-m> I, B<--mirror>=I Specify the Debian mirror to be used for downloading packages and to be configured inside the virtual machine image. By default, B is being used. -=item B<-o> I +=item B<-o> I, B<--output>=I Specify the file name of the resulting virtual machine image. By default, it is written to B. -=item B<-p> I +=item B<-p> I, B<--package>=I 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. -=item B<-r> I +=item B<-r> I, B<--release>=I Use the given Debian release. By default, B is being used. -=item B<-s> I +=item B<-z> I, B<--size>=I -Specify the image size in giga bytes. -The default image size is 1 GB. +Specify the minimum image size in giga bytes. +The resulting image will be grown as a sparse file to this size if necessary. +The default is 1 GB. =item B<--> I diff --git a/debvm-run b/debvm-run index 58bf2f7..d6a5422 100755 --- a/debvm-run +++ b/debvm-run @@ -24,17 +24,17 @@ A net interface configured for user mode is added automatically. =over 8 -=item B<-g> +=item B<-g>, B<--graphical> By default, the option B<-nographic> is passed to B and one interacts with the serial console of the machine. This configuration is skipped in the presence of this option. -=item B<-i> I +=item B<-i> I, B<--image>=I This option specifies the location of the virtual machine image file. By default B in the working directory is used. -=item B<-s> I +=item B<-s> I, B<--sshport>=I If given, B is configured to pass connections to I<127.0.0.1:sshport> to port 22 of the virtual machine. -- cgit v1.2.3 From 365fd80e150e940e045be185bd58aac16363c4a8 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Wed, 28 Dec 2022 17:03:36 +0100 Subject: debvm-create: do clean downloaded .debs What should remain is downloaded package lists. --- debvm-create | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'debvm-create') diff --git a/debvm-create b/debvm-create index cddab8f..da660cb 100755 --- a/debvm-create +++ b/debvm-create @@ -221,7 +221,7 @@ if test -n "$SSHKEY"; then "$@" fi -set -- --skip=cleanup/apt "$@" +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' "$@" -- cgit v1.2.3