DD-WRT:Mounting USB drive without located onboard fs modules

Problem description
Fact is: not all dd-wrt images include well-known filesystems support (vfat, ext2, ext3, ntfs) because of lack of router's EEPROM memory to store them. If on Supported Devices page your board has 4MB of Flash or less, there is no modules for common filesystems support on it. Although in web-interface you see option to enable ext3/ext2 support - it doesn't really work because of absence of these kernel modules files. It's very sad if you were going to extend router by external USB drive and use router for running Optware] or to use it as fileserver. But there is one trick to mount your drive on it!

Note: This is extention of gouryella's way (taken from http://www.dd-wrt.com/phpBB2/viewtopic.php?p=454647#454647), also by calvin18 and others of the community. Gouryella wrote a smart script that downloads the ext3 driver and mounts the 1st partition to /opt during boot (after WAN is up). This method is described here, but I think, this is not good way because result of getting script from internet depends on a lot of things. The most convenient storage for this on USB-flash itself, and the absence of fs drivers isn't a problem!

Solution
Proper way is to enable USB Support under Services - first Core USB Support USB 2.0 Support USB Storage Support Automatic Drive Mount , and on boot your USB-drive will become accessible via /dev filesystem

It's impossible to mount filesystem, but it's accessible as block device, and this is core idea to store modules on micro-sized dedicated partition linearly, without mounting it.

Building / finding suitable kernel modules
You should have your set of kernel modules as .ko files (for your architecture and kernel version). You can use precompiled ones, or build them on your own. I used precompiled, and this works fine for me (kernel 2.6.23.17, mips32r2).

Preparing USB stick/ USB HDD as modules storage
USB drive should be partitioned into 2 parts: huge partition for main storage space (to format to filesystem) and little one (just some megabytes, not for formatting) to place tar'ed modules archive linearly.

I've prepared flash stick on Linux PC. Just inserted flash has sdb identifier [11500.435285] sd 6:0:0:0: [sdb] Attached SCSI removable disk

It's mounted automatically, you should unmount it to break into parts then root@ubuntu:~# umount /dev/sdb

Run fdisk utility with USB flash device as argument root@ubuntu:~# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recommended to         switch off the mode (command 'c') and change display units to          sectors (command 'u'). Entering command "p" prints out partition table. You should delete all of them if you want to make partitions from scratch. But it isn't requirement. Anyway you should have at least two partitions: big for formatting and little one for system reasons Command (m for help): p Disk /dev/sdb: 15.1 GB, 15103688704 bytes 64 heads, 32 sectors/track, 14404 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x6f20736b

This doesn't look like a partition table Probably you selected the wrong device.

Device Boot     Start         End      Blocks   Id  System /dev/sdb1  ? 379950     937327   570754815+  72  Unknown Partition 1 does not end on cylinder boundary. /dev/sdb2  ? 82368    1027695   968014120   65  Novell Netware 386 Partition 2 does not end on cylinder boundary. /dev/sdb3  ? 913029    1858355   968014096   79  Unknown Partition 3 does not end on cylinder boundary. /dev/sdb4  ? 1409025    1409052       27749+   d  Unknown Partition 4 does not end on cylinder boundary. Partition table entries are not in disk order

I had some mess on flash and going to remove all partitions and create new ones. Deleting is "d" command

Command (m for help): d Partition number (1-4): 1 Command (m for help): d Partition number (1-4): 2 Command (m for help): d Partition number (1-4): 3 Command (m for help): d Selected partition 4

I've got a clean flash (filesystem isn't written to disk yet until "w" entered)

Command (m for help): p Disk /dev/sdb: 15.1 GB, 15103688704 bytes 64 heads, 32 sectors/track, 14404 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x6f20736b Device Boot     Start         End      Blocks   Id  System Command (m for help): u Changing display/entry units to sectors Creating pair of partitions - primary number 1 started from default sector and with end at sector DEFAULT(LAST) - some megabytes/512 bytes per sector: Command (m for help): n Command action e  extended p  primary partition (1-4) p Partition number (1-4): 1 First sector (32-29499391, default 32): Using default value 32 Last sector, +sectors or +size{K,M,G} (32-29499391, default 29499391): 29444000

And second partition with default start (just space after 1st partition) and ending at the end of the disk Command (m for help): n Command action e  extended p  primary partition (1-4) p Partition number (1-4): 2 First sector (29444001-29499391, default 29444001): Using default value 29444001 Last sector, +sectors or +size{K,M,G} (29444001-29499391, default 29499391): Using default value 29499391

Print result of repartitioning: p command Command (m for help): p Disk /dev/sdb: 15.1 GB, 15103688704 bytes 64 heads, 32 sectors/track, 14404 cylinders, total 29499392 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x6f20736b Device Boot     Start         End      Blocks   Id  System /dev/sdb1             32    29444000    14721984+  83  Linux /dev/sdb2       29444001    29499391       27695+  83  Linux If all is ok - commit changes Command (m for help): w The partition table has been altered!

Calling ioctl to re-read partition table. Syncing disks.

