Bogdan Costescu wrote:
On Tue, 24 Feb 2009, Seewer Philippe wrote:
Though I see a small problem: Ever thought about what happens if there
are multiple interfaces on different networks? Only one is valid to
mount the root-fs...
The Debian initramfs-tools documents as following here the rule from the
kernel's nfsroot.txt which allows an ip=... kernel command line
parameter which can contain the name of the device. Is this an option
that would fit your purpose ?
In my case: no. I need a general purpose netboot init where I don't know which or how many interfaces there are.
From what I know, there is no automated way to get that information
automatically in the format described, so you'd have to maintain it,
possibly in a PXE config file; it's possible to find out what interface
was used for PXE booting when using PXELINUX with the 'IPAPPEND 2'
option which will add a BOOTIF=mac_address to the kernel command line.
That is correct. Sadly this only works in a PXE environment.
This might however not be enough: there could be a case where the
booting (via PXE) is done on a different network (and interface) than
the one where the root NFS is exported. I know that this sounds
complicated, but it has been implemented in real life ;-)
Aye. Or similar: Consider a system with an interface into the standardnetwork and one into a lab net. Both yield correct dhcp results but only one is correct for a specific root-server.
To solve this, I'm currently just doing the network stuff sequentially, aborting when I've found the correct interface. The script looks more or less like this (yes, I know its ugly):
...
NETDEVICE=""
for i in $(sed -nr 's/^ *(\w+[0-9]+):.*$/\1/p' /proc/net/dev) ; do
NETDEVICE=""
for j in 1 2 3 4; do
if (udhcpc --interface=$i -n >/dev/null 2>&1) ; then
NETDEVICE=$i
break;
fi
sleep $j
done
if [ "$NETDEVICE" = "" ] ; then
continue
fi
NETDEVICE=""
if (ping -c 2 $NFSSERVER >/dev/null 2>&1) ; then
NETDEVICE=$i
fi
if [ "$NETDEVICE" = "" ] ; then
ifconfig $i down
continue
fi
NETDEVICE=""
if (mount -r $NFSOPTS $NFSSERVER:$NFSPATH /newroot >/dev/null 2>&1) ; then
NETDEVICE=$i
fi
if [ "$NETDEVICE" = "" ] ; then
ifconfig $i down
continue
fi
done
if [ "$NETDEVICE" = "" ] ; then
echo "Error: " #lots of text here
sh -i
fi
...
Hmm... looking at this, we can do this with Dracut really simple:
1. Don't start dhclient inside udev. Might even be a good idea, since IMHO udev is "only" there to load modules and set up devicefiles, not necessarily configure the devices.
2. Use a pre-mount script to up interfaces. dracut could provide a simple script for simple cases which can be overridden with site specific craziness.
3. A simple mount.nfs would be enough in /mount/
What do you think?
Regards,
Philippe
--
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