Openwrt/LEDE 在U盘上做 extroot

大闪存的路由比较贵,而普通的路由对于类似 python 的软件包就难以为继了。当然 Openwrt 可以通过一些设置将软件包安装在 U 盘上,但有些文件夹需要做软链接,另一些需要更改 PATH 变量,这样才能正常运行软件。而本文,将介绍如何让 Openwrt 从挂载的 U 盘启动。注意:做 extroot 需要很谨慎,不小心会变砖。最好路由有不死 uboot。

安装所需的软件包

  • block-mount
  • kmod-fs-ext4 或者 kmod-fs-[你U盘的文件系统格式,还是推荐用ext4]
  • kmod-usb-storage-extras

控制台中输入

1
opkg update ; opkg install block-mount kmod-fs-ext4 kmod-usb-storage-extras

如果安装 kmod-usb-storage-extras 的时候出现错误, 可能还要安装 kmod-usb-core

对 U 盘进行分区

具体方法不做介绍了,可以将 U 盘分成两个区,一个装文件,一个做 swap。

数据的转移

接下来将U盘插到路由器上,确认下 U 盘是 sd**,我这里是 sda1,将此为例:

1
2
3
4
5
6
mount /dev/sda1 /mnt             # 挂载 U 盘第一个分区到 /mnt
mkdir /tmp/root # 在 /tmp 目录下创建名叫 root 的一个目录
mount -o bind / /tmp/root # 挂载并同步系统根目录 “/” 到 /tmp/root
cp /tmp/root/* /mnt -a   # 复制 /tmp/root 下所有文件到 “/mnt”
umount /tmp/root # 卸载 /tmp/root
umount /mnt # 卸载 /mnt

也可以这样转移:

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

修改配置

编辑 fstab 文件:

1
block detect > /etc/config/fstab ; vim /etc/config/fstab

将 enabled 全部从 0 改为 1。将你要做 extroot 的分区挂载点改成 /overlay。做 swap 的删除 target 的那一行。并且将 config ‘mount’ 改成 config ‘swap’。如果你又插了个 tf 卡,sd 卡什么的,或者 u 盘分了三个区。那么可以用作一个装下载资料的 /data。修改完成大致如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'

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

config 'swap'
option uuid '08b4f0a3-f7ab-4ee1-bde9-55fc2481f355'
option enabled '1'

config 'mount'
option target '/data'
option uuid 'c1068d91-863b-42e2-bcb2-b35a241b0fe2'
option enabled '1'

好了,重启路由器吧。但愿可以顺利启动。

检验成果

如果你成功地重启了路由器,那么胜利应该已经在眼前了。不过还是需要确认一下。在 luci 的 web 管理界面里,点进 System - Software,可用的空间应该变得好大,和你u盘的分区大小基本一致。在 System - Mount Points 里,你应该看到 U 盘的分区被挂载为 /overlay。控制台里:

1
[email protected]:df

输出的内容应该看到 sda1 被挂载为 /overlay,而且空间很多。

那么,恭喜你成功了!

修改 opkg 配置

在 CLI 里加入 option force_space/etc/opkg.conf。使之允许安装大于 /rom 容量的软件包。

1
echo option force_space >> /etc/opkg.conf

挂载原来的内置小闪存

OpenWRT 自身是如何启动的?其大致启动过程如下:

  1. 路由器通电

  2. CPU从Flash的零地址执行boot loader的引导程序

  3. boot loader加载OpenWRT的linux内核

  4. linux内核在完成preinit过程之后,选择rootfs根文件系统的实现方式

  5. 从rootfs执行init过程

所以如果你要升级,请千万不要轻易用 opkg upgrade ,因为 U 盘上的 extroot 必须和内置 Flash 的系统保持内核版本一致。想要在 U 盘上升级内核是不可以实现的。如果需要增加新的 Kernel Module 往往都需要刷内置的固件。

如果你需要更改 extroot 的设置,你也需要回到内置的 Flash 里操作,所以………我们还是挂载上原来的内存吧。

编辑 U 盘上的 fstab 文件:

1
2
3
4
5
6
7
config mount
option target /overlay-boot
option device /dev/mtdblock3 #我的是mtdblock5,路由不同这里就不同
option fstype jffs2
option options rw,sync
option enabled 1
option enabled_fsck 0

对于 mtdblock 的确认,可以执行 $ cat /proc/mtd 查看 rootfs_data


至此,extroot 已经结束了。

参考资料:

  1. Rootfs on External Storage (extroot)
  2. 利用block-extroot,让你的openwrt运行在USB设备上
  3. fqrouter USB启动原理【1】:刷不死的路由器的三种选择