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 -- Select one of the pre-defined package-sets described below - (default: 'standard') + (default: standard) + -c -- 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 is 0. -H -- 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 -- Choose an additional kernel package (default: linux-libre). + -k -- 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 -- 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 -- Specify additional packages to be installed in the VM image. - This option can be specified multiple times. + -p -- 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 is 0. -s -- Set the size (in MB) of the root partition (default: 32000). If this is 0 (or less than the requires), the VM image will be the smallest size possible, fit to the ; and any -p will be ignored. - -S -- Set the size (in MB) of the swap partition (default: 0) + -S -- 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 Select one of the pre-defined package-sets described below" - echo " (default: '$PKG_SET_STD')" + echo " (default: $PKG_SET_STD)" echo " -c 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 Specify an additional package to be installed in the VM image." + echo " -p 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 is 0." echo " -s Set the size (in MB) of the root partition (default: $DEF_ROOT_MB)." echo " If this is 0 (or less than the requires)," echo " the VM image will be the smallest size possible," echo " fit to the ; and any -p will be ignored." - echo " -S Set the size (in MB) of the swap partition (default: $DEF_SWAP_MB)" + echo " -S 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