aboutsummaryrefslogtreecommitdiffstats
path: root/main/openrc/modloop.initd
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2015-11-26 12:32:13 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2015-11-26 13:09:08 +0000
commitfa2cffb7d47275f4a5465d186df4fbe9745b62f8 (patch)
treeb205c3b34f22e077d2442d023a6ca6012b7f180e /main/openrc/modloop.initd
parentafac5095eb2c98f640e587e65347e0b73d7f93a7 (diff)
downloadaports-fa2cffb7d47275f4a5465d186df4fbe9745b62f8.tar.bz2
aports-fa2cffb7d47275f4a5465d186df4fbe9745b62f8.tar.xz
main/openrc: refactor modloop to not depend on alpine_dev boot opt
We scan all relevant mount points for the modloop specified with the modloop boot option. If modloop boot option is missing, then we warn about it, look for files that blkid recognizes, try mount them and then look for modules/$(uname -r). Wen unmounting, find the loop device, and the backing_file and the mountpoint that holds the backing file.
Diffstat (limited to 'main/openrc/modloop.initd')
-rw-r--r--main/openrc/modloop.initd147
1 files changed, 62 insertions, 85 deletions
diff --git a/main/openrc/modloop.initd b/main/openrc/modloop.initd
index 2e7331be11..6bd2e8a2f5 100644
--- a/main/openrc/modloop.initd
+++ b/main/openrc/modloop.initd
@@ -11,115 +11,89 @@ depend() {
# read kernel options
init_KOPT() {
eval set -- $(cat /proc/cmdline 2>/dev/null)
- # in case syslinux does not set BOOT_IMAGE
- KOPT_BOOT_IMAGE="${1}"
for opt; do
case "$opt" in
- alpine_dev=*|modloop=*|BOOT_IMAGE=*)
+ modloop=*)
eval "KOPT_${opt%%=*}='${opt#*=}'" ;;
- esac
+ esac
done
}
-resolve_dev() {
- case "$1" in
- UUID=*|LABEL=*) findfs "$1";;
- *) readlink -f "$1";;
- esac
+mountdirs() {
+ awk '$2 !~ /^\/(sys|proc|dev|run)/ && $2 != "/" {print $2}' /proc/mounts
}
-find_mnt() {
- local search_dev="$1" fstab="$2"
- local dev mnt fs mntopts chk
- case "$search_dev" in
- UUID=*|LABEL=*|/dev/*);;
- nfs) search_dev="${KOPT_alpine_dev#nfs:}";;
- *) search_dev=/dev/$search_dev;;
- esac
- local search_real_dev=$(resolve_dev $search_dev)
- while read dev mnt fs mntopts chk; do
- local real_dev=$(resolve_dev $dev)
- local i j
- for i in "$search_dev" "$search_real_dev"; do
- [ -z "$i" ] && continue
- for j in "$dev" "$real_dev"; do
- [ -z "$j" ] && continue
- if [ "$i" = "$j" ]; then
- echo "$mnt"
- return
- fi
- done
- done
- done < $fstab 2>/dev/null
+find_modloop() {
+ local dir="$1"
+ local kver=$(uname -r)
+ local oifs="$IFS"
+ IFS=$'\n'
+ set -- $(blkid "$dir"/boot/* "$dir"/*)
+ IFS="$oifs"
+ for line; do
+ img=${line%%:*}
+ mount "$img" -o loop,ro /.modloop || continue
+ if [ -d /.modloop/modules/$kver ]; then
+ return 0
+ fi
+ umount /.modloop
+ done
+ return 1
}
-# initialies: alpine_dev, alpine_mnt, alpine_fs, alpine_mounted
-find_media() {
- init_KOPT
- [ -z "$KOPT_alpine_dev" ] && return 0
- 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 $alpine_dev /proc/mounts)
- if [ -z "$alpine_mnt" ]; then
- # then we check fstab
- alpine_mnt=$(find_mnt $alpine_dev /etc/fstab)
- else
- alpine_mounted=yes
+find_backing_file() {
+ local dir="$1"
+ local dev=$(df -P "$dir" | tail -1 | awk '{print $1}')
+ cat /sys/block/${dev#/dev/}/loop/backing_file 2>/dev/null
+}
+
+find_alpine_mnt() {
+ local img="$(find_backing_file $1)"
+ if [ -n "$img" ]; then
+ df -P "$img" | tail -1 | awk '{print $6}'
fi
- # finally we fallback to /media/<devicename>
- [ -z "$alpine_mnt" ] && alpine_mnt=/media/$alpine_dev
}
start() {
local modloop= mount_opts= modloop_dldir="/lib"
- find_media
-
+ mkdir -p /.modloop /lib
case "$KOPT_modloop" in
http://*|https://|ftp://*)
wget -P "$modloop_dldir" "$KOPT_modloop" \
&& modloop=$modloop_dldir/$(basename $KOPT_modloop)
;;
+ "")
+ ewarn "WARNING! modloop boot option is missing."
+ ;;
*)
- if [ -z "$alpine_dev" ]; then
- return 0
- fi
- if [ -z "$alpine_mounted" ]; then
- ebegin "Mounting $alpine_mnt"
- [ -n "$alpine_fs" ] && mount_opts="-t $alpine_fs"
- mount $mount_opts /dev/$alpine_dev $alpine_mnt 2>/dev/null
- eend $? || return 1
- fi
-
- bootimagedir=${KOPT_BOOT_IMAGE%/*}
- bootdir=${alpine_mnt}${bootimagedir}
- kver=$(uname -r)
- case $kver in
- *-rc[0-9]) kflavor=vanilla;;
- *-[a-z]*) kflavor=${kver##*-};;
- *) kflavor=vanilla;;
- esac
- for modloop in ${alpine_mnt}$KOPT_modloop \
- ${bootdir}/modloop-$kver \
- ${bootdir}/modloop-$kflavor \
- ${bootdir}/modloop \
- ${alpine_mnt}/boot/modloop-$kver \
- ${alpine_mnt}/boot/modloop-$kflavor \
- ${alpine_mnt}/boot/modloop \
- ${alpine_mnt}$KOPT_BOOT_IMAGE.modloop.*; do
-
- [ -f "$modloop" -o -n "$KOPT_modloop" ] && break
+ for dir in $(mountdirs); do
+ if [ -f "$dir"/$KOPT_modloop ]; then
+ modloop="$dir/${KOPT_modloop##/}"
+ alpine_mnt="$dir"
+ break
+ fi
done
;;
esac
ebegin "Mounting modloop $modloop"
- mkdir -p /.modloop /lib
- mount -o loop,ro $fs_opt $modloop /.modloop
- eend $? || return 1
+ if [ -n "$modloop" ]; then
+ mount -o loop,ro $modloop /.modloop
+ eend $? || return 1
+ else
+ for dir in $(mountdirs); do
+ if find_modloop "$dir"; then
+ alpine_mnt="$dir"
+ break
+ fi
+ done
+ if [ -d /.modloop/modules/$(uname -r) ]; then
+ eend 0
+ else
+ eend 1 || return 1
+ fi
+ fi
#use unionfs is available and configured
if grep -q -w "unionfs$" /proc/filesystems && [ -n "$unionfs_size" ]; then
@@ -146,14 +120,17 @@ start() {
stop() {
local rc=0
- find_media
- [ -z "$alpine_dev" ] && return 0
+ alpine_mnt=$(find_alpine_mnt /.modloop)
+ if mountinfo --quiet /.modunisonfs/modules && mountinfo --quiet /lib/modules; then
+ umount /lib/modules
+ umount /.modunisonfs/modules
+ fi
if mountinfo --quiet /.modloop; then
ebegin "Unmounting /.modloop"
umount -d /.modloop
eend $? || return 1
fi
- if mountinfo --quiet $alpine_mnt; then
+ if [ -n "$alpine_mnt" ] && mountinfo --quiet $alpine_mnt; then
ebegin "Unmounting $alpine_mnt"
umount $alpine_mnt
eend $?