diff options
author | David P <megver83@parabola.nu> | 2018-05-16 21:08:49 -0400 |
---|---|---|
committer | David P <megver83@parabola.nu> | 2018-05-16 21:27:46 -0400 |
commit | 765756ae126d57735c22d59a7c1242f01443921e (patch) | |
tree | c5d5f3e7979f5a0098e7294d1e8dbae3aa71c562 /parabolaiso | |
parent | ff5f93347993bfdb6c58746baee006dbad7a3dd8 (diff) |
modify entire source according to archiso32
and remove unused configs/talkingparabola-X11
Signed-off-by: David P <megver83@parabola.nu>
Diffstat (limited to 'parabolaiso')
-rw-r--r-- | parabolaiso/initcpio/hooks/parabolaiso | 121 | ||||
-rw-r--r-- | parabolaiso/initcpio/hooks/parabolaiso_loop_mnt | 9 | ||||
-rw-r--r-- | parabolaiso/initcpio/hooks/parabolaiso_pxe_common | 36 | ||||
-rw-r--r-- | parabolaiso/initcpio/hooks/parabolaiso_pxe_http | 25 | ||||
-rw-r--r-- | parabolaiso/initcpio/hooks/parabolaiso_pxe_nbd | 21 | ||||
-rw-r--r-- | parabolaiso/initcpio/install/parabolaiso | 8 | ||||
-rw-r--r-- | parabolaiso/initcpio/install/parabolaiso_pxe_http | 2 | ||||
-rwxr-xr-x | parabolaiso/mkparabolaiso | 432 |
8 files changed, 274 insertions, 380 deletions
diff --git a/parabolaiso/initcpio/hooks/parabolaiso b/parabolaiso/initcpio/hooks/parabolaiso index c23fd3d..ef79b2b 100644 --- a/parabolaiso/initcpio/hooks/parabolaiso +++ b/parabolaiso/initcpio/hooks/parabolaiso @@ -1,5 +1,5 @@ # args: source, newroot, mountpoint -_mnt_fs() { +_mnt_dmsnapshot() { local img="${1}" local newroot="${2}" local mnt="${3}" @@ -11,19 +11,13 @@ _mnt_fs() { ro_dev=$(losetup --find --show --read-only "${img}") echo ${ro_dev} >> /run/parabolaiso/used_block_devices ro_dev_size=$(blockdev --getsz ${ro_dev}) - if [[ "${cowfile_size}" == "100" ]]; then - rw_dev_size=${ro_dev_size} - else - # size calculation done in this way to avoid integer overflow when ro_dev_size is > 10.2G - rw_dev_size=$((ro_dev_size/100*cowfile_size)) - fi if [[ "${cow_persistent}" == "P" ]]; then if [[ -f "/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" ]]; then msg ":: Found '/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow', using as persistent." else msg ":: Creating '/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow' as persistent." - dd of="/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" count=0 seek=${rw_dev_size} &> /dev/null + truncate -s "${cow_spacesize}" "/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" fi else if [[ -f "/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" ]]; then @@ -31,18 +25,28 @@ _mnt_fs() { rm -f "/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" fi msg ":: Creating '/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow' as non-persistent." - dd of="/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" count=0 seek=${rw_dev_size} &> /dev/null + truncate -s "${cow_spacesize}" "/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow" fi rw_dev=$(losetup --find --show "/run/parabolaiso/cowspace/${cow_directory}/${img_name}.cow") echo ${rw_dev} >> /run/parabolaiso/used_block_devices - echo "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} 8" | dmsetup create ${dm_snap_name} + dmsetup create ${dm_snap_name} --table "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}" - _mnt_dev "/dev/mapper/${dm_snap_name}" "${newroot}${mnt}" "-w" + _mnt_dev "/dev/mapper/${dm_snap_name}" "${newroot}${mnt}" "-w" "defaults" echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/parabolaiso/used_block_devices } +# args: source, newroot, mountpoint +_mnt_overlayfs() { + local src="${1}" + local newroot="${2}" + local mnt="${3}" + mkdir -p /run/parabolaiso/cowspace/${cow_directory}/upperdir /run/parabolaiso/cowspace/${cow_directory}/workdir + mount -t overlay -o lowerdir=${src},upperdir=/run/parabolaiso/cowspace/${cow_directory}/upperdir,workdir=/run/parabolaiso/cowspace/${cow_directory}/workdir airootfs "${newroot}${mnt}" +} + + # args: /path/to/image_file, mountpoint _mnt_sfs() { local img="${1}" @@ -61,14 +65,15 @@ _mnt_sfs() { fi sfs_dev=$(losetup --find --show --read-only "${img}") echo ${sfs_dev} >> /run/parabolaiso/used_block_devices - _mnt_dev "${sfs_dev}" "${mnt}" "-r" + _mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults" } -# args: device, mountpoint, flags +# args: device, mountpoint, flags, opts _mnt_dev() { local dev="${1}" local mnt="${2}" local flg="${3}" + local opts="${4}" mkdir -p "${mnt}" @@ -81,7 +86,7 @@ _mnt_dev() { launch_interactive_shell done - if mount "${flg}" "${dev}" "${mnt}"; then + if mount -o "${opts}" "${flg}" "${dev}" "${mnt}"; then msg ":: Device '${dev}' mounted successfully." else echo "ERROR; Failed to mount '${dev}'" @@ -93,8 +98,17 @@ _mnt_dev() { _verify_checksum() { local _status - cd "/run/parabolaiso/bootmnt/${parabolaisobasedir}" - md5sum -c checksum.${arch}.md5 > /tmp/checksum.${arch}.log 2>&1 + cd "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${arch}" + sha512sum -c airootfs.sha512 > /tmp/checksum.log 2>&1 + _status=$? + cd "${OLDPWD}" + return ${_status} +} + +_verify_signature() { + local _status + cd "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${arch}" + gpg --homedir /gpg --status-fd 1 --verify airootfs.sfs.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG' _status=$? cd "${OLDPWD}" return ${_status} @@ -102,22 +116,11 @@ _verify_checksum() { run_hook() { [[ -z "${arch}" ]] && arch="$(uname -m)" - [[ -z "${cowspace_size}" ]] && cowspace_size="75%" [[ -z "${copytoram_size}" ]] && copytoram_size="75%" [[ -z "${parabolaisobasedir}" ]] && parabolaisobasedir="parabola" [[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="parabola" [[ -z "${parabolaisodevice}" ]] && parabolaisodevice="/dev/disk/by-label/${parabolaisolabel}" - if [[ -z "${cowfile_size}" ]]; then - cowfile_size="100" - else - cowfile_size=${cowfile_size/%} - fi - - if [[ -z "${aitab}" ]]; then - aitab="/run/parabolaiso/bootmnt/${parabolaisobasedir}/aitab" - else - aitab="/run/parabolaiso/bootmnt/${parabolaisobasedir}/${aitab}" - fi + [[ -z "${cow_spacesize}" ]] && cow_spacesize="256M" if [[ -n "${cow_label}" ]]; then cow_device="/dev/disk/by-label/${cow_label}" @@ -128,7 +131,9 @@ run_hook() { cow_persistent="N" fi + [[ -z "${cow_flags}" ]] && cow_flags="defaults" [[ -z "${cow_directory}" ]] && cow_directory="persistent_${parabolaisolabel}/${arch}" + [[ -z "${cow_chunksize}" ]] && cow_chunksize="8" # set mount handler for parabolaiso mount_handler="parabolaiso_mount_handler" @@ -141,32 +146,39 @@ parabolaiso_mount_handler() { local newroot="${1}" if ! mountpoint -q "/run/parabolaiso/bootmnt"; then - _mnt_dev "${parabolaisodevice}" "/run/parabolaiso/bootmnt" "-r" + _mnt_dev "${parabolaisodevice}" "/run/parabolaiso/bootmnt" "-r" "defaults" if [[ "${copytoram}" != "y" ]]; then echo $(readlink -f ${parabolaisodevice}) >> /run/parabolaiso/used_block_devices fi fi - - if [[ ! -f "${aitab}" ]]; then - echo "ERROR: '${aitab}' file does not exist." - echo " Falling back to interactive prompt" - echo " You can try to fix the problem manually, log out when you are finished" - launch_interactive_shell - fi - if [[ "${checksum}" == "y" ]]; then - if [[ -f "/run/parabolaiso/bootmnt/${parabolaisobasedir}/checksum.${arch}.md5" ]]; then + if [[ -f "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${arch}/airootfs.sha512" ]]; then msg -n ":: Self-test requested, please wait..." if _verify_checksum; then msg "done. Checksum is OK, continue booting." else echo "ERROR: one or more files are corrupted" - echo "see /tmp/checksum.${arch}.log for details" + echo "see /tmp/checksum.log for details" launch_interactive_shell fi else - echo "ERROR: checksum=y option specified but checksum.${arch}.md5 not found" + echo "ERROR: checksum=y option specified but ${parabolaisobasedir}/${arch}/airootfs.sha512 not found" + launch_interactive_shell + fi + fi + + if [[ "${verify}" == "y" ]]; then + if [[ -f "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${arch}/airootfs.sfs.sig" ]]; then + msg -n ":: Signature verification requested, please wait..." + if _verify_signature; then + msg "done. Signature is OK, continue booting." + else + echo "ERROR: one or more files are corrupted" + launch_interactive_shell + fi + else + echo "ERROR: verify=y option specified but ${parabolaisobasedir}/${arch}/airootfs.sfs.sig not found" launch_interactive_shell fi fi @@ -178,30 +190,25 @@ parabolaiso_mount_handler() { fi if [[ -n "${cow_device}" ]]; then - _mnt_dev "${cow_device}" "/run/parabolaiso/cowspace" "-r" + _mnt_dev "${cow_device}" "/run/parabolaiso/cowspace" "-r" "${cow_flags}" echo $(readlink -f ${cow_device}) >> /run/parabolaiso/used_block_devices mount -o remount,rw "/run/parabolaiso/cowspace" else - msg ":: Mounting /run/parabolaiso/cowspace (tmpfs) filesystem, size=${cowspace_size}..." + msg ":: Mounting /run/parabolaiso/cowspace (tmpfs) filesystem, size=${cow_spacesize}..." mkdir -p /run/parabolaiso/cowspace - mount -t tmpfs -o "size=${cowspace_size}",mode=0755 cowspace /run/parabolaiso/cowspace + mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace /run/parabolaiso/cowspace + fi + mkdir -p -m 0700 "/run/parabolaiso/cowspace/${cow_directory}" + + _mnt_sfs "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${arch}/airootfs.sfs" "/run/parabolaiso/sfs/airootfs" + if [[ -f "/run/parabolaiso/sfs/airootfs/airootfs.img" ]]; then + _mnt_dmsnapshot "/run/parabolaiso/sfs/airootfs/airootfs.img" "${newroot}" "/" + else + _mnt_overlayfs "/run/parabolaiso/sfs/airootfs" "${newroot}" "/" fi - mkdir -p "/run/parabolaiso/cowspace/${cow_directory}" - - local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size - while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do - [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue - [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue - if [[ "${aitab_fs_type}" != "none" ]]; then - _mnt_sfs "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/run/parabolaiso/sfs/${aitab_img}" - _mnt_fs "/run/parabolaiso/sfs/${aitab_img}/${aitab_img}.fs" "${newroot}" "${aitab_mnt}" - else - _mnt_sfs "/run/parabolaiso/bootmnt/${parabolaisobasedir}/${aitab_arch}/${aitab_img}.sfs" "${newroot}${aitab_mnt}" - fi - done < "${aitab}" if [[ "${copytoram}" == "y" ]]; then - umount /run/parabolaiso/bootmnt + umount -d /run/parabolaiso/bootmnt fi } diff --git a/parabolaiso/initcpio/hooks/parabolaiso_loop_mnt b/parabolaiso/initcpio/hooks/parabolaiso_loop_mnt index 772c3b6..1a8783d 100644 --- a/parabolaiso/initcpio/hooks/parabolaiso_loop_mnt +++ b/parabolaiso/initcpio/hooks/parabolaiso_loop_mnt @@ -2,6 +2,7 @@ run_hook () { [[ -n "${img_label}" ]] && img_dev="/dev/disk/by-label/${img_label}" + [[ -z "${img_flags}" ]] && img_flags="defaults" if [[ -n "${img_dev}" && -n "${img_loop}" ]]; then mount_handler="parabolaiso_loop_mount_handler" fi @@ -13,12 +14,14 @@ parabolaiso_loop_mount_handler () { local _dev_loop msg ":: Setup a loop device from ${img_loop} located at device ${img_dev}" - _mnt_dev "${img_dev}" "/run/parabolaiso/img_dev" "-r" + _mnt_dev "${img_dev}" "/run/parabolaiso/img_dev" "-r" "${img_flags}" if [[ "${copytoram}" != "y" ]]; then echo $(readlink -f ${img_dev}) >> /run/parabolaiso/used_block_devices fi - if ! _dev_loop=$(losetup --find --show --read-only "/run/parabolaiso/img_dev/${img_loop}"); then + if _dev_loop=$(losetup --find --show --read-only "/run/parabolaiso/img_dev/${img_loop}"); then + parabolaisodevice="${_dev_loop}" + else echo "ERROR: Setting loopback device for file '/run/parabolaiso/img_dev/${img_loop}'" launch_interactive_shell fi @@ -26,7 +29,7 @@ parabolaiso_loop_mount_handler () { parabolaiso_mount_handler ${newroot} if [[ "${copytoram}" == "y" ]]; then - losetup -d ${_dev_loop} + losetup -d ${_dev_loop} 2>/dev/null umount /run/parabolaiso/img_dev fi } diff --git a/parabolaiso/initcpio/hooks/parabolaiso_pxe_common b/parabolaiso/initcpio/hooks/parabolaiso_pxe_common index d8ac709..7c3b1b5 100644 --- a/parabolaiso/initcpio/hooks/parabolaiso_pxe_common +++ b/parabolaiso/initcpio/hooks/parabolaiso_pxe_common @@ -1,7 +1,8 @@ # vim: set ft=sh: run_hook () { - local i net_mac bootif_mac bootif_dev + # Do *not* declare 'bootif_dev' local! We need it in run_latehook(). + local i net_mac bootif_mac # These variables will be parsed from /tmp/net-*.conf generated by ipconfig local DEVICE local IPV4ADDR IPV4BROADCAST IPV4NETMASK IPV4GATEWAY IPV4DNS0 IPV4DNS1 @@ -21,11 +22,20 @@ run_hook () { break fi done - ip="${ip}::${bootif_dev}" + if [[ "${ip}" == "dhcp" ]]; then + ip=":::::${bootif_dev}:dhcp" + else + ip="${ip}::${bootif_dev}" + fi fi # setup network and save some values - ipconfig "ip=${ip}" + if ! ipconfig -t 20 "ip=${ip}"; then + echo "ERROR; Failed to configure network" + echo " Falling back to interactive prompt" + echo " You can try to fix the problem manually, log out when you are finished" + launch_interactive_shell + fi . /tmp/net-*.conf @@ -33,18 +43,30 @@ run_hook () { # setup DNS resolver if [[ "${IPV4DNS0}" != "0.0.0.0" ]]; then - echo "nameserver ${IPV4DNS0}" > /etc/resolv.conf + echo "# added by parabolaiso_pxe_common hook" > /etc/resolv.conf + echo "nameserver ${IPV4DNS0}" >> /etc/resolv.conf fi if [[ "${IPV4DNS1}" != "0.0.0.0" ]]; then echo "nameserver ${IPV4DNS1}" >> /etc/resolv.conf fi + if [[ -n "${DNSDOMAIN}" ]]; then + echo "search ${DNSDOMAIN}" >> /etc/resolv.conf + echo "domain ${DNSDOMAIN}" >> /etc/resolv.conf + fi fi } run_latehook () { - [[ -z "${copy_resolvconf}" ]] && copy_resolvconf="y" + if [[ -n "${ip}" ]]; then + [[ -z "${copy_resolvconf}" ]] && copy_resolvconf="y" - if [[ "${copy_resolvconf}" != "n" && -f /etc/resolv.conf ]]; then - cp /etc/resolv.conf /new_root/etc/resolv.conf + if [[ "${copytoram}" == "y" ]]; then + if [[ -n "${bootif_dev}" ]]; then + ip addr flush dev "${bootif_dev}" + ip link set "${bootif_dev}" down + fi + elif [[ "${copy_resolvconf}" != "n" && -f /etc/resolv.conf ]]; then + cp /etc/resolv.conf /new_root/etc/resolv.conf + fi fi } diff --git a/parabolaiso/initcpio/hooks/parabolaiso_pxe_http b/parabolaiso/initcpio/hooks/parabolaiso_pxe_http index 97de91f..b3440ed 100644 --- a/parabolaiso/initcpio/hooks/parabolaiso_pxe_http +++ b/parabolaiso/initcpio/hooks/parabolaiso_pxe_http @@ -3,6 +3,10 @@ run_hook() { if [[ -n "${ip}" && -n "${parabolaiso_http_srv}" ]]; then + # booting with http is always copy-to-ram, so set here to make sure + # addresses are flushed and interface is set down + copytoram="y" + parabolaiso_http_srv=$(eval echo ${parabolaiso_http_srv}) [[ -z "${parabolaiso_http_spc}" ]] && parabolaiso_http_spc="75%" @@ -34,24 +38,13 @@ parabolaiso_pxe_http_mount_handler () { mkdir -p "/run/parabolaiso/httpspace" mount -t tmpfs -o size="${parabolaiso_http_spc}",mode=0755 httpspace "/run/parabolaiso/httpspace" - local _aitab_url="${parabolaiso_http_srv}${aitab#/run/parabolaiso/bootmnt/}" - local _aitab_file="/run/parabolaiso/httpspace/${aitab#/run/parabolaiso/bootmnt/}" - - _curl_get "${_aitab_url}" "/" - - local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size - while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do - [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue - [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue - if [[ "${aitab_fs_type}" != "none" ]]; then - _curl_get "${parabolaiso_http_srv}${parabolaisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/${aitab_arch}" - else - _curl_get "${parabolaiso_http_srv}${parabolaisobasedir}/${aitab_arch}/${aitab_img}.sfs" "/${aitab_arch}" - fi - done < "${_aitab_file}" + _curl_get "${parabolaiso_http_srv}${parabolaisobasedir}/${arch}/airootfs.sfs" "/${arch}" if [[ "${checksum}" == "y" ]]; then - _curl_get "${parabolaiso_http_srv}${parabolaisobasedir}/checksum.${arch}.md5" "/" + _curl_get "${parabolaiso_http_srv}${parabolaisobasedir}/${arch}/airootfs.sha512" "/${arch}" + fi + if [[ "${verify}" == "y" ]]; then + _curl_get "${parabolaiso_http_srv}${parabolaisobasedir}/${arch}/airootfs.sfs.sig" "/${arch}" fi mkdir -p "/run/parabolaiso/bootmnt" diff --git a/parabolaiso/initcpio/hooks/parabolaiso_pxe_nbd b/parabolaiso/initcpio/hooks/parabolaiso_pxe_nbd index 1bb8cbb..1991f80 100644 --- a/parabolaiso/initcpio/hooks/parabolaiso_pxe_nbd +++ b/parabolaiso/initcpio/hooks/parabolaiso_pxe_nbd @@ -1,5 +1,12 @@ # vim: set ft=sh: +run_earlyhook() { + if [[ -n "${ip}" && -n "${parabolaiso_nbd_srv}" ]]; then + # Module autoloading like with loop devices does not work, doing manually... + modprobe nbd 2> /dev/null + fi +} + run_hook() { if [[ -n "${ip}" && -n "${parabolaiso_nbd_srv}" ]]; then @@ -13,9 +20,6 @@ run_hook() { parabolaiso_pxe_nbd_mount_handler () { newroot="${1}" - # Module autoloading like with loop devices does not work, doing manually... - modprobe nbd 2> /dev/null - msg ":: Waiting for boot device..." while ! poll_device /dev/nbd0 30; do echo "ERROR: boot device didn't show up after 30 seconds..." @@ -25,16 +29,19 @@ parabolaiso_pxe_nbd_mount_handler () { done msg ":: Setup NBD from ${parabolaiso_nbd_srv} at /dev/nbd0" - nbd-client ${parabolaiso_nbd_srv} -N ${parabolaiso_nbd_name} /dev/nbd0 - if [[ "${copytoram}" != "n" ]]; then + nbd-client ${parabolaiso_nbd_srv} -N ${parabolaiso_nbd_name} /dev/nbd0 copytoram="y" + else + nbd-client ${parabolaiso_nbd_srv} -N ${parabolaiso_nbd_name} -systemd-mark -persist /dev/nbd0 fi parabolaisodevice=/dev/nbd0 parabolaiso_mount_handler ${newroot} - msg ":: Disconnect NBD from ${parabolaiso_nbd_srv} at /dev/nbd0" - nbd-client -d /dev/nbd0 + if [[ "${copytoram}" == "y" ]]; then + msg ":: Disconnect NBD from ${parabolaiso_nbd_srv} at /dev/nbd0" + nbd-client -d /dev/nbd0 + fi } diff --git a/parabolaiso/initcpio/install/parabolaiso b/parabolaiso/initcpio/install/parabolaiso index 8893667..30728ef 100644 --- a/parabolaiso/initcpio/install/parabolaiso +++ b/parabolaiso/initcpio/install/parabolaiso @@ -4,6 +4,7 @@ build() { add_module "cdrom" add_module "loop" add_module "dm-snapshot" + add_module "overlay" add_runscript @@ -12,11 +13,18 @@ build() { add_binary dmsetup add_binary losetup add_binary mountpoint + add_binary truncate + add_binary gpg + add_binary grep add_file /usr/lib/udev/rules.d/60-cdrom_id.rules add_file /usr/lib/udev/rules.d/10-dm.rules add_file /usr/lib/udev/rules.d/95-dm-notify.rules add_file /usr/lib/initcpio/udev/11-dm-initramfs.rules /usr/lib/udev/rules.d/11-dm-initramfs.rules + if [[ $ARCHISO_GNUPG_FD ]]; then + mkdir -p "$BUILDROOT$dest"/gpg + gpg --homedir "$BUILDROOT$dest"/gpg --import <&$ARCHISO_GNUPG_FD + fi } # vim: set ft=sh ts=4 sw=4 et: diff --git a/parabolaiso/initcpio/install/parabolaiso_pxe_http b/parabolaiso/initcpio/install/parabolaiso_pxe_http index 4e02f98..9ce9726 100644 --- a/parabolaiso/initcpio/install/parabolaiso_pxe_http +++ b/parabolaiso/initcpio/install/parabolaiso_pxe_http @@ -4,6 +4,8 @@ build() { add_runscript add_binary curl + + add_file $(readlink -f /etc/ssl/certs/ca-certificates.crt) /etc/ssl/certs/ca-certificates.crt } help() { diff --git a/parabolaiso/mkparabolaiso b/parabolaiso/mkparabolaiso index 93e6995..d55668d 100755 --- a/parabolaiso/mkparabolaiso +++ b/parabolaiso/mkparabolaiso @@ -11,11 +11,15 @@ run_cmd="" quiet="y" pacman_conf="/etc/pacman.conf" export iso_label="PARA_$(date +%Y%m)" -iso_publisher="Parabola GNU/Linux-libre <https://parabolagnulinux.org>" +iso_publisher="Parabola GNU/Linux-libre <https://www.parabola.nu>" iso_application="Parabola GNU/Linux-libre Live/Rescue CD" install_dir="parabola" work_dir="work" out_dir="out" +sfs_mode="sfs" +sfs_comp="xz" +gpg_key= +init=systemd # Show an INFO message # $1: message string @@ -38,101 +42,35 @@ _msg_error() { fi } -# Show space usage similar to df, but better formatted. -# $1: mount-point or mounted device. -_show_space_usage () { - local _where="${1}" - local _fs _total _used _avail _pct_u=0 _mnt - read _fs _total _used _avail _pct_u _mnt < <(df -m "${_where}" | tail -1) &> /dev/null - _msg_info "Total: ${_total} MiB (100%) | Used: ${_used} MiB (${_pct_u}) | Avail: ${_avail} MiB ($((100 - ${_pct_u%\%}))%)" -} - -_chroot_mount () { - mount -t devtmpfs dev "${work_dir}/root-image/dev" - mount -t devpts devpts "${work_dir}/root-image/dev/pts" - mount -t tmpfs devshm "${work_dir}/root-image/dev/shm" - mount -t proc proc "${work_dir}/root-image/proc" - mount -t tmpfs run "${work_dir}/root-image/run" - mount -t sysfs sys "${work_dir}/root-image/sys" - mount -t tmpfs tmp "${work_dir}/root-image/tmp" - - trap '_chroot_umount' EXIT HUP INT TERM -} - -_chroot_umount () { - umount "${work_dir}/root-image/tmp" - umount "${work_dir}/root-image/sys" - umount "${work_dir}/root-image/run" - umount "${work_dir}/root-image/proc" - umount "${work_dir}/root-image/dev/shm" - umount "${work_dir}/root-image/dev/pts" - umount "${work_dir}/root-image/dev" - - trap - EXIT HUP INT TERM -} - _chroot_init() { - if [[ ! -d ${work_dir}/root-image/var/cache/pacman ]]; then - mkdir -p ${work_dir}/root-image/{dev,proc,run,sys,tmp,var/lib/pacman} - _pacman "base" - _pacman "syslinux" - fi + mkdir -p ${work_dir}/airootfs + case $init in + openrc) _pacman "base-openrc openrc-init syslinux" ;; + runit) _pacman "base-openrc runit syslinux" ;; + systemd) _pacman "base syslinux" ;; + esac } _chroot_run() { - _chroot_mount - eval chroot ${work_dir}/root-image "${run_cmd}" - _chroot_umount + eval arch-chroot ${work_dir}/airootfs "${run_cmd}" } -# Mount a filesystem (trap signals in case of error for unmounting it -# $1: source image -# $2: mount-point -_mount_fs() { - local _src="${1}" - local _dst="${2}" - trap "_umount_fs ${_src}" EXIT HUP INT TERM - mkdir -p "${_dst}" - _msg_info "Mounting '${_src}' on '${_dst}'" - mount "${_src}" "${_dst}" - _show_space_usage "${_dst}" +_mount_airootfs() { + trap "_umount_airootfs" EXIT HUP INT TERM + mkdir -p "${work_dir}/mnt/airootfs" + _msg_info "Mounting '${work_dir}/airootfs.img' on '${work_dir}/mnt/airootfs'" + mount "${work_dir}/airootfs.img" "${work_dir}/mnt/airootfs" + _msg_info "Done!" } -# Unmount a filesystem (and untrap signals) -# $1: mount-point or device/image -_umount_fs() { - local _dst="${1}" - _show_space_usage "${_dst}" - _msg_info "Unmounting '${_dst}'" - umount "${_dst}" - rmdir "${_dst}" +_umount_airootfs() { + _msg_info "Unmounting '${work_dir}/mnt/airootfs'" + umount -d "${work_dir}/mnt/airootfs" + _msg_info "Done!" + rmdir "${work_dir}/mnt/airootfs" trap - EXIT HUP INT TERM } -# Compare if a file/directory (source) is newer than other file (target) -# $1: source file/directory -# $2: target file -# return: 0 if target does not exists or if target is older than source. -# 1 if target is newer than source -_is_directory_changed() { - local _src="${1}" - local _dst="${2}" - - if [ -e "${_dst}" ]; then - if [[ $(find ${_src} -newer ${_dst} | wc -l) -gt 0 ]]; then - _msg_info "Target '${_dst}' is older than '${_src}', updating." - rm -f "${_dst}" - return 0 - else - _msg_info "Target '${_dst}' is up to date with '${_src}', skipping." - return 1 - fi - else - _msg_info "Target '${_dst}' does not exist, making it from '${_src}'" - return 0 - fi -} - # Show help usage, with an exit status. # $1: exit status number. _usage () @@ -140,7 +78,7 @@ _usage () echo "usage ${app_name} [options] command <command options>" echo " general options:" echo " -p PACKAGE(S) Package(s) to install, can be used multiple times" - echo " -r <command> Run <command> inside root-image" + echo " -r <command> Run <command> inside airootfs" echo " -C <file> Config file for pacman." echo " Default: '${pacman_conf}'" echo " -L <label> Set a label for the disk" @@ -156,6 +94,14 @@ _usage () echo " Default: '${work_dir}'" echo " -o <out_dir> Set the output directory" echo " Default: '${out_dir}'" + echo " -s <sfs_mode> Set SquashFS image mode (img or sfs)" + echo " img: prepare airootfs.sfs for dm-snapshot usage" + echo " sfs: prepare airootfs.sfs for overlayfs usage" + echo " Default: ${sfs_mode}" + echo " -c <comp_type> Set SquashFS compression type (gzip, lzma, lzo, xz)" + echo " Default: '${sfs_comp}'" + echo " -i <init> Init system to use" + echo " Default: '${init}'" echo " -v Enable verbose output" echo " -h This message" echo " commands:" @@ -167,17 +113,15 @@ _usage () echo " run command specified by -r" echo " prepare" echo " build all images" - echo " checksum" - echo " make a checksum.md5 for self-test" echo " pkglist" - echo " make a pkglist.txt of packages installed on root-image" + echo " make a pkglist.txt of packages installed on airootfs" echo " iso <image name>" echo " build an iso image from the working dir" exit ${1} } # Shows configuration according to command mode. -# $1: init | install | run | prepare | checksum | iso +# $1: init | install | run | prepare | iso _show_config () { local _mode="$1" echo @@ -199,8 +143,6 @@ _show_config () { ;; prepare) ;; - checksum) - ;; pkglist) ;; iso) @@ -213,191 +155,128 @@ _show_config () { echo } -# Install desired packages to root-image +# Install desired packages to airootfs _pacman () { - _msg_info "Installing packages to '${work_dir}/root-image/'..." - - _chroot_mount + _msg_info "Installing packages to '${work_dir}/airootfs/'..." if [[ "${quiet}" = "y" ]]; then - pacman -Sy -r "${work_dir}/root-image" --config "${pacman_conf}" --needed --noconfirm $* &> /dev/null + pacstrap -C "${pacman_conf}" -c -d -G -M "${work_dir}/airootfs" $* &> /dev/null else - pacman -Sy -r "${work_dir}/root-image" --config "${pacman_conf}" --needed --noconfirm $* + pacstrap -C "${pacman_conf}" -c -d -G -M "${work_dir}/airootfs" $* fi - _chroot_umount - _msg_info "Packages installed successfully!" } -# Cleanup root-image +# Cleanup airootfs _cleanup () { - _msg_info "Cleaning up what we can on root-image..." + _msg_info "Cleaning up what we can on airootfs..." # Delete initcpio image(s) - if [[ -d "${work_dir}/root-image/boot" ]]; then - find "${work_dir}/root-image/boot" -type f -name '*.img' -delete + if [[ -d "${work_dir}/airootfs/boot" ]]; then + find "${work_dir}/airootfs/boot" -type f -name '*.img' -delete fi # Delete kernel(s) - if [[ -d "${work_dir}/root-image/boot" ]]; then - find "${work_dir}/root-image/boot" -type f -name 'vmlinuz*' -delete + if [[ -d "${work_dir}/airootfs/boot" ]]; then + find "${work_dir}/airootfs/boot" -type f -name 'vmlinuz*' -delete fi # Delete pacman database sync cache files (*.tar.gz) - if [[ -d "${work_dir}/root-image/var/lib/pacman" ]]; then - find "${work_dir}/root-image/var/lib/pacman" -maxdepth 1 -type f -delete + if [[ -d "${work_dir}/airootfs/var/lib/pacman" ]]; then + find "${work_dir}/airootfs/var/lib/pacman" -maxdepth 1 -type f -delete fi # Delete pacman database sync cache - if [[ -d "${work_dir}/root-image/var/lib/pacman/sync" ]]; then - find "${work_dir}/root-image/var/lib/pacman/sync" -delete + if [[ -d "${work_dir}/airootfs/var/lib/pacman/sync" ]]; then + find "${work_dir}/airootfs/var/lib/pacman/sync" -delete fi # Delete pacman package cache - if [[ -d "${work_dir}/root-image/var/cache/pacman/pkg" ]]; then - find "${work_dir}/root-image/var/cache/pacman/pkg" -type f -delete + if [[ -d "${work_dir}/airootfs/var/cache/pacman/pkg" ]]; then + find "${work_dir}/airootfs/var/cache/pacman/pkg" -type f -delete fi # Delete all log files, keeps empty dirs. - if [[ -d "${work_dir}/root-image/var/log" ]]; then - find "${work_dir}/root-image/var/log" -type f -delete - fi - # Avoid journald use permanent storage (Storage=auto) - if [[ -d "${work_dir}/root-image/var/log/journal" ]]; then - rm -rf "${work_dir}/root-image/var/log/journal" + if [[ -d "${work_dir}/airootfs/var/log" ]]; then + find "${work_dir}/airootfs/var/log" -type f -delete fi # Delete all temporary files and dirs - if [[ -d "${work_dir}/root-image/var/tmp" ]]; then - find "${work_dir}/root-image/var/tmp" -mindepth 1 -delete + if [[ -d "${work_dir}/airootfs/var/tmp" ]]; then + find "${work_dir}/airootfs/var/tmp" -mindepth 1 -delete fi # Delete package pacman related files. find "${work_dir}" \( -name "*.pacnew" -o -name "*.pacsave" -o -name "*.pacorig" \) -delete _msg_info "Done!" } -# Makes a SquashFS filesystem image of file/directory passes as argument with desired compression. -# $1: Source file/directory -# $2: SquashFS compression type (gzip | lzo | xz) -_mksfs () { - local _src="${1}" - local _sfs_comp="${2}" - - if [[ ! -e "${work_dir}/${_src}" ]]; then - _msg_error "The path '${work_dir}/${_src}' does not exist" 1 +# Makes a ext4 filesystem inside a SquashFS from a source directory. +_mkairootfs_img () { + if [[ ! -e "${work_dir}/airootfs" ]]; then + _msg_error "The path '${work_dir}/airootfs' does not exist" 1 fi - local _sfs_img="${work_dir}/${_src}.sfs" - - _msg_info "Creating SquashFS image for '${work_dir}/${_src}', This may take some time..." - local _seconds=${SECONDS} + _msg_info "Creating ext4 image of 32GiB..." + truncate -s 32G "${work_dir}/airootfs.img" + local _qflag="" + if [[ ${quiet} == "y" ]]; then + _qflag="-q" + fi + mkfs.ext4 ${_qflag} -O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0 -F "${work_dir}/airootfs.img" + tune2fs -c 0 -i 0 "${work_dir}/airootfs.img" &> /dev/null + _msg_info "Done!" + _mount_airootfs + _msg_info "Copying '${work_dir}/airootfs/' to '${work_dir}/mnt/airootfs/'..." + cp -aT "${work_dir}/airootfs/" "${work_dir}/mnt/airootfs/" + _msg_info "Done!" + _umount_airootfs + mkdir -p "${work_dir}/iso/${install_dir}/${arch}" + _msg_info "Creating SquashFS image, this may take some time..." if [[ "${quiet}" = "y" ]]; then - mksquashfs "${work_dir}/${_src}" "${_sfs_img}" -noappend -comp "${_sfs_comp}" -no-progress &> /dev/null + mksquashfs "${work_dir}/airootfs.img" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress &> /dev/null else - mksquashfs "${work_dir}/${_src}" "${_sfs_img}" -noappend -comp "${_sfs_comp}" -no-progress + mksquashfs "${work_dir}/airootfs.img" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress fi - _seconds=$((SECONDS - _seconds)) - printf "[mkparabolaiso] INFO: Image creation done in %02d:%02d minutes\n" $((_seconds / 60)) $((_seconds % 60)) + _msg_info "Done!" + rm ${work_dir}/airootfs.img } -# Makes a filesystem from a source directory. -# $1: Source directory -# $2: Target filesystem type (ext4 | ext3 | ext2 | xfs | btrfs) -# $3: Size of target filesystem. Can be an absolute value in MiB, or relative value of desired free space (1% - 99%) -_mkfs () { - local _src="${1}" - local _fs_type="${2}" - local _fs_size="${3}" - - local _fs_src="${work_dir}/${_src}" - local _fs_img="${work_dir}/${_src}.fs" - - if [[ ! -e "${_fs_src}" ]]; then - _msg_error "The path '${_fs_src}' does not exist" 1 +# Makes a SquashFS filesystem from a source directory. +_mkairootfs_sfs () { + if [[ ! -e "${work_dir}/airootfs" ]]; then + _msg_error "The path '${work_dir}/airootfs' does not exist" 1 fi - local _spc_used - _spc_used=$(du -sxm "${_fs_src}" | awk '{print $1}') - - # Caculate FS size with desired % of free space, adds 10% overhead to used space. - if [[ ${_fs_size} != ${_fs_size%\%} ]]; then - if [[ ${_fs_size%\%} -le 0 || ${_fs_size%\%} -ge 100 ]]; then - _msg_error "Invalid percentage of free space specified '${_fs_size}' on '${_src}', should be 0% < x < 100%" 1 - fi - _fs_size=$((_spc_used * 110 / (100 - ${_fs_size%\%}))) + mkdir -p "${work_dir}/iso/${install_dir}/${arch}" + _msg_info "Creating SquashFS image, this may take some time..." + if [[ "${quiet}" = "y" ]]; then + mksquashfs "${work_dir}/airootfs" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress &> /dev/null else - local _spc_used_over=$((_spc_used * 11 / 10)) - if [[ ${_fs_size} -lt ${_spc_used_over} ]]; then - _msg_error "Filesystem size specified '${_fs_size}' MiB for '${_src}' is too small, must be at least '${_spc_used_over}' MiB" 1 - fi + mksquashfs "${work_dir}/airootfs" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress fi - - _msg_info "Creating ${_fs_type} image of ${_fs_size} MiB..." - rm -f "${_fs_img}" - truncate -s ${_fs_size}M "${_fs_img}" - local _qflag="" - if [[ ${quiet} == "y" ]]; then - _qflag="-q" - fi - case "${_fs_type}" in - ext4) - mkfs.ext4 ${_qflag} -O ^has_journal -E lazy_itable_init=0 -m 0 -F "${_fs_img}" - tune2fs -c 0 -i 0 "${_fs_img}" &> /dev/null - ;; - ext3) - mkfs.ext3 ${_qflag} -m 0 -F "${_fs_img}" - tune2fs -c 0 -i 0 "${_fs_img}" &> /dev/null - ;; - ext2) - mkfs.ext2 ${_qflag} -m 0 -F "${_fs_img}" - tune2fs -c 0 -i 0 "${_fs_img}" &> /dev/null - ;; - xfs) - mkfs.xfs ${_qflag} "${_fs_img}" - ;; - btrfs) - mkfs.btrfs -M "${_fs_img}" - ;; - *) - _msg_error "Invalid filesystem: ${_fs_type}" 1 - ;; - esac _msg_info "Done!" - _mount_fs "${_fs_img}" "${work_dir}/mnt/${_src}" - _msg_info "Copying '${_fs_src}/' to '${work_dir}/mnt/${_src}/'..." - cp -aT "${_fs_src}/" "${work_dir}/mnt/${_src}/" +} + +_mkchecksum () { + _msg_info "Creating checksum file for self-test..." + cd "${work_dir}/iso/${install_dir}/${arch}" + sha512sum airootfs.sfs > airootfs.sha512 + cd ${OLDPWD} _msg_info "Done!" - _umount_fs "${work_dir}/mnt/${_src}" } -command_checksum () { - _show_config checksum - - local _chk_arch - - for _chk_arch in i686 x86_64; do - if _is_directory_changed "${work_dir}/iso/${install_dir}" "${work_dir}/iso/${install_dir}/checksum.${_chk_arch}.md5"; then - _msg_info "Creating checksum file for self-test (${_chk_arch})..." - cd "${work_dir}/iso/${install_dir}" - if [[ -d "${_chk_arch}" ]]; then - md5sum aitab > checksum.${_chk_arch}.md5 - find ${_chk_arch} -type f -print0 | xargs -0 md5sum >> checksum.${_chk_arch}.md5 - if [[ -d "any" ]]; then - find any -type f -print0 | xargs -0 md5sum >> checksum.${_chk_arch}.md5 - fi - fi - cd ${OLDPWD} - _msg_info "Done!" - fi - done +_mksignature () { + _msg_info "Creating signature file..." + cd "${work_dir}/iso/${install_dir}/${arch}" + gpg --detach-sign --default-key ${gpg_key} airootfs.sfs + cd ${OLDPWD} + _msg_info "Done!" } command_pkglist () { _show_config pkglist - if _is_directory_changed "${work_dir}/root-image/var/lib/pacman/local" "${work_dir}/iso/${install_dir}/pkglist.${arch}.txt"; then - _msg_info "Creating a list of installed packages on live-enviroment..." - pacman -Sl -r "${work_dir}/root-image" --config "${pacman_conf}" | \ - awk '/\[installed\]$/ {print $1 "/" $2 "-" $3}' > \ - "${work_dir}/iso/${install_dir}/pkglist.${arch}.txt" - _msg_info "Done!" - fi + _msg_info "Creating a list of installed packages on live-enviroment..." + pacman -Sl -r "${work_dir}/airootfs" --config "${pacman_conf}" | \ + awk '/\[installed\]$/ {print $1 "/" $2 "-" $3}' > \ + "${work_dir}/iso/${install_dir}/pkglist.${arch}.txt" + _msg_info "Done!" } @@ -422,67 +301,46 @@ command_iso () { _show_config iso - if _is_directory_changed "${work_dir}/iso" "${out_dir}/${img_name}"; then - mkdir -p ${out_dir} - _msg_info "Creating ISO image..." - local _qflag="" - if [[ ${quiet} == "y" ]]; then - _qflag="-quiet" - fi - xorriso -as mkisofs ${_qflag} \ - -iso-level 3 \ - -full-iso9660-filenames \ - -volid "${iso_label}" \ - -appid "${iso_application}" \ - -publisher "${iso_publisher}" \ - -preparer "prepared by mkparabolaiso" \ - -eltorito-boot isolinux/isolinux.bin \ - -eltorito-catalog isolinux/boot.cat \ - -no-emul-boot -boot-load-size 4 -boot-info-table \ - -isohybrid-mbr ${work_dir}/iso/isolinux/isohdpfx.bin \ - ${_iso_efi_boot_args} \ - -output "${out_dir}/${img_name}" \ - "${work_dir}/iso/" - _msg_info "Done! | $(ls -sh ${out_dir}/${img_name})" + mkdir -p ${out_dir} + _msg_info "Creating ISO image..." + local _qflag="" + if [[ ${quiet} == "y" ]]; then + _qflag="-quiet" fi + xorriso -as mkisofs ${_qflag} \ + -iso-level 3 \ + -full-iso9660-filenames \ + -volid "${iso_label}" \ + -appid "${iso_application}" \ + -publisher "${iso_publisher}" \ + -preparer "prepared by mkparabolaiso" \ + -eltorito-boot isolinux/isolinux.bin \ + -eltorito-catalog isolinux/boot.cat \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + -isohybrid-mbr ${work_dir}/iso/isolinux/isohdpfx.bin \ + ${_iso_efi_boot_args} \ + -output "${out_dir}/${img_name}" \ + "${work_dir}/iso/" + _msg_info "Done! | $(ls -sh ${out_dir}/${img_name})" } -# Parse aitab and create each filesystem specified on that, and push it in "iso" directory. +# create airootfs.sfs filesystem, and push it in "iso" directory. command_prepare () { - if [[ ! -f "${work_dir}/iso/${install_dir}/aitab" ]]; then - _msg_error "The file '${work_dir}/iso/${install_dir}/aitab' does not exist." 1 - fi _show_config prepare _cleanup - local _aitab_img _aitab_mnt _aitab_arch _aitab_sfs_comp _aitab_fs_type _aitab_fs_size - while read _aitab_img _aitab_mnt _aitab_arch _aitab_sfs_comp _aitab_fs_type _aitab_fs_size ; do - if [[ ${_aitab_img} =~ ^# ]]; then - continue - fi - if [[ "${_aitab_arch}" != "any" && "${_aitab_arch}" != "${arch}" ]]; then - continue - fi - local _src="${work_dir}/${_aitab_img}" - local _dst="${work_dir}/iso/${install_dir}/${_aitab_arch}" - mkdir -p "${_dst}" - if [[ ${_aitab_fs_type} != "none" ]]; then - if _is_directory_changed "${_src}" "${_dst}/${_aitab_img}.fs.sfs"; then - _mkfs ${_aitab_img} ${_aitab_fs_type} ${_aitab_fs_size} - _mksfs ${_aitab_img}.fs ${_aitab_sfs_comp} - mv "${_src}.fs.sfs" "${_dst}" - rm "${_src}.fs" - fi - else - if _is_directory_changed "${_src}" "${_dst}/${_aitab_img}.sfs"; then - _mksfs ${_aitab_img} ${_aitab_sfs_comp} - mv "${work_dir}/${_aitab_img}.sfs" "${_dst}" - fi - fi - done < "${work_dir}/iso/${install_dir}/aitab" + if [[ ${sfs_mode} == "sfs" ]]; then + _mkairootfs_sfs + else + _mkairootfs_img + fi + _mkchecksum + if [[ ${gpg_key} ]]; then + _mksignature + fi } -# Install packages on root-image. +# Install packages on airootfs. # A basic check to avoid double execution/reinstallation is done via hashing package names. command_install () { if [[ ! -f "${pacman_conf}" ]]; then @@ -499,14 +357,7 @@ command_install () { _show_config install - local _pkg_list_hash - _pkg_list_hash=$(echo ${pkg_list} | sort -u | md5sum | cut -c1-32) - if [[ -f "${work_dir}/install.${_pkg_list_hash}" ]]; then - _msg_info "These packages are already installed, skipping." - else - _pacman "${pkg_list}" - : > "${work_dir}/install.${_pkg_list_hash}" - fi + _pacman "${pkg_list}" } command_init() { @@ -523,7 +374,7 @@ if [[ ${EUID} -ne 0 ]]; then _msg_error "This script must be run as root." 1 fi -while getopts 'p:r:C:L:P:A:D:w:o:vh' arg; do +while getopts 'p:r:C:L:P:A:D:w:o:s:c:g:i:vh' arg; do case "${arg}" in p) pkg_list="${pkg_list} ${OPTARG}" ;; r) run_cmd="${OPTARG}" ;; @@ -534,6 +385,10 @@ while getopts 'p:r:C:L:P:A:D:w:o:vh' arg; do D) install_dir="${OPTARG}" ;; w) work_dir="${OPTARG}" ;; o) out_dir="${OPTARG}" ;; + s) sfs_mode="${OPTARG}" ;; + c) sfs_comp="${OPTARG}" ;; + g) gpg_key="${OPTARG}" ;; + i) init="${OPTARG}" ;; v) quiet="n" ;; h|?) _usage 0 ;; *) @@ -564,9 +419,6 @@ case "${command_name}" in prepare) command_prepare ;; - checksum) - command_checksum - ;; pkglist) command_pkglist ;; |