Browse Source

netroot: add common handler for network root devices

/sbin/netroot is a jumping off point to allow various network
root devices to share infrastructure. It will loop over scriptlets
in the netroot handler, looking for a handler to run for this type
of netroot. Handlers can do choose to act based on command line
options to the kernel, or via DHCP options received on this interface.
They should massage root= into a form suitable for their handler.
master
David Dillow 16 years ago
parent
commit
7d7efa4a3d
  1. 2
      dracut
  2. 1
      modules.d/40network/60-net.rules
  3. 14
      modules.d/40network/dhcp-fallback.sh
  4. 8
      modules.d/40network/ifup
  5. 2
      modules.d/40network/install
  6. 52
      modules.d/40network/netroot
  7. 11
      modules.d/99base/init

2
dracut

@ -96,7 +96,7 @@ if [[ -f $outfile && ! $force ]]; then
exit 1 exit 1
fi fi


hookdirs="cmdline pre-udev pre-mount pre-pivot mount emergency" hookdirs="cmdline pre-udev netroot pre-mount pre-pivot mount emergency"


readonly initdir=$(mktemp -d -t initramfs.XXXXXX) readonly initdir=$(mktemp -d -t initramfs.XXXXXX)
trap 'rm -rf "$initdir"' 0 # clean up after ourselves no matter how we die. trap 'rm -rf "$initdir"' 0 # clean up after ourselves no matter how we die.

1
modules.d/40network/60-net.rules

@ -1 +1,2 @@
ACTION=="add", SUBSYSTEM=="net", RUN+="/sbin/ifup $env{INTERFACE}" ACTION=="add", SUBSYSTEM=="net", RUN+="/sbin/ifup $env{INTERFACE}"
ACTION=="online", SUBSYSTEM=="net", RUN+="/sbin/netroot $env{INTERFACE}"

14
modules.d/40network/dhcp-fallback.sh

@ -0,0 +1,14 @@
# We should go last, and default the root if needed

if [ -z "$root" ]; then
root=dhcp
fi

if [ "$root" = "dhcp" -a -z "$netroot" ]; then
rootok=1
netroot=dhcp
fi

if [ "${netroot+set}" = "set" ]; then
eval "echo netroot='$netroot'" > /tmp/netroot.info
fi

8
modules.d/40network/ifup

@ -12,8 +12,10 @@ getarg rdnetdebug && {


netif=$1 netif=$1


# bail immediatly if the interface is already up # bail immediately if the interface is already up
# or we don't need the network
[ -f "/tmp/net.$netif.up" ] && exit 0 [ -f "/tmp/net.$netif.up" ] && exit 0
[ ! -f /tmp/netroot.info ] && exit 0


# loopback is always handled the same way # loopback is always handled the same way
[ "$netif" = "lo" ] && { [ "$netif" = "lo" ] && {
@ -93,10 +95,8 @@ ip_to_var() {
[ -n "$autoconf" ] || autoconf=off [ -n "$autoconf" ] || autoconf=off
} }


root=$(getarg root)
ip=$(getarg ip) ip=$(getarg ip)

if [ -z "$ip" ]; then
if [ "$root" = "dhcp" -a -z "$ip" ]; then
do_dhcp; do_dhcp;
else else
# spin through the kernel command line, looking for ip= lines # spin through the kernel command line, looking for ip= lines

2
modules.d/40network/install

@ -2,8 +2,10 @@
dracut_install ip dhclient hostname dracut_install ip dhclient hostname
instmods =net instmods =net
inst "$moddir/ifup" "/sbin/ifup" inst "$moddir/ifup" "/sbin/ifup"
inst "$moddir/netroot" "/sbin/netroot"
inst "$moddir/dhclient-script" "/sbin/dhclient-script" inst "$moddir/dhclient-script" "/sbin/dhclient-script"
instmods =networking ecb arc4 instmods =networking ecb arc4
inst_rules "$moddir/60-net.rules" inst_rules "$moddir/60-net.rules"
inst_hook cmdline 99 "$moddir/dhcp-fallback.sh"
inst_hook pre-pivot 10 "$moddir/kill-dhclient.sh" inst_hook pre-pivot 10 "$moddir/kill-dhclient.sh"
mkdir -p "${initdir}/var/run" mkdir -p "${initdir}/var/run"

52
modules.d/40network/netroot

@ -0,0 +1,52 @@
#!/bin/sh

. /lib/dracut-lib

getarg rdnetdebug && {
exec >/tmp/netroot.$1.$$.out
exec 2>>/tmp/netroot.$1.$$.out
set -x
}

# Only try to configure from one network interface at a time
#
[ "$NETROOT_LOCKED" ] || {
NETROOT_LOCKED=true
export NETROOT_LOCKED
exec flock -xo /tmp/netroot.lock -c "$0 $*"
exit 1
}

netif=$1

# If we've already found a root, or we don't have the info we need,
# then no point in looking further
#
[ -e /tmp/netroot.done ] && exit 0
[ -s /tmp/netroot.info -a -s /tmp/root.info ] || exit 0

# Pick up our config from the command line; we may already know the
# handler to run
#
. /tmp/root.info
. /tmp/netroot.info
[ -e /tmp/net.$netif.dhcpopts ] && . /tmp/net.$netif.dhcpopts

# Now, let the installed network root handlers figure this out
#
source_all netroot

# If we didn't get a handler set, then we're done
#
if [ -z "$handler" ]; then
# XXX informative error message?
exit 0
fi

# Run the handler; don't store the root, it may change from device to device
# XXX other variables to export?
export NEWROOT
if $handler $netif $root; then
>/tmp/netroot.done
fi
exit 0

11
modules.d/99base/init

@ -47,12 +47,21 @@ fi


if [ -z "${root%%error:*}" ]; then if [ -z "${root%%error:*}" ]; then
case "${root%%:*}" in case "${root%%:*}" in
'') echo "FATAL: no root= option specified" ;; '') echo "FATAL: no root= option specified, and no network support" ;;
error) echo "FATAL: ${root#error:}" ;; error) echo "FATAL: ${root#error:}" ;;
esac esac
emergency_shell emergency_shell
fi fi


# Network root scripts may need updated root= options,
# so deposit them where they can see them (udev purges the env)
{
echo "root='$root'"
echo "rflags='$rflags'"
echo "fstype='$fstype'"
echo "NEWROOT='$NEWROOT'"
} > /tmp/root.info

# pre-udev scripts run before udev starts, and are run only once. # pre-udev scripts run before udev starts, and are run only once.
getarg 'rdbreak=pre-udev' && emergency_shell getarg 'rdbreak=pre-udev' && emergency_shell
source_all pre-udev source_all pre-udev

Loading…
Cancel
Save