Package: live-initramfs Version: 1.173.1-1 Severity: wishlist Hello,
when select_eth_device is run before udevadm settle has been run, it will not find any devices, which will lead to a kernel panic when ipconfig is run in scripts/live. Normally udevadm settle is run by scripts/init-premount/udev, but the udev package from Ubuntu does not do so. The attached patch adds udevadm calls to select_eth_device and also fixes some indentation inconsistencies. Set severity to whishlist as it is quite unusual to use udev from Ubuntu in Debian, but I think it is useful to ensure udevadm settle has been called. I'd also like to point out that this may be a timing issue, so it may be hard to reproduce. Thanks, Andreas -- System Information: Debian Release: 5.0.4 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.26-2-amd64 (SMP w/2 CPU cores) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash
diff --git a/scripts/init-premount/select_eth_device b/scripts/init-premount/select_eth_device index 6ab8bfe..4323880 100755 --- a/scripts/init-premount/select_eth_device +++ b/scripts/init-premount/select_eth_device @@ -3,8 +3,6 @@ # Original script by Andreas Teuchert <ant...@hsg-kl.de> # Modified by Frédéric Boiteux <fboit...@calistel.com> - - PREREQ="blacklist udev" prereqs() @@ -25,16 +23,28 @@ bootconf=$(egrep '^BOOT=' /conf/initramfs.conf | tail -1) # can be superseded by command line (used by Debian-Live's netboot for example) for ARGUMENT in $(cat /proc/cmdline); do - case "${ARGUMENT}" in - netboot=*) - NETBOOT="${ARGUMENT#netboot=}" - ;; - esac + case "${ARGUMENT}" in + netboot=*) + NETBOOT="${ARGUMENT#netboot=}" + ;; + esac done if [ "$bootconf" != "BOOT=nfs" ] && [ "$NETBOOT" = "" ]; then - # Not a net boot : nothing to do - exit 0 + # Not a net boot : nothing to do + exit 0 +fi + +# be sure this has been run (*should* be done by scripts/init-premount/udev) +if [ -x /sbin/udevadm ] +then + # lenny + udevadm trigger + udevadm settle +else + # etch + udevtrigger + udevsettle fi # we want to do some basic IP @@ -44,34 +54,35 @@ modprobe -q af_packet l_interfaces=$(cd /sys/class/net/ && ls -d eth* 2>/dev/null) if [ $(echo $l_interfaces | wc -w) -lt 2 ]; then - # only one interface : no choice - echo "DEVICE=$l_interfaces" >> /conf/param.conf - exit 0 + # only one interface : no choice + echo "DEVICE=$l_interfaces" >> /conf/param.conf + exit 0 fi while true; do - echo -n "Looking for a connected Ethernet interface ..." + echo -n "Looking for a connected Ethernet interface ..." for interface in $l_interfaces; do # ATTR{carrier} is not set if this is not done - echo -n " $interface ?" + echo -n " $interface ?" ipconfig -c none -d $interface -t 1 >/dev/null 2>&1 - done - echo '' + done + + echo '' - for step in 1 2 3 4 5; do - for interface in $l_interfaces; do - carrier=$(cat /sys/class/net/$interface/carrier \ - 2>/dev/null) - # link detected - if [ "$carrier" = 1 ]; then - echo " found $interface." - # inform initrd's init script : - echo "DEVICE=$interface" >> /conf/param.conf - exit 0 - fi - done - # wait a bit - sleep 1 - done + for step in 1 2 3 4 5; do + for interface in $l_interfaces; do + carrier=$(cat /sys/class/net/$interface/carrier \ + 2>/dev/null) + # link detected + if [ "$carrier" = 1 ]; then + echo " found $interface." + # inform initrd's init script : + echo "DEVICE=$interface" >> /conf/param.conf + exit 0 + fi + done + # wait a bit + sleep 1 + done done
signature.asc
Description: Digital signature