diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2015-11-25 18:50:20 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2015-11-25 18:50:20 +0000 |
commit | ccf82e37785fdd047f3420ca370c228fd107b609 (patch) | |
tree | 29029912d1c4ba05831808bfe714c7b3bcdd4c60 | |
parent | 09cb0c2c4b414b8812acdd53eaf0f81525fb9f5f (diff) | |
download | mkinitfs-ccf82e37785fdd047f3420ca370c228fd107b609.tar.bz2 mkinitfs-ccf82e37785fdd047f3420ca370c228fd107b609.tar.xz |
init: fix mount relocation
-rwxr-xr-x | initramfs-init.in | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/initramfs-init.in b/initramfs-init.in index 0834175..cdf50b9 100755 --- a/initramfs-init.in +++ b/initramfs-init.in @@ -85,28 +85,25 @@ unpack_apkovl() { # find mount dir for given device in an fstab # returns global MNTOPTS find_mnt() { - local search_dev="$1" fstab="$2" - MNTOPTS= - [ -r "$fstab" ] || return 1 - local dev mnt fs chk + local search_dev="$1" + local fstab="$2" case "$search_dev" in - UUID=*|LABEL=*|/dev/*);; - *) search_dev=/dev/$search_dev;; + UUID*|LABEL*) search_dev=$(findfs "$search_dev");; esac - local search_real_dev=$(resolve_dev $search_dev) + MNTOPTS= + [ -r "$fstab" ] || return 1 + local search_maj_min=$(stat -L -c '%t,%T' $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 + case "$dev" in + UUID*|LABEL*) dev=$(findfs "$dev");; + esac + if [ -b "$dev" ]; then + local maj_min=$(stat -L -c '%t,%T' $dev) + if [ "$maj_min" = "$search_maj_min" ]; then + echo "$mnt" + return + fi + fi done < $fstab MNTOPTS= } @@ -227,12 +224,16 @@ resolve_dev() { # relocate mountpoint according given fstab relocate_mount() { - local dir="${1%%/}" + local dir="${1}" local fstab="$2" - local mnt=$(find_mnt $dir $fstab) - if [ -n "$mnt" ] && [ "$dir" != "$mnt" ]; then - mkdir -p "$mnt" - mount -o move "$dir" "$mnt" + local dev=$(df -P "$dir" | tail -1 | awk '{print $1}') + local mnt=$(find_mnt $dev $fstab) + if [ -n "$mnt" ]; then + local oldmnt=$(awk -v d=$dev '$1==d {print $2}' /proc/mounts) + if [ "$oldmnt" != "$mnt" ]; then + mkdir -p "$mnt" + mount -o move "$oldmnt" "$mnt" + fi fi } @@ -508,9 +509,9 @@ if [ -f $sysroot/etc/fstab ]; then # mount dir if [ -e /tmp/repositores ]; then - cut -d/ -f1-3 < /tmp/repositories | while read dir; do + while read dir; do relocate_mount "$dir" "$sysroot"/etc/fstab - done + done < /tmp/repositories fi fi @@ -578,9 +579,9 @@ fi # remount according default fstab from package if [ -z "$has_fstab" ] && [ -f "$sysroot"/etc/fstab ] && [ -f /tmp/repositories ]; then - cut -d/ -f1-3 < /tmp/repositories | while read dir; do + while read dir; do relocate_mount "$dir" "$sysroot"/etc/fstab - done + done < /tmp/repositories fi # generate repositories if none exists. this needs to be done after relocation |