reorganize
This commit is contained in:
163
usr/share/tinyramfs/init
Normal file
163
usr/share/tinyramfs/init
Normal file
@@ -0,0 +1,163 @@
|
||||
#!/sbin/busybox sh
|
||||
#
|
||||
# tiny init script
|
||||
|
||||
panic() {
|
||||
printf "panic >> %s\n" "$1"
|
||||
|
||||
# TODO fix job control
|
||||
sh
|
||||
}
|
||||
|
||||
parse_cmdline() {
|
||||
|
||||
# store output in variable
|
||||
read -r cmdline < /proc/cmdline
|
||||
|
||||
# turn output into list
|
||||
set -f && set +f -- $cmdline
|
||||
|
||||
for line in "$@"; do
|
||||
value="${line##*=}"
|
||||
|
||||
case "${line%%=*}" in
|
||||
debug) debug="$value" ;;
|
||||
init) init="$value" ;;
|
||||
root) root="$value" ;;
|
||||
root.type) root_type="$value" ;;
|
||||
root.opts) root_opts="$value" ;;
|
||||
lvm) lvm="$value" ;;
|
||||
lvm.name) lvm_name="$value" ;;
|
||||
lvm.group) lvm_group="$value" ;;
|
||||
lvm.args) lvm_args="$value" ;;
|
||||
luks) luks="$value" ;;
|
||||
luks.root) luks_root="$value" ;;
|
||||
luks.name) luks_name="$value" ;;
|
||||
luks.discard) luks_discard="$value" ;;
|
||||
luks.args) luks_args="$value" ;;
|
||||
# TODO implement
|
||||
#lvm.discard) ;;
|
||||
#lvm.config) ;;
|
||||
#luks.header) ;;
|
||||
#luks.keyfile) ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
mount_pseudofs() {
|
||||
mount -t proc none /proc
|
||||
mount -t sysfs none /sys
|
||||
mount -t devtmpfs none /dev
|
||||
}
|
||||
|
||||
setup_devmgr() {
|
||||
case "$devmgr" in
|
||||
udev)
|
||||
udevd -d
|
||||
udevadm trigger -c add -t subsystems
|
||||
udevadm trigger -c add -t devices
|
||||
udevadm settle
|
||||
;;
|
||||
mdev)
|
||||
mdev -df &
|
||||
|
||||
find /sys -name modalias -type f -exec sort -u {} + |
|
||||
xargs modprobe -ba
|
||||
;;
|
||||
mdevd)
|
||||
mdevd &
|
||||
mdevd-coldplug
|
||||
;;
|
||||
*)
|
||||
panic "devmgr option broken"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
findfs_sh() {
|
||||
value="${1##*=}"
|
||||
|
||||
case "${1%%=*}" in
|
||||
LABEL) device="/dev/disk/by-label/${value}" ;;
|
||||
UUID) device="/dev/disk/by-uuid/${value}" ;;
|
||||
PARTUUID) device="/dev/disk/by-partuuid/${value}" ;;
|
||||
/dev/*) device="$1" ;;
|
||||
*) panic "findfs option broken" ;;
|
||||
esac
|
||||
|
||||
# avoid race condition
|
||||
while [ ! -e "$device" ]; do
|
||||
sleep 0.5
|
||||
[ "$increment" ] || increment=0
|
||||
increment=$(( increment + 1 ))
|
||||
[ "$increment" = 10 ] && panic "failed to lookup partition"
|
||||
done
|
||||
|
||||
printf "%s\n" "$device"
|
||||
}
|
||||
|
||||
unlock_luks() {
|
||||
[ "$luks_discard" = 1 ] && luks_args="--allow-discards $luks_args"
|
||||
|
||||
cryptsetup $luks_args \
|
||||
luksOpen \
|
||||
$(findfs_sh "$luks_root") \
|
||||
${luks_name:-luks_root} ||
|
||||
panic "failed to unlock luks container"
|
||||
}
|
||||
|
||||
trigger_lvm() {
|
||||
if [ "$lvm_group" ] && [ "$lvm_name" ]; then
|
||||
lvm lvchange $lvm_args --sysinit -q -a y "${lvm_group}/${lvm_name}" > /dev/null
|
||||
elif [ "$lvm_group" ]; then
|
||||
lvm vgchange $lvm_args --sysinit -q -a y "$lvm_group" > /dev/null
|
||||
else
|
||||
lvm vgchange $lvm_args --sysinit -q -a y > /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
mount_rootfs() {
|
||||
mount ${root_type:+-t $root_type} \
|
||||
${root_opts:+-o $root_opts} \
|
||||
$(findfs_sh "$root") \
|
||||
/mnt/root ||
|
||||
panic "failed to mount rootfs"
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
case "$devmgr" in
|
||||
udev) udevadm control -e ;;
|
||||
mdev) killall mdev ;;
|
||||
mdevd) killall mdevd ;;
|
||||
esac
|
||||
|
||||
# unmount pseudofs's
|
||||
umount /dev /sys /proc
|
||||
}
|
||||
|
||||
boot_system() {
|
||||
exec switch_root /mnt/root \
|
||||
${init:-/sbin/init} ||
|
||||
panic "failed to boot system"
|
||||
}
|
||||
|
||||
/sbin/busybox --install -s
|
||||
|
||||
. /config || panic "failed to source config"
|
||||
|
||||
mount_pseudofs
|
||||
parse_cmdline
|
||||
[ "$debug" = 1 ] && set -x
|
||||
setup_devmgr
|
||||
|
||||
# TODO handle situations when LUKS on LVM
|
||||
[ "$luks" = 1 ] &&
|
||||
command -v cryptsetup > /dev/null 2>&1 && unlock_luks
|
||||
|
||||
[ "$lvm" = 1 ] &&
|
||||
command -v lvm > /dev/null 2>&1 && trigger_lvm
|
||||
|
||||
mount_rootfs
|
||||
[ "$debug" = 1 ] && panic "dropping to shell"
|
||||
cleanup
|
||||
boot_system
|
||||
Reference in New Issue
Block a user