OpenWrt SquashFS下的overlay分区F2FS扩容操作

本篇介绍如何对OpenWrt SquashFS固件下的overlay分区进行扩容操作

该方案适用于:
SquashFS固件且/overlay文件系统为F2FS格式的

DHDAXCW骷髅头固件进行扩容演示操作

什么是overlay

对于使用 SquashFS 文档系统的OpenWrt 固件, 它与传统EXT4格式固件最大的差异就是, SquashFS 文件系统是唯读的, 相较于EXT4可对分区进行读写操作, SquashFS只读要如何写入保存修改的系统各项设定以及安装其它软件包呢, 这里就用到了/overlay分区; overlay顾名思义就是覆盖在上一层的意思, 虽然SquashFS分区只读不可写入, 但我们可以将修改的部分存放在overlay分区上, 再映射到原始位置, 当读取的时候就可以读取到修改后的文件了.

SquashFS固件的优势:

  • 1.SquashFS是经过压缩的, 在路由器这类小ROM设备下能够存放更多数据.

  • 2.SquashFS固件的OpenWrt可以很方便的还原出厂设定, 因为还原只需要清空overlay分区的数据, 一切都回到最开始的样子.

SquashFS固件并非沒有缺點:

  • 首先你无法删除SquashFS分区的数据, 删除操作实际是在overlay分区中写入一个删除标识符, 并不能释放空间反而会增加空间占用.

  • 另外在修改文件操作上相当于在overlay上新增了一个副本, 占用了双份空间.

overlay的原理

Overlay分区的空间大小是在编译固件时决定的, 为了便于固件的分享和传播, 避免固件体积过大, 通常不会设定非常大的overlay空间, 这就导致需要对这类已编译好的固件进行手动扩容的操作; 在OpenWrt第一次启动时将自动格式化所分配的overlay空间, 我们要做的就是在OpenWrt尚未启动前将所有剩余空间全部划分给overlay, 完成后OpenWrt启动将获得硬盘的所有剩余空间。

⚠️: 该扩容方法只能用于未正式开始使用的场景,无法对已有运行实例进行扩容,一旦固件首次启动后overlay大小就已固定下来

先检查一下固件在默认情况下的分区情况
blkid
fdisk -l
parted -l

可以看到在当前固件中存在三个分区,
/dev/sda1 /boot
/dev/ sda2 【 /room + /overlay】

重点在sda2分区, 在OpenWrt第一次启动时会对sda2的可用空间进行格式化, 将会格式化为包含一个只读SquashFS分区作为/rom, 剩余所有的sda2空间将被格式化为一个可读写的F2FS根文件系统并挂载为/overlay, overlay的大小就是我们后面实际可用的文件大小, 但默认情况下sda2空间大小只有1GB, 即使你的硬盘有很大空间, 但sda2 的大小是编译固件时写好的, 启动后有很多剩余容量无法使用, 所以我们要做的, 其实是对sda2这个分区进行扩容操作, 将sda2分区扩容至全部磁盘空间, 这样在第一次启动时, 所有磁盘的剩余可用空间都将被自动格式化为overlay的可用空间

对overlay进行扩容操作

1.镜像刷到u盘或者放到linux上

在执行扩容操作开始前, 请确保你已经下载OpenWrt固件并写入到SD卡/U盘内, 将该准备好的存储器插入到一台Linux设备上。

2.对img分区调整

通过ssh连接到用于进行扩容操作的Linux设备上, 此时写入好OpenWrt固件的存储设备应该会被自动挂载到系统上, 例如/dev/sdb

2.1检测磁盘分区信息

fdisk /dev/sdb
p //检查当前磁盘的分区表

/dev/sdb1 512 66047 65536 32M #Linux 文件系统
/dev/sdb2 66048 2171391 2105344    1G #Linux 文件系统
/dev/sdb128 34 511 478 239K #BIOS 启动

2.2记录分区2信息

可以看到當前磁盤容量為64GB, 但sdb2容量只有1GB, 我们需要对/dev/sdb2这个分区进行扩容, 提前記錄下藍色標注sdb2的起始位置扇区编号

在开始扩容前, 我们还需要记录sdb2原始分区的UUID值,扩容后UUID将发生改变, 对于UEFI引导启动的固件將導致無法找到引導設備無法啓動

输入命令i来显示分区详细信息
命令(输入 m 获取帮助):  i
这里表示要查看哪个分区的详细信息, 我们要查看sdb2所以输入2
分区号 (1,2,128, 默认128): 2
设备:/dev/sdb2
开始: 66048
结束时间:2171391
行业: 2105344
尺寸: 1G
类型: Linux 文件系统
类型 UUID:0FC63DAF-8483-4772-8E79-3D69D8477DE4
UUID 地址: 2F21C2D2-403B-E326-39A0-18C85EB99D02

这里记录下上面红色标注的UUID

2.3删除及新建sda2分区

汇总命令:
p
d
n
sda2 扇区起始编号

接下来开始进行扩容操作, 我们需要扩大sdb2的空间, 需要先将目前的sdb2删除, 输入命令d
命令(输入 m 获取帮助):  d
要删除sdb2, 输入2
分区号 (1,2,128, 默认128): 2
分区 2 已删除。 
现在新建分区sdb2, 输入n新建

命令(输入 m 获取帮助):  n
要新建sdb2, 输入2
分区号 (2-127, 默认2): 2
这里要设定扇区的起始位置, 我們使用原先sdb2的起始位置, 在先前步驟中使用藍色標注了該值
第一个扇区 (66048-134217694, 默认 67584): 66048
然后输入该分区的结束位置, 这里我们想要将所有剩余空间都划分给sdb2, 直接按下回车键即可
最后一个扇区、+/-扇区或 +/-size{K,M,G,T,P} (66048-134217694, 默认 134217694): 
创建了一个新分区 2,类型为“Linux filesystem”,大小为 64 GiB。 
分区 #2 包含一个 squashfs 签名。 
这里要注意不要移除签名, 输入n
您想移除该签名吗?  是\[Y\]/否\[N\]:  n
然后我们需要修改這個新建的sdb2分區UUID值为原先sdb2的UUID, 输入x进入fdisk专家模式

命令(输入 m 获取帮助):  x     //uefi引导squashfs需要保持uuid前后一致
输入u设定新的UUID值
专家命令(输入 m 显示帮助):  u
这里我们要修改sdb2的UUID, 输入2
分区号 (1,2,128, 默认128): 2
为sdb2设定新的UUID值, 这里的UUID值为之前记录下来用紅色標記的旧sdb2的UUID值
新 UUID (以 8-4-4-4-12 格式):  2F21C2D2-403B-E326-39A0-18C85EB99D02
分区 UUID 已从 F34760F2-E498-3F48-B53A-14AE6859654A 更改为 2F21C2D2-403B-E326-39A0-18C85EB99D02。 
输入r退出专家模式

专家命令(输入 m 显示帮助):  r
输入w将之前所做的操作写入进磁盘
命令(输入 m 获取帮助):  w
分区表已调整。 
将调用 ioctl() 来重新读分区表。 
正在同步磁盘。 
至此對OpenWrt固件的擴容操作完成

2.4取消挂载,启动第一次固件运行

取消挂载/dev/sdb, 将SD卡/U盘从用于扩容的机器上移除, 安装/插入至用于运行OpenWrt的机器上

启动OpenWrt设备, 在本篇开头已经提到, 在首次启动时, OpenWrt将格式化/dev/sda2, 因为这里我们sda2已经从1GB扩大到了64GB,** OpenWrt将格式化一个SquashFS分区作为/rom外, 剩余所有的sda2空间都将被格式化为一个可读写的F2FS根文件系统并挂载为/overlay.**

注意:
分配的新空间越大, 第一次启动用于格式化F2FS分区的时间就越久, 你可能需要等待更长的时间才能启动完成!

2.5进入后检测磁盘空间

当overlay格式化完成, 通过命令检查/dev/loop0的空间大小
df -h
若操作步骤过程无误, 你应当检查到/overlay空间已经扩容成功