OpenWRT扩容拾遗

去年我在博客里面写了一篇文章,叫《折腾OpenWRT in PVE那些事——安装与扩容》。后来发现我当时只给出了单一的解决方案,但没有说明其中的原理。之后对openwrt的文件系统有了一点了解,因此做一点拾遗。

文件系统类型小科普

  • ext系列
    包括ext2(linux第一代老登),ext3,ext4(现在常用)。支持大文件写入优化,从ext3版本引入了日志系统,方便崩溃后恢复。各种linux要用的磁盘或者SD卡都会选择这种文件系统。
    可以使用e2fsck(检查和修复),resize2fs(调节大小),mkfs.ext4(创建分区)等工具操作。

  • f2fs
    对flash nand友好,尽量减少写入以增加闪存寿命,带有碎片整理功能。很适合带有nand颗粒的嵌入式设备使用。各种路由器,工控器由于主要使用nand颗粒都会使用它。
    可以使用这些工具,fsck.f2fs(检查分区),resize.f2fs(调整分区),mkfs.f2fs(创建分区)。注意,f2fs工具可能无法直接opkg寻找到,可以尝试 opkg install f2fs-tools ,也可以去github找二进制用。

  • squashFS
    只读压缩文件系统,可以解压,但是在实际使用中一般不可写入。文件元数据它也压缩,所以压缩率不小。适合各种LiveCD,只读flash使用。
    可以使用的工具有mksquashfs(创建分区),unsquashfs(解压分区)。是的,没有调整分区大小的工具。

OpenWRT的奇怪文件系统

OpenWRT是针对嵌入式系统设计的,对于存储空间寸土寸金的嵌入式设备来说,压缩是必需操作。OpenWRT选择了SquashFS这种压缩文件系统,适当损失性能,换来极致的文件大小。同时这个文件系统还有一个好处,也就是只可读不可写。这方便了内核纯净,方便各种升级,而且可以通过按按钮直接恢复出厂设置。
但是!我说但是了!这必然导致用户配置写不进去,软件也没法安装。于是OP就用了另一个可读写的用户空间,如果这个空间内有和内核中重复的配置文件,会优先选择这个空间中的文件进行配置读取。软件也会安装在这个空间。而且OP还想了一个大聪明的做法,将SquashFS和ext4(一般是这个,但是可写分区也可能为别的,例如f2fs)这些系统进行了合并,将一个可写的文件系统(upperdir)叠加在一个或多个只读文件系统(lowerdir)之上,对外呈现一个统一的视图。写入操作只发生在可写层,也就是overlay。并且把它挂载为了根分区。这样用户可以看似随意的读写/etc,/usr等分区。但是其实用户写入的是可写空间,并不是和常规linux那样直接控制一个单纯的文件系统。
只读和可读写的界面在物理上是分开的,在这之前为SquahFS只读文件系统,之后为ext系列或者f2fs可读写文件系统。
新一点的OP系统一般使用的是ext4或f2fs,老一点的好像有用ext3的。至于是ext还是f2fs,如果是官方构建固件,这取决于下载时选择的OP固件是否带efi功能,有efi功能则为ext4。其实这只是官方构建人员的习惯,非官方固件则不一定。

扩容时会导致的问题

有了这些铺垫,我们现在知道了扩容OpenWRT系统的本质是扩大OverlayFS中的可写分区。扩张了虚拟磁盘的基本块之后还需要让分区识别。
核心思路就是删掉upperdir可写分区,再重建一个起始扇区一致,扩大了终止扇区的新可写分区。但是OpenWRT不会用lvm让你方便在线扩容。所以就引出了问题,不能依赖于一个结构去修改这个结构。分区表在启动时已经被内核绑定了,有一些工具可以把根拆出来,但是其实都容易出问题。而到了OpenWRT里面直接不让你这么干了。
很多常见linux发行版里面即使不用lvm也能通过resize2fs扩容根分区,不过前提是不仅硬盘空间变大,分区也需要已经变大,这一步只是扩大文件系统。而且resize2fs试图扩容overlay时会发现这不是一般的ext4,实测均会报错。

参考资料

知乎-Linux文件系统比较
楚权博客-Ext系列文件系统的特点

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注