一、我需要这个功能吗?
如果你对跑openwrt的设备的要求仅仅是可以上上网,那下面的可以不用看了。
openwrt运行在USB设备上的好处:
可以安装openwrt官方的N多软件了(但官方暂时没有mysql,郁闷),象P2P类的transmision-daemon、amule、 web服务器类的lighttpd/apache、ftp服务器类的vsftpd等等,还可以再安装其他驱动程序包驱动摄像头、USB声卡、显卡等等。这 部分功能optware也可以实现,各论坛的教程多数是基于optware的。

二、需要的设备及环境:
1、可以运行openwrt的设备;
2、带USB接口;
3、openwrt要版本比较新,往前哪个版本可以,我不知道,新版本的trunk版(最新的开发版)、Backfire版(最新的稳定版)都可以。

三、步骤:
1、实现USB存储支持,已实现此功能的此步骤可略。需要用到的包:

kmod-usb-ohci、kmod-usb2、kmod-usb-uhci、kmod-usb-storage

说明:
kmod-usb-ohci对应usb1.1
kmod-usb2对应USB2.0
kmod-usb-uhci对应部分intel和VIA的usb控制器
(这3个可能不必全部都安装,像7231-4P等只支持USB1.1的设备应该只安装kmod-usb-ohci即可)
kmod-usb-stroage对应USB硬盘设备,如U盘、USB移动硬盘。
为了方便新手(其实我也是个新手,汗……),将详细命令也写一下:

opkg update
opkg install kmod-usb-storage kmod-usb-ohci kmod-usb2 kmod-usb-uhci

2、实现USB存储设备自动挂载并从USB启动,需要用到的包:block-mount、block-hotplug(这两个是自动挂载用的)和block-extroot(这个是USB启动用的)

opkg update
opkg install block-mount block-hotplug block-extroot

3、 安装linux文件系统支持,ext2、ext3、ext4以及其他文件系统众多,用哪个看个人爱好了,推荐经典传统的ext2/ext3。我用ext4 遇到过问题,后来上openwrt果然有人报到这个bug。另,在linux下,尽量少用或者放弃fat32/ntfs

opkg install kmod-fs-ext3

说明:不安装文件系统支持的话,分区不能mount。

有人会问,你为何不一下子opkg install了,当然可以,我分开来是为了帮助新手了解一下linux下设备驱动、功能包、文件系统支持的一些简单概念。

完成以上步骤后,openwrt默认设置下,U盘插上还不能识别,openwrt有默认设置模板,但此时还是关闭U盘自动挂载功能的。

4、准备USB硬盘及拷贝根目录所有文件。以下均以插一个U盘的情况为例:
4.1前3个步骤完成后,你最好重启一下设备,插上U盘(USB移动硬盘)。

4.2 准备U盘为linux分区及linux文件系统,需要用到的包:e2fsprogs,如果你在其他系统里准备分区并格式化为ext2/ext3,应该也可以
准备分区这个步骤略过不表了,默认一个分区也可以用,如果有人想多分几个区,请看其他教程。

opkg update
opkg install e2fsprogs

ls /dev/sd*,应该有sda sda1 字样(这是只有一个U盘一个分区的情况,如果有多个U盘,会有sdb sdc……)

fdisk -l /dev/sd*

输入命令

lsblk

查看硬盘空间分布,我这插入了一个sda 16G的卡

使用以下命令查看您有哪些分区,没有16G的分区:

block info

分区
将使用/dev/sda 这块16G大小的磁盘进行分区,分为/dev/sda1

先备份数据;
使用fdisk /dev/sda可以进入分区编辑界面;
主要使用d子命令删除一个分区,再用n新建分区,用p查看编辑后的分区;
使用w将分区表的更改写入磁盘。
值得注意的是,如果当前文件系统正在使用,新的分区表需要重启后才能生效。

分区完后,我们还需要格式化分区才能使用,官方 WiKi 中有说明仅 ext4 格式的文件系统有效:

> mkfs.ext4 /dev/sda1

迁移文件
这一步主要是将原/overlay中的文件拷贝到新的中:

> mount /dev/sda1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt

编辑 fstab
自动将系统检测到的可挂载文件系统配置写入/etc/config/fstab。OpenWRT 中都是使用 UCI 更改系统配置。如果按照一般方式直接编辑文件,如/etc/fstab,会被 UCI 覆盖,这一点需要注意。

block detect > /etc/config/fstab; 
   sed -i s/option$'t'enabled$'t''0'/option$'t'enabled$'t''1'/ /etc/config/fstab; 
   sed -i s
   cat /etc/config/fstab;

接下来我们更改/etc/config/fstab中需要启用挂载的option enable项值为'1';再选择选择作为extroot的分区,更改挂载目标option target值为'/overlay',如下:

config 'mount'
        option  target  '/overlay'
        option  uuid    'c91232a0-c50a-4eae-adb9-14b4d3ce3de1'
        option  fstype  'ext4'
        option  enabled '1'

之后我们就可以重启来验证配置是否成功了。

root@Joe-OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 9.5M      9.5M         0 100% /rom
tmpfs                    61.0M    644.0K     60.4M   1% /tmp
/dev/sda1               188.7M     20.7M    154.0M  12% /overlay
overlayfs:/overlay      188.7M     20.7M    154.0M  12% /
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda2                23.2G    150.5M     21.9G   1% /mnt/tmp
/dev/sda3                23.2G    150.5M     21.9G   1% /mnt

肉眼可见/的可用空间变大了。

注意事项
不要在 extroot 中使用 upgrade
会导致状态不一致有变砖的风险。

The main reason is that the uClibc ABI (Application Binary Interface) is unstable and changes from revision to revision, so binaries for one version of uClibc may be incompatible with versions from another.
Another problem that can arise is if you try to upgrade the kernel packages, then flash and reboot, but your operation is interrupted in any way, then you will have a kernel and module mismatch and likely a brick.
Finally, if you upgrade all packages but the kernel and the kernel modules, some packages like iptables will be broken.
访问原来的/overlay
如果要访问原来的/overlay,我们可以通过重新挂载到其它目录的方式。

config mount
    option target   /overlay-boot
    option device   /dev/mtdblock6
    option fstype   jffs2
    option options  rw,sync
    option enabled  1
    option enabled_fsck 0

参考资料
https://wiki.openwrt.org/doc/howto/extroot
https://wiki.openwrt.org/doc/howto/extroot/extroot.theory
https://wiki.mbirth.de/know-how/software/openwrt/sysupgrade-with-extroot.html
https://dreamcreator108.com/dreams/openwrt-extroot/

参与评论