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