Ci son morto a forza di prove, ricerche poco fruttuose e mille reboot del mio povero laptop che forse alla fine ha deciso di fare il boot da tanto era sfinito
I passi:
compilare openwrt nel seguente modo..
nelle opzioni del kernel (make kernel_menuconfig) abilitare:
Support for Host-side USB
USB Mass Storage support
Second extended fs support
Ext3 journalling file system support
The Extended 4 (ext4) filesystem
nel "make menuconfig" (includendoli *)
block-mount
kmod-fs-ext3
kmod-fs-ext2
kmod-usb-core
kmod-usb-ohci
kmod-usb2
kmod-usb-storage
block-hotplug
block-extroot
fdisk
e2fsprogs
oltre al resto che decidete naturalmente.
Copiate con il solito sistema l'immagine su una usb key
dd if=lavostraimmagine.image of=/dev/sdb (/dev/sdb naturalmente dev'essere adattata)
questo creer? sulla key due partizioni, esempio
sdb1 che conterr? il boot con grub
sdb2 con il filesystem
Bene. Togliete e levate la key che si automonter?.
Ora create initrd.gz , la ramdisk indispensabile per andare a montare la key.
Questo file dovr? contenere le librerie e i moduli adatti, quindi:
create /bin/creainitrd1 e incollateci dentro il seguente script che ho adattato da Djarvur group:
rm -rf /tmp/initrd
mkdir -p /tmp/initrd
copy_link_with_base()
{
test -L "$1/$2" &&
{
local basefile="`readlink "$1/$2"`"
local filedir="`dirname "$2"`"
local dstdir="`dirname "$3/$filedir/$basefile"`"
mkdir -pv "$dstdir"
test -e "$3/$filedir/$basefile" ||
cp -av "$1/$filedir/$basefile" "$3/$filedir/$basefile"
}
local dstdir="`dirname "$3/$2"`"
mkdir -pv "$dstdir"
cp -av "$1/$2" "$3/$2"
}
copy_loop()
{
while read fileName
do
copy_link_with_base "$1" "$fileName" "$2"
done
}
copy_loop /tmp/rootfs /tmp/initrd <<EOF
/bin/ash
/bin/mount
/bin/umount
/bin/grep
/sbin/udevd
/sbin/udevtrigger
/lib/libcrypt.so.0
/lib/libm.so.0
/lib/libc.so.0
/lib/ld-uClibc.so.0
/lib/libgcc_s.so.1
/lib/libpthread.so.0
/lib/modules/2.6.32.27/uhci-hcd.ko
/lib/modules/2.6.32.27/ehci-hcd.ko
/lib/modules/2.6.32.27/ohci-hcd.ko
/sbin/insmod
/bin/sleep
/usr/bin/killall
/bin/cat
/sbin/switch_root
/usr/sbin/e2fsck
/usr/lib/libext2fs.so.2
/usr/lib/libcom_err.so.2
/usr/lib/libblkid.so.1
/usr/lib/libuuid.so.1
/usr/lib/libe2p.so.2
EOF
xargs -I% mkdir -vp /tmp/initrd/% <<EOF
/proc/
/sys/
/dev/
/real_root/
EOF
naturalmente modificate /lib/modules/2.6.32.27 con il vostro kernel
create /bin/creainitrd2 e incollateci dentro (sempre adattato da Djarvur group)
cat <<EOF > /tmp/initrd/init
#!/bin/ash -u
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
mount proc /proc -t proc
mount sysfs /sys -t sysfs
mount udev /dev -t tmpfs -o mode=0755
udevd --daemon
udevtrigger
udevsettle
for module in usbcore scsi_mod sd_mod usb-storage uhci-hcd ohci-hcd ehci-hcd
do insmod \$module; done
root=''
init='/init'
for param in \`cat /proc/cmdline\` none
do
echo "\$param" | grep -q '=' || continue
eval "\$param"
done
do_fsck()
{
e2fsck -p "\$1" ||
e2fsck "\$1"
}
umount_all()
{
killall -KILL udevd &&
umount -f /dev &&
umount -f /sys &&
umount -f /proc
}
test -n "\$root" &&
{
echo -n "Looking for the root fs device '\$root'"
while ! test -b "\$root"; do echo -n '.'; /bin/sleep 1s; done
echo 'found'
do_fsck "\$root" &&
mount "\$root" /real_root &&
umount_all &&
exec switch_root /real_root "\$init"
} ||
exec /bin/ash --login
EOF
chmod +x /tmp/initrd/init
pushd /tmp/initrd &&
find . -print|cpio -ov -H newc|gzip -9 -c > /tmp/initrd.gz &&
popd
Rendeteli eseguibili.
Ora montate il file system in /tmp/rootfs:
mkdir /tmp/rootfs
mount /dev/sdb2 /tmp/rootfs
Quindi creiamo l'initrd.gz digitando da shell
creainitrd1
creainitrd1
se tutto ? andato bene troverete l'initrd.gz in /tmp
Ora andiamo a modificare Grub.
copiate l'initrd.gz in /dev/sdb1 (o quello che ?) dove si trova la catella "boot" dentro alla stessa cartella dove ? gi? presente il kernel (vmlinuz);
entrate nella cartella "grub" dove ? presente il file menu.lst e modificatelo cos?:
serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1
terminal --timeout=2 console serial
default 0
timeout 5
title OpenWrt
root (hd0,0)
kernel /boot/vmlinuz root=/dev/sda2 init=/etc/preinit rootfstype=ext2 rootwait console=tty0 reboot=bios
initrd /boot/initrd.gz
boot
title OpenWrt (failsafe)
root (hd0,0)
kernel /boot/vmlinuz failsafe=true root=/dev/sda2 init=rootf stype=ext2 rootwait console=tty0 reboot=bios
boot
se avete anche una porta seriale potete passare anche
console=ttyS0,38400n8
Incrociate le dita... fate un reboot e godete
o imprecate e ricominciate
? tutto!!