diff options
Diffstat (limited to 'main/openrc/modloop.initd')
-rw-r--r-- | main/openrc/modloop.initd | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/main/openrc/modloop.initd b/main/openrc/modloop.initd new file mode 100644 index 0000000000..c32e1f49f5 --- /dev/null +++ b/main/openrc/modloop.initd @@ -0,0 +1,87 @@ +#!/sbin/runscript + +# script that will mount image with modules + +depend() { + need dev + before checkfs fsck hwdrivers modules hwclock + keyword novserver +} + +# read kernel options +init_KOPT() { + eval set -- $(cat /proc/cmdline 2>/dev/null) + while [ $# -gt 0 ]; do + case "$1" in + *=*) eval "KOPT_${1%%=*}='${1#*=}'" ;; + *) eval "KOPT_$(echo $1 | sed 's: :_:g')=yes" ;; + esac + shift + done +} + +find_mnt() { + local dev="$1" + local fsfile="$2" + awk "\$ == \"$dev\" {print \$2}\"" "$fsfile" 2>/dev/null +} + +# initialies: alpine_dev, alpine_mnt, alpine_fs, alpine_mounted +find_media() { + init_KOPT + alpine_mounted= + alpine_dev=${KOPT_alpine_dev%%:*} + alpine_fs=${KOPT_alpine_dev#*:} + [ "$alpine_fs" = "$KOPT_alpine_dev" ] && unset alpine_fs + # first we check if alpine_dev is mounted and use this + alpine_mnt=$(find_mnt /dev/$alpine_dev /proc/mounts) + if [ -z "$alpine_mnt" ]; then + # then we check fstab + alpine_mnt=$(find_mnt /dev/$alpine_dev /etc/fstab) + else + alpine_mounted=yes + fi + # finally we fallback to /media/<devicename> + [ -z "$alpine_mnt" ] && alpine_mnt=/media/$alpine_dev +} + +start() { + local modloop mount_opts + find_media + if [ -z "$alpine_dev" ] ; then + ebegin "Skipping mount module loopback (specify with alpine_dev)" + eend 0 + return 0 + fi + + modloop=${KOPT_modloop:-$KOPT_BOOT_IMAGE.cmg} + [ -n "$alpine_fs" ] && mount_opts="-t $alpine_fs" + + ebegin "Mounting loopback device for kernel modules" + if [ -z "$alpine_mounted" ]; then + mount $mount_opts /dev/$alpine_dev $alpine_mnt 2>/dev/null + fi + mkdir -p /.modloop /lib + + mount -o loop,ro -t cramfs $alpine_mnt/$modloop /.modloop &&\ + rm -rf /lib/modules &&\ + ln -sf /.modloop/modules /lib/ + eend $? || return 1 + + # copy firmware if there are any + if [ -d $alpine_mnt/firmware ]; then + ebegin "Copying firmware from $alpine_mnt/firmware" + cp -R -a $alpine_mnt/firmware /lib/ + eend $? + fi +} + +stop() { + find_media + [ -z "$alpine_dev" ] && return 0 + ebegin "Unmounting loopback device for kernel modules" + umount -d /.modloop &&\ + umount $alpine_mnt 2>/dev/null + eend $? +} + |