Openwrt在U盘上做extroot

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

安装所需的软件包

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

控制台中输入

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,将此为例:

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

也可以这样转移:

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

修改配置

编辑fstab文件:

block detect > /etc/config/fstab ; vi /etc/config/fstab

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

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。控制台里:

root@Dreamcreator108:df

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

那么,恭喜你成功了!

修改opkg配置

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

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文件:

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已经结束了。如果有什么问题欢迎留言评论或者发邮件至 support@dreamcreator108.com ,不过应该没多少人看到的,只是给自己做个笔记,哈哈哈。

参考资料:

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