大闪存的路由比较贵,而普通的路由对于类似 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 | mount /dev/sda1 /mnt # 挂载 U 盘第一个分区到 /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 | config 'global' |
好了,重启路由器吧。但愿可以顺利启动。
检验成果
如果你成功地重启了路由器,那么胜利应该已经在眼前了。不过还是需要确认一下。在 luci 的 web 管理界面里,点进 System - Software,可用的空间应该变得好大,和你u盘的分区大小基本一致。在 System - Mount Points 里,你应该看到 U 盘的分区被挂载为 /overlay。控制台里:
1 | root@Dreamcreator108:df |
输出的内容应该看到 sda1 被挂载为 /overlay,而且空间很多。
那么,恭喜你成功了!
修改 opkg 配置
在 CLI 里加入 option force_space 到 /etc/opkg.conf。使之允许安装大于 /rom 容量的软件包。
1 | echo option force_space >> /etc/opkg.conf |
挂载原来的内置小闪存
OpenWRT 自身是如何启动的?其大致启动过程如下:
路由器通电
CPU从Flash的零地址执行boot loader的引导程序
boot loader加载OpenWRT的linux内核
linux内核在完成preinit过程之后,选择rootfs根文件系统的实现方式
从rootfs执行init过程
所以如果你要升级,请千万不要轻易用 opkg upgrade ,因为 U 盘上的 extroot 必须和内置 Flash 的系统保持内核版本一致。想要在 U 盘上升级内核是不可以实现的。如果需要增加新的 Kernel Module 往往都需要刷内置的固件。
如果你需要更改 extroot 的设置,你也需要回到内置的 Flash 里操作,所以………我们还是挂载上原来的内存吧。
编辑 U 盘上的 fstab 文件:
1 | config mount |
对于 mtdblock 的确认,可以执行 $ cat /proc/mtd
查看 rootfs_data。
至此,extroot 已经结束了。
参考资料: