Plus vous installez de packages sur votre OpenWRT, plus il vous faut de l'espace de stockage. Si votre routeur dispose d'un port USB, voici un moyen simple de remplacer la partition flash JFFS du routeur avec une clé ou un disque dur USB.

Installation des packages

Tout d'abord, installez les modules et programmes nécessaires.

~$ opkg install kmod-scsi-core kmod-usb-core kmod-usb2 kmod-usb-storage
~$ opkg install cfdisk e2fsprogs swap-utils

Branchez votre lecteur USB et observez les messages du noyau. Ils devraient vous donner le chemin de votre lecteur USB.

~$ dmesg
usb.c: USB disconnect on device 01:03.2-2 address 2
hub.c: new USB device 01:03.2-1, assigned address 3
scsi1 : SCSI emulation for USB Mass Storage devices
Vendor: VBTM Model: Store 'n' Go Rev: 1.04
Type: Direct-Access ANSI SCSI revision: 02
Attached scsi removable disk sdb at scsi1, channel 0, id 0, lun 0
SCSI device sdb: 1001472 512-byte hdwr sectors (513 MB)
sdb: Write Protect is off
/dev/scsi/host1/bus0/target0/lun0: p1 p2 p3
WARNING: USB Mass Storage data integrity not assured
USB Mass Storage device found at 3

Preparer le périphérique USB

Il faut maintenant partitionner et formater le disque USB comme ceci :

~$ cfdisk /dev/scsi/host1/bus0/target0/lun0/disc
cfdisk (util-linux-ng 2.13.0.1)

Disk Drive: /dev/scsi/host1/bus0/target0/lun0/disc
Size: 512753664 bytes, 512 MB
Heads: 16 Sectors per Track: 62 Cylinders: 1009

NameFlags Part Type FS Type [Label] Size (MB)
-----------------------------------------------------------------------------
disc1 Primary Linux ext3 [storage] 463.21
disc2 Primary Linux swap / Solaris 49.27

Format the first linux ext3 partition.

~$ mke2fs -j /dev/scsi/host1/bus0/target0/lun0/part1
mke2fs 1.40.11 (17-June-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
113344 inodes, 452320 blocks
22616 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
56 block groups
8192 blocks per group, 8192 fragments per group
2024 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

et le monter

~$ mkdir -p /mnt/root
~$ mount /dev/discs/disc0/part1 /mnt/root

Nous pourrions avoir besoin de swap pour éviter que le routeur ne soit à court de mémoire.

~$ mkswap /dev/discs/disc0/part2
~$ swapon /dev/discs/disc0/part2

Copiez maintenant tout le système de fichier dans la nouvelle partition.

~$ tar cvO -C / bin/ etc/ root/ lib/ sbin/ usr/ www/ var/ | tar x -C /mnt/root
~$ mkdir -p /mnt/root/tmp && mkdir -p /mnt/root/dev && mkdir -p /mnt/root/proc && mkdir -p /mnt/root/jffs && mkdir -p /mnt/root/mnt/openwrt && mkdir -p /mnt/root/sys

Utiliser la nouvelle partition en tant que partition racine

Voici la partie la plus intéressante. Il faut créer un nouveau script dans init.d pour monter le périphérique USB au démarrage.

~$ cat > /etc/init.d/mountusb << EOF
#!/bin/sh /etc/rc.common
EXTERNAL_PARTITION=/dev/discs/disc0/part1

START=06

start () {
echo "loading USB and ext3 modules"

for module in usbcore usb-ohci uhci ehci-hcd scsi_mod sd_mod usb-storage jbd ext3; do
insmod $module
done
sleep 2s

[ "$FAILSAFE" != "true" ] && [ -b $EXTERNAL_PARTITION ] && {
mount $EXTERNAL_PARTITION /mnt/root
[ -x /mnt/root/sbin/init ] && {
mount -o move /proc /mnt/root/proc &&
pivot_root /mnt/root /mnt/root/mnt/openwrt && {
mount -o move /mnt/openwrt/dev /dev
mount -o move /mnt/openwrt/tmp /tmp
}
}
}
}
EOF
~$ chmod +x /etc/init.d/mountusb
~$ cd /etc/rc.d/ && ln -s ../init.d/mountusb S06mountusb

Le script utilise pivot_root pour faire de /mnt/root le nouveau / et va déplacer la racine courante dans /mnt/root/mnt/openwrt. Les autres commandes mount s'assurent que les partitions /proc, /dev et /tmp sont mises à jour.

Il ne reste qu'à rebooter le routeur et voilà ! Il n'y a plus qu'à remplir ce nouvel espace de stockage de packages et autre fichiers.

Sources:
http://mpd.wikia.com/wiki/OpenWRT_FullInstall
https://forum.openwrt.org/viewtopic.php?id=21377