summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbill-auger <mr.j.spam.me@gmail.com>2020-04-01 13:49:42 -0400
committerbill-auger <mr.j.spam.me@gmail.com>2020-04-01 15:38:43 -0400
commitd593ad28e117d864f2ff6c2e306f2ff3a3c51dd9 (patch)
tree4c78347117e85b0ecf37d817ff3c009d6cd50851
parent78164b7e37da7be898f14075fae8506cdf67bc7f (diff)
housekeeping
-rw-r--r--README16
-rwxr-xr-xsrc/pvmbootstrap.sh96
2 files changed, 60 insertions, 52 deletions
diff --git a/README b/README
index 7e209bb..f2b02e1 100644
--- a/README
+++ b/README
@@ -27,25 +27,31 @@ The creation can be influenced by providing one or more of the following
options to pvmbootstrap:
-b <base-set> -- Select one of the pre-defined package-sets described below
- (default: 'standard')
+ (default: standard)
+ -c <package> -- Specify a package to store in the image pacman cache.
+ This option does not implcitly install the package.
+ This option can be specified multiple times;
+ but note that these will be ignored if -s <root_size> is 0.
-H <hook> -- Enable a hook to customize the created image. This can be
the path to a custom script, or one of the predefined hooks
described below. The VM will boot the newly created image,
and the hook script(s) will be executed once each within
the running VM. This option can be specified multiple times.
- -k <kernel> -- Choose an additional kernel package (default: linux-libre).
+ -k <kernel> -- Specify an additional kernel package (default: linux-libre).
This option can be specified multiple times; but note that
'linux-libre' will be installed, regardless of this option.
-M <mirror> -- Set the mirror from which to fetch packages
(default: https://repo.parabola.nu/$repo/os/$arch)
-O -- Bootstrap an openrc system instead of a systemd one
- -p <package> -- Specify additional packages to be installed in the VM image.
- This option can be specified multiple times.
+ -p <package> -- Specify an additional package to be installed in the image.
+ This option can be specified multiple times;
+ but note that these will be ignored if -s <root_size> is 0.
-s <root_size> -- Set the size (in MB) of the root partition (default: 32000).
If this is 0 (or less than the <base-set> requires),
the VM image will be the smallest size possible,
fit to the <base-set>; and any -p <package> will be ignored.
- -S <swap_size> -- Set the size (in MB) of the swap partition (default: 0)
+ -S <swap_size> -- Set the size (in MB) of the swap partition (default: 0).
+ If this is 0, no swap partition will be created.
Pre-defined package-sets:
minimal: base
diff --git a/src/pvmbootstrap.sh b/src/pvmbootstrap.sh
index dc8d7f3..1753487 100755
--- a/src/pvmbootstrap.sh
+++ b/src/pvmbootstrap.sh
@@ -33,15 +33,15 @@ readonly DEF_MIRROR=https://repo.parabola.nu
readonly DEF_ROOT_MB=32000
readonly DEF_BOOT_MB=100
readonly DEF_SWAP_MB=0
-readonly MANDATORY_PKGS_ALL=( )
-readonly MANDATORY_PKGS_armv7h=( haveged net-tools )
-readonly MANDATORY_PKGS_i686=( haveged net-tools grub )
-readonly MANDATORY_PKGS_ppc64le=( haveged net-tools )
-readonly MANDATORY_PKGS_riscv64=( )
-readonly MANDATORY_PKGS_x86_64=( haveged net-tools grub )
+readonly PKGS_MANDATORY_ALL=( )
+readonly PKGS_MANDATORY_armv7h=( haveged net-tools )
+readonly PKGS_MANDATORY_i686=( haveged net-tools grub )
+readonly PKGS_MANDATORY_ppc64le=( haveged net-tools )
+readonly PKGS_MANDATORY_riscv64=( )
+readonly PKGS_MANDATORY_x86_64=( haveged net-tools grub )
# misc
-readonly GUEST_CACHED_PKGS=('ca-certificates-utils')
+readonly PKGS_GUEST_CACHED=('ca-certificates-utils')
readonly PVM_HOOKS_SUCCESS_MSG="[hooks.sh] pre-init hooks successful"
# options
@@ -52,8 +52,8 @@ Kernels=($DEF_KERNEL)
Mirror=$DEF_MIRROR
IsNonsystemd=0
Pkgs=(${DEF_PKGS[@]})
-PkgsCached=(${GUEST_CACHED_PKGS[@]})
-OptPkgs=()
+PkgsCached=(${PKGS_GUEST_CACHED[@]})
+PkgsOptional=()
RootSizeMb=$DEF_ROOT_MB
BootSizeMb=$DEF_BOOT_MB
SwapSizeMb=$DEF_SWAP_MB
@@ -76,7 +76,7 @@ usage()
echo
echo "Supported options:"
echo " -b <base-set> Select one of the pre-defined package-sets described below"
- echo " (default: '$PKG_SET_STD')"
+ echo " (default: $PKG_SET_STD)"
echo " -c <package> Specify a package to store in the image pacman cache."
echo " This option does not implcitly install the package."
echo " This option can be specified multiple times;"
@@ -94,14 +94,15 @@ usage()
echo " -O Bootstrap an openrc system instead of a systemd one"
echo " NOTE: This option is currently ignored; because"
echo " the 'preinit' hook is implemented as a systemd service."
- echo " -p <package> Specify an additional package to be installed in the VM image."
+ echo " -p <package> Specify an additional package to be installed in the image."
echo " This option can be specified multiple times;"
echo " but note that these will be ignored if -s <root_size> is 0."
echo " -s <root_size> Set the size (in MB) of the root partition (default: $DEF_ROOT_MB)."
echo " If this is 0 (or less than the <base-set> requires),"
echo " the VM image will be the smallest size possible,"
echo " fit to the <base-set>; and any -p <package> will be ignored."
- echo " -S <swap_size> Set the size (in MB) of the swap partition (default: $DEF_SWAP_MB)"
+ echo " -S <swap_size> Set the size (in MB) of the swap partition (default: $DEF_SWAP_MB)."
+ echo " If this is 0, no swap partition will be created."
echo
echo "Pre-defined package-sets:"
print " $PKG_SET_MIN:%$((15 - ${#PKG_SET_MIN}))s${MIN_PKGS[*]}" ""
@@ -127,11 +128,10 @@ pvm_bootstrap() # assumes: $arch $imagefile $loopdev $workdir , traps: INT TERM
# prepare for cleanup
trap 'pvm_bootstrap_cleanup' INT TERM RETURN
- local img_mb=$(( $BootSizeMb + $SwapSizeMb + $RootSizeMb ))
- msg "starting build for %s image: %s (%sMB)" "$arch" "$imagefile" "$img_mb"
+ msg "starting build for %s image: %s (%sMB)" "$arch" "$imagefile" "$ImgSizeMb"
# create the raw image file
- qemu-img create -f raw "$imagefile" "${img_mb}M" || return "$EXIT_FAILURE"
+ qemu-img create -f raw "$imagefile" "${ImgSizeMb}M" || return "$EXIT_FAILURE"
# mount the virtual disk
local bootdir workdir loopdev
@@ -220,26 +220,6 @@ pvm_bootstrap() # assumes: $arch $imagefile $loopdev $workdir , traps: INT TERM
for mirror_n in {1..5}; do echo "Server = $Mirror/\$repo/os/\$arch" >> "$pacconf"; done;
done
- # prepare package lists
- local kernels=( ${Kernels[@]} )
- local pkgs=( ${Pkgs[@]} ${Kernels[@]} ${OptPkgs[@]} ${MANDATORY_PKGS_ALL[@]} )
- local pkgs_cached=( ${PkgsCached[@]} )
- case "$arch" in
- armv7h ) pkgs+=( ${MANDATORY_PKGS_armv7h[@]} ) ;;
- i686 ) pkgs+=( ${MANDATORY_PKGS_i686[@]} ) ;;
- ppc64le) pkgs+=( ${MANDATORY_PKGS_ppc64le[@]} ) ;;
- riscv64) pkgs+=( ${MANDATORY_PKGS_riscv64[@]} ) ;;
- x86_64 ) pkgs+=( ${MANDATORY_PKGS_x86_64[@]} ) ;;
- esac
- (( $IsNonsystemd )) && [[ "$BasePkgSet" == "$PKG_SET_MIN" ]] && pkgs+=(libelogind)
- (( ! $IsNonsystemd )) && [[ "${Hooks[@]}" =~ hook-ethernet-dhcp.sh ]] && pkgs+=(dhcpcd)
-
- # minimize package lists
- local kernel ; local pkg ; Kernels=() ; Pkgs=() ; PkgsCached=() ;
- for kernel in $(printf "%s\n" "${kernels[@]}" | sort -u) ; do Kernels+=($kernel) ; done ;
- for pkg in $(printf "%s\n" "${pkgs[@]}" | sort -u) ; do Pkgs+=($pkg) ; done ;
- for pkg in $(printf "%s\n" "${pkgs_cached[@]}" | sort -u) ; do PkgsCached+=($pkg) ; done ;
-
# pacstrap! :)
msg "installing packages into the work chroot"
sudo pacstrap -GMc -C "$pacconf" "$workdir" "${Pkgs[@]}" || return "$EXIT_FAILURE"
@@ -442,16 +422,16 @@ main() # ( [cli_options] imagefile arch )
$PKG_SET_DEV) BasePkgSet=$OPTARG ; Pkgs=(${DEV_PKGS[@]}) ; MinRootMb=$ROOT_MB_DEV ;;
* ) warning "invalid base set: %s" "$OPTARG" ;;
esac ;;
- c) PkgsCached+=($OPTARG) ;;
- h) usage; return "$EXIT_SUCCESS" ;;
- H) Hooks+=( "$(pvm_get_hook $OPTARG)" ) ;;
- k) Kernels+=($OPTARG) ;;
- M) Mirror="$OPTARG" ;;
- O) IsNonsystemd=0 ;; # TODO:
- p) OptPkgs+=($OPTARG) ;;
- s) RootSizeMb="$(sed 's|[^0-9]||g' <<<$OPTARG)" ;;
- S) SwapSizeMb="$(sed 's|[^0-9]||g' <<<$OPTARG)" ;;
- *) error "invalid option: '%s'" "$arg" ; usage >&2 ; exit "$EXIT_INVALIDARGUMENT" ;;
+ c) PkgsCached+=($OPTARG) ;;
+ h) usage; return "$EXIT_SUCCESS" ;;
+ H) Hooks+=( "$(pvm_get_hook $OPTARG)" ) ;;
+ k) Kernels+=($OPTARG) ;;
+ M) Mirror="$OPTARG" ;;
+ O) IsNonsystemd=0 ;; # TODO:
+ p) PkgsOptional+=($OPTARG) ;;
+ s) RootSizeMb="$(sed 's|[^0-9]||g' <<<$OPTARG)" ;;
+ S) SwapSizeMb="$(sed 's|[^0-9]||g' <<<$OPTARG)" ;;
+ *) error "invalid option: '%s'" "$arg" ; usage >&2 ; exit "$EXIT_INVALIDARGUMENT" ;;
esac
done
local shiftlen=$(( OPTIND - 1 ))
@@ -460,12 +440,34 @@ main() # ( [cli_options] imagefile arch )
local arch="$2"
(( $# < 2 )) && error "insufficient arguments" && usage >&2 && exit "$EXIT_INVALIDARGUMENT"
+ # vaidate options and calculate options-dependent vars
(( $RootSizeMb > 0 )) && \
- (( $RootSizeMb < $MinRootMb )) && warning "specified root FS size too small - ignoring OptPkgs"
- (( $RootSizeMb < $MinRootMb )) && RootSizeMb=$MinRootMb && OptPkgs=()
+ (( $RootSizeMb < $MinRootMb )) && warning "specified root FS size too small - ignoring PkgsOptional"
+ (( $RootSizeMb < $MinRootMb )) && RootSizeMb=$MinRootMb && PkgsOptional=()
RootSizeMb=$(( $RootSizeMb + (${#Kernels[@]} * 75) ))
+ ImgSizeMb=$(( $BootSizeMb + $SwapSizeMb + $RootSizeMb ))
HasSwap=$( (( $SwapSizeMb > 0 )) && echo 1 || echo 0 )
+ # prepare package lists
+ local kernels=( ${Kernels[@]} )
+ local pkgs=( ${Pkgs[@]} ${Kernels[@]} ${PkgsOptional[@]} ${PKGS_MANDATORY_ALL[@]} )
+ local pkgs_cached=( ${PkgsCached[@]} )
+ case "$arch" in
+ armv7h ) pkgs+=( ${PKGS_MANDATORY_armv7h[@]} ) ;;
+ i686 ) pkgs+=( ${PKGS_MANDATORY_i686[@]} ) ;;
+ ppc64le) pkgs+=( ${PKGS_MANDATORY_ppc64le[@]} ) ;;
+ riscv64) pkgs+=( ${PKGS_MANDATORY_riscv64[@]} ) ;;
+ x86_64 ) pkgs+=( ${PKGS_MANDATORY_x86_64[@]} ) ;;
+ esac
+ (( $IsNonsystemd )) && [[ "$BasePkgSet" == "$PKG_SET_MIN" ]] && pkgs+=(libelogind)
+ (( ! $IsNonsystemd )) && [[ "${Hooks[@]}" =~ hook-ethernet-dhcp.sh ]] && pkgs+=(dhcpcd )
+
+ # minimize package lists
+ local kernel ; local pkg ; Kernels=() ; Pkgs=() ; PkgsCached=() ;
+ for kernel in $(printf "%s\n" "${kernels[@]}" | sort -u) ; do Kernels+=($kernel) ; done ;
+ for pkg in $(printf "%s\n" "${pkgs[@]}" | sort -u) ; do Pkgs+=($pkg) ; done ;
+ for pkg in $(printf "%s\n" "${pkgs_cached[@]}" | sort -u) ; do PkgsCached+=($pkg) ; done ;
+
msg "making $arch image: $imagefile"
# determine if the target arch is supported