Hi
I have a working boot from usb stick for kamikaze
This is the preinit is use (/etc/preinit)
#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
. /etc/diag.sh
failsafe_ip() {
ifconfig $ifname 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up
}
failsafe() {
[ -n "$ifname" ] && grep "$ifname" /proc/net/dev >/dev/null && {
failsafe_ip
netmsg 192.168.1.255 "Entering Failsafe!"
telnetd -l /bin/login <> /dev/null 2>&1
}
lock /tmp/.failsafe
ash --login
}
mount none /proc -t proc
mount none /sys -t sysfs
size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)<l)?mt-l:s}' /proc/meminfo)
mount none /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777
if grep devfs /proc/filesystems > /dev/null; then
mount none /dev -t devfs
M0=/dev/pty/m0
M1=/dev/pty/m1
HOTPLUG=/sbin/hotplug-call
else
mount -t tmpfs tmpfs /dev -o size=512K
mknod /dev/console c 5 1
mkdir /dev/shm
/sbin/hotplug2 --coldplug --set-rules-file /etc/hotplug2-init.rules
/sbin/hotplug2 --no-coldplug --persistent --set-rules-file /etc/hotplug2-init.rules &
M0=/dev/ptmx
M1=/dev/ptmx
HOTPLUG=
fi
mkdir -p /dev/pts /dev/shm
mount none /dev/pts -t devpts
# the shell really doesn't like having stdin/out closed
# that's why we use /dev/pty/m0 and m1 as replacement
# for /dev/console if there's no serial console available
dd if=/dev/console of=/dev/null bs=1 count=0 >/dev/null 2>/dev/null && {
M0=/dev/console
M1=/dev/console
}
exec <$M0 >$M1 2>&0
echo "- preinit -"
trap 'FAILSAFE=true' USR1
[ -e /etc/preinit.arch ] && . /etc/preinit.arch
set_state preinit
echo "$HOTPLUG" > /proc/sys/kernel/hotplug
eval ${FAILSAFE:+failsafe}
lock -w /tmp/.failsafe
{
if [ -e /etc/preinit.usbboot ]
then
echo "- found usbboot -"
/etc/preinit.usbboot || mount_root
else
echo "- no usbboot -"
mount_root
fi
} 2>&1 | tee /tmp/preinit.log
[ -f /sysupgrade.tgz ] && {
echo "- config restore -"
cd /
mv sysupgrade.tgz /tmp
tar xzf /tmp/sysupgrade.tgz
rm -f /tmp/sysupgrade.tgz
sync
}
echo "- init -"
killall hotplug2
exec /sbin/init
This is a patch against trunk 8837(it has been a while since I have looked at this)
Index: package/base-files/files/etc/preinit
===================================================================
--- package/base-files/files/etc/preinit (revision 8837)
+++ package/base-files/files/etc/preinit (working copy)
@@ -59,7 +59,17 @@
echo "$HOTPLUG" > /proc/sys/kernel/hotplug
eval ${FAILSAFE:+failsafe}
lock -w /tmp/.failsafe
-mount_root
+{
+ if [ -e /etc/preinit.usbboot ]
+ then
+ echo "- found usbboot -"
+ /etc/preinit.usbboot || mount_root
+ else
+ echo "- no usbboot -"
+ mount_root
+ fi
+} 2>&1 | tee /tmp/preinit.log
+
[ -f /sysupgrade.tgz ] && {
echo "- config restore -"
cd /
This is the /etc/preinit.usb
#!/bin/sh
echo "- rc=1 -"
rc=1
# Boot usb stick
echo "- hotplug call -"
/sbin/hotplug2 --persistent --coldplug --max-children 1 &
H=$!
#echo "/sbin/hotplug-call usb"> /proc/sys/kernel/hotplug
echo "- Load modules -"
for module in usbcore usb-ohci ehci-hcd uhci-hcd scsi_mod sd_mod usb-storage jbd ext3 ext2
do
{
insmod $module
}
done
# Wait for this to settle
echo "- sleep -"
sleep 40s
# Does The drive Exist
echo "- is /dev/sda1 there -"
if [ -e /dev/sda1 ]
then
echo "- yes -"
# Can we mount it
if mount -o rw,noatime /dev/sda1 /mnt
then
echo "- mounted -"
# Is there a usb.boot file and an executable /mnt/sbin/init file
if [ -e /mnt/.usb.boot ] && [ -x /mnt/sbin/init ]
then
echo "- Files exist about to pivot -"
mount -o move /proc /mnt/proc && \
pivot_root /mnt /mnt/rom && {
mount -o move /rom/sys /sys
mount -o move /rom/tmp /tmp
mount -o move /rom/dev /dev
mount -o move /rom/dev/pts /dev/pts
echo "- pivot successful -"
rc=0
}
else
echo "- files not there ! -"
# files doesn't exist umount drive
umount /mnt
fi
fi
fi
kill $H
echo "- return -"
set +x
return $rc
These files have to be compiled into the image that you flash onto the device.
it checks for the existence of .usb.boot on the file system if it doesn't exist it just does a normal boot.
it doesn't rely upon any nvram setting, it does start up udev, this is the problem you need udev to find the device at the preinit stage.
I haven't tried this with 2.4 kernel. Waiting till the open broadcom driver settles a bit for my next attempt with 2.6
Alex