From 0eb35dca65c70b77d771aad50079691567d1cfce Mon Sep 17 00:00:00 2001 From: illiliti Date: Tue, 19 May 2020 07:29:40 +0300 Subject: [PATCH] improve code, drop setsid, move set -ef to main function --- README.md | 15 +++-- device-helper | 9 ++- init | 156 ++++++++++++++------------------------------------ tinyramfs | 37 ++++++------ 4 files changed, 73 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index b9ae847..b295ab2 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ Dependencies * `switch_root` * `readlink` * `install` -* `setsid` * `mount` * `blkid` * `cpio` @@ -63,13 +62,13 @@ Usage ``` usage: tinyramfs [option] - -o, --output set initramfs output path - -c, --config set config file path - -m, --moddir set modules directory - -k, --kernel set kernel version - -F, --files set files directory - -d, --debug enable debug mode - -f, --force overwrite initramfs image + -o, --output set initramfs output path + -c, --config set config file path + -m, --moddir set modules directory + -k, --kernel set kernel version + -F, --files set files directory + -d, --debug enable debug mode + -f, --force overwrite initramfs image ``` Configuration diff --git a/device-helper b/device-helper index 43bfd6d..8d2fe3e 100755 --- a/device-helper +++ b/device-helper @@ -12,7 +12,7 @@ create_symlink() sym="${dir}/${sym}" mkdir -p "$dir" - ln -s "/dev/${dev_name}" "$sym" + ln -s "../../${dev_name}" "$sym" } # int main() @@ -21,7 +21,7 @@ create_symlink() exec > /dev/null 2>&1 - # avoid race condition + # prevent race condition while ! blkid "/dev/${dev_name}"; do sleep 1; done for line in $(blkid "/dev/${dev_name}"); do case "${line%%=*}" in @@ -30,9 +30,8 @@ create_symlink() PARTUUID) create_symlink /dev/disk/by-partuuid "${line##*=}" ;; esac; done - [ -e "/sys/block/${dev_name}/dm/name" ] && { + read -r dm_name < "/sys/block/${dev_name}/dm/name" && { mkdir -p /dev/mapper - read -r dm_name < "/sys/block/${dev_name}/dm/name" - ln -sf "/dev/${dev_name}" "/dev/mapper/${dm_name}" + ln -sf "../${dev_name}" "/dev/mapper/${dm_name:?}" } } diff --git a/init b/init index 36954cc..74518dc 100755 --- a/init +++ b/init @@ -16,15 +16,7 @@ print() panic() { print "${1:-unexpected error occurred}" \ - "\033[1;31m!!\033[m" >&2 - - shell -} - -shell() -{ - # see https://busybox.net/FAQ.html#job_control - setsid sh -c "exec sh <> /dev/${console:-tty1} 2>&1" || sh + "\033[1;31m!!\033[m" >&2; sh } findfs() @@ -32,25 +24,15 @@ findfs() count=0; device= case "${1%%=*}" in - /dev/*) - device="$1" - ;; - UUID) - device="/dev/disk/by-uuid/${1##*=}" - ;; - LABEL) - device="/dev/disk/by-label/${1##*=}" - ;; - PARTUUID) - device="/dev/disk/by-partuuid/${1##*=}" - ;; + /dev/*) device="$1" ;; + UUID) device="/dev/disk/by-uuid/${1##*=}" ;; + LABEL) device="/dev/disk/by-label/${1##*=}" ;; + PARTUUID) device="/dev/disk/by-partuuid/${1##*=}" ;; esac - # avoid race condition - while [ ! -e "$device" ]; do - sleep 1; : $(( count += 1 )) - - [ "$count" = 30 ] && { + # prevent race condition + while [ ! -e "$device" ]; do sleep 1 + [ "$(( count += 1 ))" = 30 ] && { panic "failed to lookup partition" break } @@ -62,17 +44,8 @@ prepare_environment() . /etc/tinyramfs/config export \ - LANG=C \ - PS1="# " \ - LC_ALL=C \ - TERM=linux \ - HOME=/root \ - SHELL=/bin/sh \ - OLD_IFS="$IFS" \ - PATH=/bin:/sbin:/usr/bin:/usr/sbin - - # fix for ubase mount - : > /etc/fstab + PATH=/bin TERM=linux SHELL=/bin/sh \ + LANG=C LC_ALL=C PS1="# " HOME=/root \ mount -t proc -o nosuid,noexec,nodev proc /proc mount -t sysfs -o nosuid,noexec,nodev sys /sys @@ -91,89 +64,62 @@ prepare_environment() trap panic EXIT - [ "$modules" ] || return 0 - - modprobe -a "$modules" + [ ! "$modules" ] || modprobe -a "$modules" } parse_cmdline() { read -r cmdline < /proc/cmdline - for line in $cmdline; do case "$line" in - debug | debug=1) - set -x - ;; - rootfstype=*) - root_type="$line" - ;; - rootflags=*) - root_opts="$line" - ;; - ro | rw) - rorw="-o $line" - ;; - *.*) - # TODO implement backward compatibilty with dracut, mkinitcpio, etc - : no operation - ;; - *=*) - export "$line" || : - ;; - *) - export "${line}=1" || : - ;; + for line in $cmdline; do case "$line" in + debug | debug=1) set -x ;; + rootfstype=*) root_type="$line" ;; + rootflags=*) root_opts="$line" ;; + ro | rw) rorw=" -o $line" ;; + *.*) : no operation ;; + *=*) export "$line" ;; + *) export "${line}=1" ;; esac; done } setup_devmgr() { - [ "$break" = devmgr ] && { print "break before setup_devmgr()"; shell; } + [ "$break" = devmgr ] && { print "break before setup_devmgr()"; sh; } case "$devmgr" in udev) - udevd -dN never + udevd -N never & devmgr_pid="$!" udevadm trigger -c add -t subsystems udevadm trigger -c add -t devices udevadm settle ;; mdev) - mdev -df 2> /dev/null & mdev_pid="$!" mdev -s + mdev -df & devmgr_pid="$!" [ "$monolith" = 1 ] && return 0 - # TODO maybe replace sort using while-read loop - # while-read can cause slowdown, so why i'm unsure - set -- $(find /sys -name modalias -type f -exec sort -u {} +) - modprobe -a "$@" 2> /dev/null || : + set -- $(find /sys -name modalias -exec sort -u {} +) + modprobe -a "$@" || : ;; mdevd) - mdevd 2> /dev/null & mdevd_pid="$!" + mdevd & devmgr_pid="$!" mdevd-coldplug ;; - esac + esac 2> /dev/null } unlock_luks() { - [ "$break" = luks ] && { print "break before unlock_luks()"; shell; } + [ "$break" = luks ] && { print "break before unlock_luks()"; sh; } - { IFS=,; set -- $luks_opts; IFS="$OLD_IFS"; } + { IFS=,; set -- $luks_opts; unset IFS; } for opt; do case "$opt" in - discard | discard=1) - luks_discard="--allow-discards" - ;; - header=*) - luks_header="--${opt}" - ;; - name=*) - luks_name="${opt##*=}" - ;; - key=*) - luks_key="-d ${opt##*=}" - ;; + discard | discard=1) luks_discard="--allow-discards" ;; + header=*) luks_header="--${opt}" ;; + name=*) luks_name="${opt##*=}" ;; + key=*) luks_key="-d ${opt##*=}" ;; esac; done findfs "$luks_root" @@ -188,26 +134,16 @@ unlock_luks() trigger_lvm() { - [ "$break" = lvm ] && { print "break before trigger_lvm()"; shell; } + [ "$break" = lvm ] && { print "break before trigger_lvm()"; sh; } - { IFS=,; set -- $lvm_opts; IFS="$OLD_IFS"; } + { IFS=,; set -- $lvm_opts; unset IFS; } for opt; do case "$opt" in - discard | discard=1) - lvm_discard="--config=devices{issue_discards=1}" - ;; - config=0) - : > /etc/lvm/lvm.conf - ;; - group=*) - lvm_group="${opt##*=}" - ;; - name=*) - lvm_name="/${opt##*=}" - ;; - tag=*) - lvm_tag="@${opt##*=}" - ;; + discard | discard=1) lvm_discard="--config=devices{issue_discards=1}" ;; + config=0) : > /etc/lvm/lvm.conf ;; + group=*) lvm_group="${opt##*=}" ;; + name=*) lvm_name="/${opt##*=}" ;; + tag=*) lvm_tag="@${opt##*=}" ;; esac; done set -- "--sysinit" "-qq" "-aay" "$lvm_discard" @@ -225,7 +161,7 @@ trigger_lvm() mount_root() { - [ "$break" = root ] && { print "break before mount_root()"; shell; } + [ "$break" = root ] && { print "break before mount_root()"; sh; } findfs "$root" @@ -239,17 +175,13 @@ mount_root() cleanup() { - [ "$break" = cleanup ] && { print "break before cleanup()"; shell; } + [ "$break" = cleanup ] && { print "break before cleanup()"; sh; } - case "$devmgr" in - udev) udevadm control -e ;; - mdev) kill "$mdev_pid" ;; - mdevd) kill "$mdevd_pid" ;; - esac + kill "$devmgr_pid" # temporary workaround until util-linux release a new version # see https://github.com/karelzak/util-linux/issues/997 - for dir in /run /dev /sys /proc; do + for dir in run dev sys proc; do mount -o move "$dir" "/mnt/root/${dir}" || mount --move "$dir" "/mnt/root/${dir}" done @@ -257,7 +189,7 @@ cleanup() boot_system() { - [ "$break" = boot ] && { print "break before boot_system()"; shell; } + [ "$break" = boot ] && { print "break before boot_system()"; sh; } set -- "/mnt/root" "${init:-/sbin/init}" exec switch_root $@ 2> /dev/null || panic "failed to boot system" diff --git a/tinyramfs b/tinyramfs index 5cf9b11..5ec7824 100755 --- a/tinyramfs +++ b/tinyramfs @@ -1,4 +1,4 @@ -#!/bin/sh -ef +#!/bin/sh # # tiny initramfs # @@ -13,9 +13,7 @@ print() panic() { print "${1:-unexpected error occurred}" \ - "\033[1;31m!!\033[m" >&2 - - exit 1 + "\033[1;31m!!\033[m" >&2; exit 1 } usage() @@ -95,7 +93,6 @@ prepare_environment() workdirbin="${workdir}/usr/bin/" workdirlib="${workdir}/usr/lib/" modker="${moddir}/${kernel}" - OLD_IFS="$IFS" [ "$debug" = 1 ] && set -x || trap trap_helper EXIT INT } @@ -134,6 +131,9 @@ install_requirements() # install init install -m755 "${filesdir}/init" "${workdir}/init" + # fix ubase mount issue + : > "${workdir}/etc/fstab" + populate_config \ "root='$root'" \ "devmgr='$devmgr'" \ @@ -180,7 +180,7 @@ install_devmgr() case "$devmgr" in none) - # TODO implement device-manager-less mode using deprecated + # TODO implement mode without device manager using deprecated # /sys/kernel/uevent_helper or /proc/sys/kernel/hotplug ;; mdev) @@ -194,6 +194,10 @@ install_devmgr() [ "$monolith" = 1 ] && return 0 + for _binary in find sort; do + install_binary "$_binary" + done + printf "%s\n" \ '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \ >> "${workdir}/etc/mdev.conf" @@ -253,7 +257,7 @@ install_lvm() # word splitting is safe by design # shellcheck disable=2086 - { IFS=,; set -- $lvm_opts; IFS="$OLD_IFS"; } + { IFS=,; set -- $lvm_opts; unset IFS; } for opt; do case "$opt" in config | config=1) embed_lvm_config=1 ;; @@ -282,15 +286,12 @@ install_luks() # word splitting is safe by design # shellcheck disable=2086 - { IFS=,; set -- $luks_opts; IFS="$OLD_IFS"; } + { IFS=,; set -- $luks_opts; unset IFS; } for opt; do case "${opt%%=*}" in key | header) - install -m400 "${opt##*=}" \ - "${workdir}/root/${opt%%=*}" || panic - - luks_opts=$(printf "%s" "$luks_opts" | - sed "s|${opt##*=}|/root/${opt%%=*}|") + install -m400 "${opt##*=}" "${workdir}/root/${opt%%=*}" || panic + luks_opts=$(printf "%s" "$luks_opts" | sed "s|${opt##*=}|/root/${opt%%=*}|") ;; esac; done @@ -406,11 +407,6 @@ install_modules() populate_config "modules='$modules'" } - [ "$devmgr" = mdev ] && - for _binary in find sort; do - install_binary "$_binary" - done - install_binary modprobe install -m644 \ @@ -436,7 +432,7 @@ install_binary() *) # word splitting is safe by design # shellcheck disable=2086 - { IFS=:; set -- $PATH; IFS="$OLD_IFS"; } + { IFS=:; set -- $PATH; unset IFS; } # try to discover external binary/script by checking PATH for _dir; do @@ -519,6 +515,9 @@ create_initramfs() { [ "$(id -u)" = 0 ] || panic "must be run as root" + # enable exit on error and disable globbing + set -ef + parse_args "$@" prepare_environment create_structure