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

(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.

(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

# Copyright (C) 2006
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
. /etc/

failsafe_ip() {
    ifconfig $ifname netmask broadcast up

failsafe() {
    [ -n "$ifname" ] && grep "$ifname" /proc/net/dev >/dev/null && {
        netmsg "Entering Failsafe!"
        telnetd -l /bin/ <> /dev/null 2>&1
    lock /tmp/.failsafe
    ash --login

mount_usb() {

        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

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/ --set-rules-file /etc/hotplug2-init.rules --no-persistent --set-coldplug-cmd /sbin/udevtrigger
    /sbin/hotplug2 --set-worker /lib/hotplug2/ --set-rules-file /etc/hotplug2-init.rules --persistent &

elif [ -x /sbin/udevd ]; then
    mount -n -t tmpfs -o mode=0755 udev /dev
    /sbin/udevd --daemon

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 && {

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
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

    echo "- init -"
    exec /sbin/init

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.