Autore Topic: openwrt x86 boot da usb  (Letto 995 volte)

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
openwrt x86 boot da usb
« il: Gennaio 11, 2011, 07:11:54 pm »
 :evil: :evil: 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 :-D

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. :-D

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:
Codice: [Seleziona]
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)

Codice: [Seleziona]
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:
Codice: [Seleziona]
mkdir /tmp/rootfs
mount /dev/sdb2 /tmp/rootfs

Quindi creiamo l'initrd.gz digitando da shell
Codice: [Seleziona]
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?:
Codice: [Seleziona]
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
Codice: [Seleziona]
console=ttyS0,38400n8

Incrociate le dita... fate un reboot e godete :-D o imprecate e ricominciate  :cry:
? tutto!! :-D :-D :-D
« Ultima modifica: Gennaio 11, 2011, 07:17:14 pm da truthahn »

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: openwrt x86 boot da usb
« Risposta #1 il: Febbraio 02, 2011, 03:33:39 pm »
Ho creato uno script unico per fare tutto... si inserisce la key con openwrt per x86 caricato, si verifica il device riconosciuto... esempio /dev/sdb1 e /dev/sdb2 e quindi si da il comando

Codice: [Seleziona]
creainitrd.sh sdb

lo script verifica il kernel, crea l'initrd.gz, lo sposta sulla key al posto giusto e cambia il menu.lst del grub.

Il file evidentemente dev'essere reso eseguibile e lanciato da root.

creainitrd.sh