OpenWrt Forum Archive

Topic: Need help/info for Router-Setup with EXT3 on USB for packages/programs

The content of this topic has been archived on 23 Jan 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

I want to use an USB-Stick (~4GB) for all the packages and programs on my router (USB 2.0 on LinkSys WRT350N v2, = Target Marvell Orion).
Due to being a Linux beginner I don't have the right idea how to do it correctly or how to start.
Therefore I need your help, ideas, whatever...

Config and main functionality (LAN, WLAN, DHCP, DNS, NPD, SSH, OpenVPN, DynDNS) should reside in Flash (squash/jffs), while others (Luci full, FTP, Samba) should be on the USB-Stick.
Goal is to have a running router without USB, and enhanced functionality with USB stick plugged in.

How to use SquashFS, JFFS and USB/EXT3 as overlays without hassle?
Which packages to include in Kernel image and/or JFFS? (general and router specific)
Start without USB first, do all the setup, then setup USB and additional functionality? Or is there a better way to do it?
Are there other similar setups useful?

Kind regards
Maddes

(Last edited by maddes.b on 24 May 2009, 01:47)

I have actually done this by using the pivot_root command. Basically you start the router from flash and once usb is loaded it will switch to a rootfs on the USB drive.

The script i used would check if the USB device existed and if it is boot-able. This means that if there is no usb drive the router will still boot with basic functionality.

Once i get back home i will reconnect my wrt350 and see if i can still find the scripts i used for it.

EDIT: I used the preinit script in this post as a starting point. http://forum.openwrt.org/viewtopic.php?pid=63032#p63032

(Last edited by Mavy on 8 Jul 2009, 10:38)

This is the preinit i have used to switch to the root on the usb stick

#!/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.sh <> /dev/null 2>&1
    }
    lock /tmp/.failsafe
    ash --login
}

mount_usb() {
        boot_dev="/dev/sda2"
        mount_point="/mnt"

        echo "# Loading modules for usb"
        insmod usbcore
        insmod ehci-hcd
        insmod scsi_mod
        insmod sd_mod
        insmod jbd
        insmod ext2
        insmod ext3
        insmod usb-storage

        echo "# Waiting for devices to come up"
        sleep 10

        [ -e $boot_dev ] || {
          echo "$boot_dev NOT found"
          return 1
        }
        echo "# $boot_dev found"

        mount -o rw $boot_dev $mount_point || {
          echo "mount $boot_dev $mount_point failed"
          return 1
        }
        echo "# $boot_dev mounted on $mount_point"

        [ -e $mount_point/usb.boot ] || {
          echo "Missing file /usb.boot on media - NOT bootable, umounting."
          umount $mount_point
          return 1
        }
        echo "# Medium seems to be bootable"

        mount -o move /proc $mount_point/proc && \
          pivot_root $mount_point $mount_point/rom && {
            mount -o move /rom/dev /dev
            mount -o move /rom/sys /sys
            mount -o move /rom/tmp /tmp
          }
        echo "# Changed root to USB medium"

        return 0
}

mount proc /proc -t proc
mount sysfs /sys -t sysfs

size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)<l)&&(mt>l)?mt-l:s}' /proc/meminfo)
mount tmpfs /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777

if grep devfs /proc/filesystems > /dev/null; then
    mount devfs /dev -t devfs
    M0=/dev/pty/m0
    M1=/dev/pty/m1
    HOTPLUG=/sbin/hotplug-call

elif [ -x /sbin/hotplug2 ]; then
    mount -t tmpfs tmpfs /dev -o size=512K
    mknod /dev/console c 5 1
    /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --no-persistent --set-coldplug-cmd /sbin/udevtrigger
    /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --persistent &
    M0=/dev/ptmx
    M1=/dev/ptmx
    HOTPLUG=

elif [ -x /sbin/udevd ]; then
    mount -n -t tmpfs -o mode=0755 udev /dev
    /sbin/udevd --daemon
    /sbin/udevtrigger
    /sbin/udevsettle
    M0=/dev/pty/ptmx
    M1=/dev/pty/ptmx
    HOTPLUG=
fi

mkdir -p /dev/pts /dev/shm
mount devpts /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 -"
echo "Press CTRL-C for failsafe"
trap 'FAILSAFE=true' INT
trap 'FAILSAFE=true' USR1
[ -e /etc/preinit.arch ] && . /etc/preinit.arch
set_state preinit
echo "$HOTPLUG" > /proc/sys/kernel/hotplug
export FAILSAFE
eval ${FAILSAFE:+failsafe}
lock -w /tmp/.failsafe

if [ -z "$INITRAMFS" ]; then
    mount_usb || mount_root
    [ -f /sysupgrade.tgz ] && {
        echo "- config restore -"
        cd /
        mv sysupgrade.tgz /tmp
        tar xzf /tmp/sysupgrade.tgz
        rm -f /tmp/sysupgrade.tgz
        sync
    }

    echo "- init -"
    
    exec /sbin/init
fi

It requires a ext2 or ext3 partition on a usb stick.
I used the tgz file which contains the rootfs and extracted it to the usb stick.
I then had to manually create the /rom folder on the usb stick aswell as the /rom/dev, /rom/sys and /rom/tmp folders.

To boot from the usb stick create a empty file called usb.boot in the root of the usb stick and your good to go.

The discussion might have continued from here.