summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Hoyer <harald@redhat.com>2013-03-19 12:24:13 +0100
committerHarald Hoyer <harald@redhat.com>2013-03-19 12:26:06 +0100
commit7b6bdc3f943c0e34671faca3b671074c77e64ff0 (patch)
tree50f790c2d1cb860f6e958197dc2a217ab7f6ba90
parentdb43f56d94bcb87c92b688e708988ef39603cdc2 (diff)
downloaddracut-7b6bdc3f943c0e34671faca3b671074c77e64ff0.tar.gz
dracut-7b6bdc3f943c0e34671faca3b671074c77e64ff0.tar.bz2
dracut-7b6bdc3f943c0e34671faca3b671074c77e64ff0.zip
nbd/nbdroot.sh: fix root != blockdev case
-rwxr-xr-xmodules.d/95nbd/nbdroot.sh41
1 files changed, 21 insertions, 20 deletions
diff --git a/modules.d/95nbd/nbdroot.sh b/modules.d/95nbd/nbdroot.sh
index 4aebef0d..1a1ed545 100755
--- a/modules.d/95nbd/nbdroot.sh
+++ b/modules.d/95nbd/nbdroot.sh
@@ -17,18 +17,18 @@ PATH=/usr/sbin:/usr/bin:/sbin:/bin
# root is in the form root=nbd:srv:port[:fstype[:rootflags[:nbdopts]]]
netif="$1"
-root="$2"
+nroot="$2"
NEWROOT="$3"
# If it's not nbd we don't continue
-[ "${root%%:*}" = "nbd" ] || return
+[ "${nroot%%:*}" = "nbd" ] || return
-root=${root#nbd:}
-nbdserver=${root%%:*}; root=${root#*:}
-nbdport=${root%%:*}; root=${root#*:}
-nbdfstype=${root%%:*}; root=${root#*:}
-nbdflags=${root%%:*}
-nbdopts=${root#*:}
+nroot=${nroot#nbd:}
+nbdserver=${nroot%%:*}; nroot=${nroot#*:}
+nbdport=${nroot%%:*}; nroot=${nroot#*:}
+nbdfstype=${nroot%%:*}; nroot=${nroot#*:}
+nbdflags=${nroot%%:*}
+nbdopts=${nroot#*:}
# If nbdport not an integer, then assume name based import
if [ ! -z $(echo "$nbdport" | sed 's/[0-9]//g') ]; then
@@ -92,26 +92,27 @@ while [ ! -b /dev/nbd0 ]; do
else
sleep 0.1
fi
- i=$(( $i + 1))
+ i=$(($i + 1))
done
-nbd-client $preopts "$nbdserver" $nbdport /dev/nbd0 $opts || exit 1
-
# If we didn't get a root= on the command line, then we need to
# add the udev rules for mounting the nbd0 device
-root=$(getarg root=)
-if [ -z "$root" ] || strstr "$root" "nbd:" || strstr "$root" "dhcp"; then
- echo '[ -e /dev/root ] || { info=$(udevadm info --query=env --name=/dev/nbd0); [ -z "${info%%*ID_FS_TYPE*}" ] && { ln -s /dev/nbd0 /dev/root 2>/dev/null; type systemctl >/dev/null 2>&1 && systemctl --no-block start sysroot.mount;:; };} && rm $job;' \
- > $hookdir/initqueue/settled/nbd.sh
-
+if [ -z "$root" -o -n "${root%%block:*}" -o "$root" = "block:/dev/root" ]; then
+ printf 'KERNEL=="nbd0", ENV{DEVTYPE}!="partition", ENV{ID_FS_TYPE}=="?*", SYMLINK+="root"\n' >> /etc/udev/rules.d/99-nbd-root.rules
+ udevadm control --reload
type write_fs_tab >/dev/null 2>&1 || . /lib/fs-lib.sh
- write_fs_tab /dev/nbd0 "$nbdfstype" "$fsopts"
+ write_fs_tab /dev/root "$nbdfstype" "$fsopts"
+ wait_for_dev /dev/root
- printf '/bin/mount %s\n' \
- "$NEWROOT" \
- > $hookdir/mount/01-$$-nbd.sh
+ if [ -z "$DRACUT_SYSTEMD" ]; then
+ printf '/bin/mount %s\n' \
+ "$NEWROOT" \
+ > $hookdir/mount/01-$$-nbd.sh
+ fi
fi
+nbd-client $preopts "$nbdserver" $nbdport /dev/nbd0 $opts || exit 1
+
# NBD doesn't emit uevents when it gets connected, so kick it
echo change > /sys/block/nbd0/uevent
udevadm settle