Format large partition to ext3 root@ubuntu:~# mkfs.ext3 /dev/sdb1 mke2fs 1.41.14 (22-Dec-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 920272 inodes, 3680496 blocks 184024 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=3770679296 113 block groups 32768 blocks per group, 32768 fragments per group 8144 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 36 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

Filling second partition with binary zeros root@ubuntu:~# dd if=/dev/zero of=/dev/sdb2 dd: writing to `/dev/sdb2': No space left on device 55392+0 records in 55391+0 records out 28360192 bytes (28 MB) copied, 6.49572 s, 4.4 MB/s root@ubuntu:~# After that get archive and copy it block-by-block over little partition root@ubuntu:~# wget http://home.karneval.cz/10102207/fs.gz --2011-08-18 18:24:46-- http://home.karneval.cz/10102207/fs.gz Resolving home.karneval.cz... 80.109.240.73 Connecting to home.karneval.cz|80.109.240.73|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 166663 (163K) [application/x-gzip] Saving to: `fs.gz' 100%[=================================>] 166,663     422K/s   in 0.4s 2011-08-18 18:24:47 (422 KB/s) - `fs.gz' saved [166663/166663] root@ubuntu:~# dd if=fs.gz of=/dev/sdb2 325+1 records in 325+1 records out 166663 bytes (167 kB) copied, 0.0163577 s, 10.2 MB/s

Try to get files directly from disk - it works pretty well. root@ubuntu:~# cd /tmp root@ubuntu:/tmp# tar -zvxf /dev/sdb2 ext3 ext3.ko fat fat.ko fuse.ko jbd.ko mbcache.ko nls_cp437.ko nls_iso8859-1.ko nls_iso8859-2.ko nls_utf8.ko vfat.ko root@ubuntu:/tmp#

Now eject USB drive from PC - it's ready for mounting on dd-wrt board.

Startup script on box for mounting
After plugging USB device into box, new drive should appear in dmesg listing

root@dir-620:~# dmesg ... <6>usb 1-1: new high speed USB device using dwc_otg and address 2 <6>usb 1-1: configuration #1 chosen from 1 choice <6>scsi0 : SCSI emulation for USB Mass Storage devices <7>usb-storage: device found at 2 <7>usb-storage: waiting for device to settle before scanning <5>scsi 0:0:0:0: Direct-Access    Generic  Flash Disk       8.07 PQ: 0 ANSI: 2 <5>sd 0:0:0:0: [sda] 7995392 512-byte hardware sectors (4094 MB) <5>sd 0:0:0:0: [sda] Write Protect is off <7>sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00 <3>sd 0:0:0:0: [sda] Assuming drive cache: write through <5>sd 0:0:0:0: [sda] 7995392 512-byte hardware sectors (4094 MB) <5>sd 0:0:0:0: [sda] Write Protect is off <7>sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00 <3>sd 0:0:0:0: [sda] Assuming drive cache: write through <6> /dev/scsi/host0/bus0/target0/lun0: p1 p2 <5>sd 0:0:0:0: [sda] Attached SCSI removable disk <5>sd 0:0:0:0: Attached scsi generic sg0 type 0 <7>usb-storage: device scan complete

If they don't appear check if USB support enabled in Services-USB, otherwise enable save config and reload box. Highlited string is address of your USB-drive, it may differ. By the fact, it's a directory containing block partitions part1 and part2:

root@dir-620:~# ls /dev/scsi/host0/bus0/target0/lun0/ disc  part1  part2

Then make a simple script, to uncompress part2 somewhere into rw filesystem: /tmp or /var, load needed modules, and finally mount part1 to /opt mount point. In my case it looks like

root@dir-620:~# nvram set rc_startup=" sleep 15 mkdir /var/lib/fs cd /var/lib/fs tar -zxvf /dev/scsi/host0/bus0/target0/lun0/part2 insmod jbd.ko insmod mbcache.ko insmod ext3.ko sleep 10 mount -t ext3 -o noatime /dev/scsi/host0/bus0/target0/lun0/part1 /opt"

This script works after executing manually, also works on restart:

root@dir-620:~# lsmod Module                 Size  Used by ext3                  106496  1 mbcache                8192  1 ext3 jbd                   57344  1 ext3 nf_nat_pptp            4096  0 nf_conntrack_pptp      4096  1 nf_nat_pptp nf_nat_proto_gre       4096  1 nf_nat_pptp nf_conntrack_proto_gre    4096  1 nf_conntrack_pptp etherip                8192  0 n_hdlc                 8192  0 rt2860v2_ap          479232  1 usblp                  8192  0 scsi_wait_scan          480  0

root@dir-620:~# mount rootfs on / type rootfs (rw) /dev/root on / type squashfs (ro) none on /dev type devfs (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) ramfs on /tmp type ramfs (rw) devpts on /dev/pts type devpts (rw) devpts on /proc/bus/usb type usbfs (rw) /dev/scsi/host0/bus0/target0/lun0/part1 on /opt type ext3 (rw,noatime,data=ordered) root@dir-620:~#

Enjoy :-) Kirill Varlamov, Russia