[PATCH] Add nbd root support to dracut

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds preliminary nbdroot support to dracut.

It does this without using udev, as module insertion creates 16 devices, each
triggering udev. For now I wanted to have nbd working, we can always implement
it in udev at a later time.

The core in question supports different root definitions:

URI Style syntax. Path is ignored, as nbd targets are defined by server and
port:

	root=nbd://server.ip.add.ress:port[/path]

mkinitrd Style syntax. This is used by the mkinitrd from RH which only accepts
this syntax as a dhcp delivered root path. Dracut does understand it as a normal
root definition as well:

	root=nbd:server.ip.add.ress:port:filesystemtype:mountoptions

Debian style syntax. With the base device being an optional number to indicate
the nbd device to use.

	root=/dev/nbd[0-9]* nbdroot=server.ip.add.ress,port[,nbd basedevice]

diffstat dracut-nbd-root.patch 
 install        |    4 +++
 nbd-prepare.sh |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+)

diff -uNr dracut/modules.d/95nbd/install dracut/modules.d/95nbd/install
--- dracut/modules.d/95nbd/install	1970-01-01 01:00:00.000000000 +0100
+++ dracut/modules.d/95nbd/install	2009-05-23 20:11:00.438418944 +0200
@@ -0,0 +1,4 @@
+#!/bin/sh
+inst nbd-client
+inst_hook pre-mount 99 "$moddir/nbd-prepare.sh"
+instmods nbd
diff -uNr dracut/modules.d/95nbd/nbd-prepare.sh dracut/modules.d/95nbd/nbd-prepare.sh
--- dracut/modules.d/95nbd/nbd-prepare.sh	1970-01-01 01:00:00.000000000 +0100
+++ dracut/modules.d/95nbd/nbd-prepare.sh	2009-05-24 11:26:13.674261991 +0200
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+# If root=dhcp and a nbd-root has been passed, transform this into the
+# root=nbd::::: syntax
+if [ "$root" = "dhcp" ]; then
+    for dev in /net.*.dhcpopts; do 
+	if [ -f "$dev" ]; then 
+	    . "$dev"
+	    [ -n "$new_root_path" ] && root="nbd:${new_root_path}"
+	fi
+    done
+fi
+
+# Transform the debian way of using root=/dev/nbd and nbdroot=,,,
+if [ -z "${root%%/dev/nbd*}"]; then
+#    nbdroot=$(getarg nbdroot=)
+    if [ -n "$nbdroot" ]; then
+	nbdserver="${nbdroot%%,*}"
+	nbdport="${nbdroot#*,}"
+	nbdport="${nbdport%%,*}"
+	root="nbd://{$nbdserver}:${nbdport}/"
+	if [ "${nbdroot#*,*,}" != "$nbdroot" ]; then
+	    nbdbasedev="${nbdroot#*,*,}"
+	    [ -n "$nbdbasedev" ] && nbdrootdev="/dev/nbd${nbdbasedev}"
+	fi
+    fi
+fi
+
+# Only do anything if root is nbd:
+if [ "${root#nbd:}" != "$root" ]; then
+    # Parse server and port from a nbd://10.0.0.1:1234/ style URI and discard
+    # everything after the port
+    if [ "${root#nbd://}" != "$root" ]; then
+	nbdserver="${root#nbd://}"
+	nbdserver="${nbdserver%:*}"
+	nbdport="${root#nbd://$nbdserver:}"
+	nbdport="${nbdport%%/*}"
+	nbdfs=""
+	nbdopts="rw"
+
+    # Parse server, port, filesystem and options from old-style mkinitrd
+    # IPADDRESS:PORT:FILESYSTEM:OPTIONS style root definitions
+    elif [ "${root%%:*:*:*:*}" = "nbd" ]; then
+	nbdserver="${root#nbd:}"
+	nbdserver="${nbdserver%%:*}"
+	nbdport="${root#nbd:$nbdserver:}"
+	nbdport="${nbdport%%:*}"
+	nbdfs="${root#nbd:$nbdserver:$nbdport:}"
+	nbdfs="${nbdfs%%:*}"
+	nbdopts="${root#nbd:$nbdserver:$nbdport:$nbdfs:}"
+	nbdopts="${nbdopts%%:*}"
+    fi
+
+
+    if [ -n "$nbdserver" ] && [ "$nbdport" -gt 0 -a "$nbdport" -lt 65536 ]; then
+	root="${nbdrootdev:-/dev/nbd0}"
+	fstype="${nbdfs:--t auto}"
+	rflags="${nbdopts:-ro}"
+
+	modprobe nbd
+	i=0
+	# Wait till the device node really exists
+	while [ ! -b "$root" ]; do
+	    [ $i -ge 20 ] && exit 1
+	    sleep 0.1
+	    i=$(($i+1))
+	done
+
+	nbd-client "$nbdserver" "$nbdport" "$root"
+    fi
+fi
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux