Fixes [BUGID #693] The init-live.sh script starts udevd in init-live.sh:early_setup(), but doesn't account for the possibility that the root device may have already been registered by the kernel before udevd starts up. If the device is detected after udevd starts up, everything's fine - udevd gets the 'add' uevent for the device, the root image shows up at e.g. /media/sda/rootfs.img, and the boot continues. If however the device is detected before udevd starts up, udevd misses the 'add' uevent and the root image never shows up, causing it to stay in the 'waiting for removable media' loop forever. The 'udevadm trigger' command is meant to be used to avoid this situation, but init-live.sh doesn't use it. Furthermore, since the default was changed in udev 152 from 'add' to 'change', the command needs to explicity name 'add' as the action. Signed-off-by: Tom Zanussi <tom.zanussi@intel.com>
94 lines
1.7 KiB
Bash
94 lines
1.7 KiB
Bash
#!/bin/sh
|
|
|
|
ROOT_MOUNT="/rootfs/"
|
|
ROOT_IMAGE=rootfs.img
|
|
MOUNT="/bin/mount"
|
|
UMOUNT="/bin/umount"
|
|
|
|
early_setup() {
|
|
mkdir /proc
|
|
mkdir /sys
|
|
mount -t proc proc /proc
|
|
mount -t sysfs sysfs /sys
|
|
udevd --daemon
|
|
/sbin/udevadm trigger --action=add
|
|
}
|
|
|
|
read_args() {
|
|
[ -z "$CMDLINE" ] && CMDLINE=`cat /proc/cmdline`
|
|
for arg in $CMDLINE; do
|
|
optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'`
|
|
case $arg in
|
|
root=*)
|
|
ROOT_DEVICE=$optarg ;;
|
|
rootfstype=*)
|
|
ROOT_FSTYPE=$optarg ;;
|
|
rootdelay=*)
|
|
rootdelay=$optarg ;;
|
|
LABEL=*)
|
|
label=$optarg ;;
|
|
video=*)
|
|
video_mode=$arg ;;
|
|
vga=*)
|
|
vga_mode=$arg ;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
boot_live_root() {
|
|
killall udevd
|
|
cd $ROOT_MOUNT
|
|
exec switch_root -c /dev/console $ROOT_MOUNT /sbin/init
|
|
}
|
|
|
|
fatal() {
|
|
echo $1 >$CONSOLE
|
|
echo >$CONSOLE
|
|
exec sh
|
|
}
|
|
|
|
early_setup
|
|
|
|
[ -z "$CONSOLE" ] && CONSOLE="/dev/console"
|
|
|
|
read_args
|
|
|
|
echo "Waiting for removable media..."
|
|
while true
|
|
do
|
|
for i in `ls /media 2>/dev/null`; do
|
|
if [ -f /media/$i/$ROOT_IMAGE ] ; then
|
|
found="yes"
|
|
break
|
|
fi
|
|
done
|
|
if [ "$found" = "yes" ]; then
|
|
break;
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
case $label in
|
|
boot)
|
|
mkdir $ROOT_MOUNT
|
|
mknod /dev/loop0 b 7 0
|
|
|
|
if ! $MOUNT -o rw,loop,noatime,nodiratime /media/$i/$ROOT_IMAGE $ROOT_MOUNT ; then
|
|
fatal "Couldnt mount rootfs image"
|
|
else
|
|
boot_live_root
|
|
fi
|
|
;;
|
|
install)
|
|
if [ -f /media/$i/$ROOT_IMAGE ] ; then
|
|
./install.sh $i $ROOT_IMAGE $video_mode $vga_mode
|
|
else
|
|
fatal "Couldnt find install script"
|
|
fi
|
|
|
|
# If we're getting here, we failed...
|
|
fatal "Installation image failed"
|
|
;;
|
|
esac
|
|
|