本篇介紹如何對OpenWrt SquashFS固件下的overlay分区進行扩容操作.
该方案适用于SquashFS固件, 且/overlay文件系统为F2FS格式的OpenWrt進行扩容操作
本篇使用DHDAXCW骷髅头固件进行扩容演示操作 (https://github.com/DHDAXCW/OpenWRT_x86_x64)
Release: 20240828-openwrt-x86-64-generic-squashfs-combined-efi.img.gz
什麽是overlay
對於使用SquashFS文件系統的OpenWrt固件, 它與傳統EXT4格式固件最大的差異就是, SquashFS文件系統是唯讀的, 相較於EXT4可對分區進行讀寫操作, SquashFS唯讀要如何寫入保存修改的系統各項設定以及安裝其它軟件包呢, 這裏就用到了/overlay分區; overlay顧名思義就是覆蓋在上一層的意思, 雖然SquashFS分區唯讀不可寫入, 但我們可以將修改的部分存放在overlay分區上, 再映射到原始位置, 當讀取的時候就可以讀取到修改後的文件了.
SquashFS固件的優勢
SquashFS是經過壓縮的, 在路由器這類小ROM設備下能夠存放更多數據.
SquashFS固件的OpenWrt可以很方便的還原出廠設定, 因爲還原只需要清空overlay分區的數據, 一切都回到最開始的樣子.
SquashFS固件并非沒有缺點
首先你無法刪除SquashFS分區的數據, 刪除操作實際是在overlay分區中寫入一個刪除標識符, 并不能釋放空間反而會增加空間占用.
另外在修改文件操作上相當於在overlay上新增了一個副本, 占用了雙份空間.
擴容overlay的原理
Overlay分區的空間大小是在編譯固件時決定的, 爲了便於固件的分享和傳播, 避免固件體積過大, 通常不會設定非常大的overlay空間, 這就導致需要對這類已編譯好的固件進行手動擴容的操作; 在OpenWrt第一次啓動時將自動格式化所分配的overlay空間, 我們要做的就是在OpenWrt尚未啓動前將所有剩餘空間全部劃分給overlay, 完成後OpenWrt啓動將獲得硬碟的所有剩餘空間.
⚠️: 該擴容方式僅適用於還未正式開始使用之情形, 無法對已有實例進行擴容, 一旦固件首次啓動后分區大小就已經固定!
我們可以先檢查一下固件在默認情況下的分區情況
设备 起点 末尾 扇区 大小 类型
/dev/sda1 512 66047 65536 32M Linux 文件系统
/dev/sda2 66048 2171391 2105344 1G Linux 文件系统
/dev/sda128 34 511 478 239K BIOS 启动
可以看到在當前固件中存在三個分區, 即sda1 / sda2 / sda128, 其中sda128為UEFI引導分區, sda1為boot分區
重點在sda2分區, 在OpenWrt第一次啓動時會對sda2的可用空間進行格式化, 將會格式化為包含一個唯讀SquashFS分區作為/rom, 剩餘所有的sda2空間將被格式化為一個可讀寫的F2FS根文件系統並挂載為/overlay, overlay的大小就是我們後面實際可用的文件大小, 但默認情況下sda2空間大小只有1GB, 即使你的硬碟有很大空間, 但sda2的大小是編譯固件時寫好的, 啓動後有很多剩餘容量無法使用, 所以我們要做的, 其實是對sda2這個分區進行擴容操作, 將sda2分區擴容至全部磁盤空間, 這樣在第一次啓動時, 所有磁盤的剩餘可用空間都將被自動格式化為overlay的可用空間
在下面的擴容步驟中, 我們將用到一臺Linux系統對固件進行分區修改操作
對overlay進行擴容操作
在執行擴容操作開始前, 請確保你已經下載OpenWrt固件並寫入到SD卡/U盘内, 將該准備好的存儲器插入到一臺Linux設備上
通過ssh連接到用於進行擴容操作的Linux設備上, 此時寫入好OpenWrt固件的存儲設備應該會被自動挂載到系統上, 例如/dev/sdb
通過fdisk命令管理這個存儲設備
Command #fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.37.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
GPT PMBR size mismatch (2171423 != 134217727) will be corrected by write.
备份 GPT 表损坏,但主表似乎正常,将使用它。
The backup GPT table is not on the end of the device. This problem will be corrected by write.
输入p来检查当前磁盘的分区表
命令(输入 m 获取帮助): p
Disk /dev/sdb:64 GiB,68719476736 字节,134217728 个扇区
Disk model: QEMU HARDDISK
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:2F21C2D2-403B-E326-39A0-18C85EB99D00
设备 起点 末尾 扇区 大小 类型
/dev/sdb1 512 66047 65536 32M Linux 文件系统
/dev/sdb2 66048 2171391 2105344 1G Linux 文件系统
/dev/sdb128 34 511 478 239K BIOS 启动
分区表记录没有按磁盘顺序。
可以看到當前磁盤容量為64GB, 但sdb2容量只有1GB, 我们需要对/dev/sdb2这个分区进行扩容, 提前記錄下藍色標注sdb2的起始位置
在开始扩容前, 我们还需要记录sdb2原始分区的UUID值
扩容后UUID将发生改变, 对于UEFI引导启动的固件將導致無法找到引導設備無法啓動
输入命令i来显示分区详细信息
命令(输入 m 获取帮助): i
这里表示要查看哪个分区的详细信息, 我们要查看sdb2所以输入2
分区号 (1,2,128, 默认 128): 2
Device: /dev/sdb2
Start: 66048
End: 2171391
Sectors: 2105344
Size: 1G
Type: Linux 文件系统
Type-UUID: 0FC63DAF-8483-4772-8E79-3D69D8477DE4
UUID: 2F21C2D2-403B-E326-39A0-18C85EB99D02
这里记录下上面红色标注的UUID
接下来开始进行扩容操作, 我们需要扩大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, 直接按下回車鍵即可
Last sector, +/-sectors or +/-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
输入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固件的擴容操作完成
取消挂載/dev/sdb, 將SD卡/U盘從用於擴容的機器上移除, 安裝/插入至用於運行OpenWrt的機器上
啓動OpenWrt設備, 在本篇開頭已經提到, 在首次啓動時, OpenWrt將格式化/dev/sda2, 因爲這裏我們sda2已經從1GB擴大到了64GB, OpenWrt將格式化一個SquashFS分區作為/rom外, 剩餘所有的sda2空間都將被格式化為一個可讀寫的F2FS根文件系統並挂載為/overlay.
注意, 分配的新空间越大, 第一次启动用于格式化F2FS分區的時間就越久, 你可能需要等待更長的時間才能啓動完成!
當overlay格式化完成, 通過命令檢查/dev/loop0的空間大小
Command #df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 261.0M 261.0M 0 100% /rom
tmpfs 1.9G 18.3M 1.9G 1% /tmp
/dev/loop0 63.7G 747.7M 63.0G 1% /overlay
overlayfs:/overlay 63.7G 747.7M 63.0G 1% /
/dev/sda1 31.9M 7.4M 24.6M 23% /boot
/dev/sda1 31.9M 7.4M 24.6M 23% /boot
tmpfs 512.0K 0 512.0K 0% /dev
/dev/sda1 31.9M 7.4M 24.6M 23% /mnt/sda1
若操作步驟過程無誤, 你應當檢查到/overlay空間已經擴容成功
參考文章:
izilzty的小窝: OpenWrt x86 官方squashfs固件安装时扩容方法
https://www.izilzty.com/?post=5