MKTalkway
首页
注册

OpenWrt SquashFS固件下的overlay分区扩容操作

MiKing233
好吃懶做
2024-09-23 16:07:08

本篇介紹如何對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, 其中sda128UEFI引導分區, sda1boot分區

重點在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/sdb64 GiB68719476736 字节,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值为原先sdb2UUID, 输入x进入fdisk专家模式

命令(输入 m 获取帮助) x

 

输入u设定新的UUID

专家命令(输入 m 显示帮助) u

 

这里我们要修改sdb2UUID, 输入2

分区号 (1,2,128, 默认  128): 2

 

sdb2设定新的UUID, 这里的UUID值为之前记录下来用紅色標記的旧sdb2UUID

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