本篇是 rootfs 版 CatWrt (OpenWrt) 啟動鏡像的定制,適合進階玩家使用定制固件功能;包括鏡像擴容,源修改,軟體包定制
前言#
熟悉軟路由的朋友們都知道我們在下載固件 (鏡像) 的時候,一般都是選擇帶有 squashfs 字樣的鏡像,然而往往還有另一個神秘的選擇 - rootfs。它卻很少被人們提起,它的一般用途是拿來做 docker 的鏡像以及 LXC 容器,但是我們還可以拿做另一件事,OpenWrt 的系統分區製作。
我們平時接觸到的 OpenWrt 的根文件系統一般都是 squashfs,這個文件系統給我們帶來一定的安全感,我們在軟路由上裝插件、修改配置導致 OpenWrt 出現異常時可以通過清除掛載的文件修改操作來還原初始狀態;在硬路由上,squashfs + 配置分區的外挂載使我們可以輕易的通過外置按鍵還原對路由器的更改。雖然 squashfs 很好,但是它也阻止了我們直接往系統分區增添、刪除、修改我們想要的文件、配置和程序。
想要解決系統分區不能修改的解決方法很簡單,也是 OpenWrt 系默認的操作;
第一種方式:建立一個 overlay 分區,將所有修改後的文件存放於此,使用掛載的方式直接覆蓋系統分區,實現修改,這種操作類似建立一個鏡像,通過對鏡像的修改而改動系統。
當我們清空 /overlay 分區的時候,便實現了對系統分區修改的還原。
第二種方式:就是將系統分區的 squashfs 文件系統中的文件移動到其它可寫的文件系統,如 f2fs,ext4,xfs 等,並建立啟動信息啟動系統。OpenWrt x86 可以在 系統 -> 掛載點 ->/-> 修改,通過拷貝 / 下的文件到新的可寫路徑,並建立啟動項來實現對 / 的可讀寫,但是這種方式對新手並不友好,甚至一些老手都在此栽過跟頭。
除此之外,我們還有第三種方式:使用 Linux kernel + rootfs + grub (bootlodaer) 製作一個可啟動的 Linux 系統,這種方式建立的系統,根路徑在 root 權限下是可讀寫的,本文將介紹此種方法。
實現的原理:同 Linux 啟動過程
第一步:準備階段#
準備內核 (kernel)、引導 (grub) 和 rootfs。#
啟動引導 (bootlodaer) 啟動引導程序 (grub),引導程序啟動內核 (kernel),內核初始化 (mount and init) rootfs,啟動 rootfs 裡的進程。
下載啟動分區 EFI 引導的 傳統 BIOS 引導方式
由於一般的 OpenWrt 都不提供單獨的內核和引導,我們只能下載我們要製作的目標版本鏡像來做底包修改。 選擇適當引導方式的底包製作鏡像將可以很方便的在對應目標的系統啟動 Openwrt 系統。
下載 rootfs CatWrt.v23.8.x86_64-rootfs.tar.gz 一般 rootfs 都是以 xxx-rootfs.tar.gz 結尾
wget https://github.com/miaoermua/CatWrt/releases/download/v23.8/CatWrt.v23.8.x86_64-squashfs-combined-efi.img
wget https://github.com/miaoermua/CatWrt/releases/download/v23.8/CatWrt.v23.8.x86_64-rootfs.tar.gz
準備多分區掛載工具 kpartx#
Kpartx is a tool that creating device mappings for partitions.
Debian/Ubuntu:
apt install kpartx -y
alpineLinux:
apk add kpartx
CentOS/Fedora/OpenRuler:
yum install kpartx -y
第二步:鏡像處理#
1. 使用 cfdisk (fdisk) 工具刪掉鏡像裡的系統分區
cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img
完成 Delete 後,選擇 Write,輸入 yes,然後 Quit 退出
等待同步完成
2. 使用 dd 命令給鏡像增加空間
dd if=/dev/zero bs=1M count=256 >>CatWrt.v23.8.x86_64-squashfs-combined-efi.img
bs 參數 數字 + 單位 count 參數 數量 >> 代表追加
意思是從 /dev/zero 中取出 1M*256 的容量追加到鏡像中(擴容 256M)
我們可以根據需要給鏡像擴容任意大小
比如 dd if=/dev/zero bs=1G count=5 >>CatWrt.v23.8.x86_64-squashfs-combined-efi.img
代表擴容 5G
3. 使用 cfdisk 給擴容後的鏡像尾建立分區
cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img
選擇 Free space
接著,會詢問我們要創建的分區大小,這裡直接回車就行
完成後選擇 Write,yes,Quit
fdisk 操作類似
4. 使用 kpartx 掛載鏡像為硬碟回環設備
losetup /dev/loop7 CatWrt.v23.8.x86_64-squashfs-combined-efi.img
如果 /dev/loop7 被佔用就換其它的 loop0 loop1 什麼的
查看映射的分區表
kpartx -av /dev/loop7
其中 loop7p2 就是我們的目標
格式化該分區
mkfs.ext4 /dev/mapper/loop7p2
CatWrt 內核支持 f2fs,格式化成 f2fs 格式也可以,f2fs 適合將鏡像刷寫在閃存存儲介質上 如 U 盤,移動硬碟 SSD, 固態硬碟 (包括 nvme 固態,m2SATA,SATASSD 等)) 命令 mkfs.f2fs /dev/mapper/loop7p2
5. 查看分區 UUID (在格式化之後分區 UUID 會改變,因而需要先格式化再查看)
cfdisk /dev/loop7
分區 UUID 用於在後續引導系統
6. 建立一個臨時掛載路徑並掛載系統分區
mkdir /mnt/mount
mount /dev/mapper/loop7p2 /mnt/mount
7. 解壓 rootfs
tar -xzvf CatWrt.v23.8.x86_64-rootfs.tar.gz -C /mnt/mount
cd /mnt/mount
ls
可以看到 我們已經製作完成啟動鏡像了
第七步結束。如果不需要修改系統,請轉到第八步
此時這個鏡像的系統分區就已經處理好了 。當然,我們還可以優化一下鏡像
chroot /mnt/mount
編輯源,更新部分軟體等 (CatWrt 具有)
bash-5.2# vim /etc/opkg/distfeeds.conf
換騰訊源
src/gz openwrt_core https://mirrors.cloud.tencent.com/lede/snapshots/targets/x86/64/packages
src/gz openwrt_base https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/base
src/gz openwrt_luci https://mirrors.cloud.tencent.com/lede/releases/18.06.9/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/telephony
bash-5.2# mkdir /var/lock -p
bash-5.2# opkg update
安裝程序包等…(可看文末)
退出
bash-5.2# exit
exit
8. 卸載系統分區
root@pve:~# umount /mnt/mount
9. 掛載 boot 分區,修改啟動項
mount /dev/mapper/loop7p1 /mnt/mount
ls /mnt/mount
root@pve:~/OpenWrt# cd /mnt/mount/boot/grub/
root@pve:/mnt/mount/boot/grub# ls
boot.img core.img grub.cfg
root@pve:/mnt/mount/boot/grub# vim grub.cfg
10. 將前面記錄的 UUID 填入 (替換) 到 PARTUUID 中
11. 保存文件,卸載分區
umount /mnt/mount
12. 卸載回環設備
root@pve:~# losetup -d /dev/loop7
完成#
將新的鏡像(CatWrt.v23.8.x86_64-squashfs-combined-efi.img)刷入啟動盤,啟動。(PVE 添加硬碟)
這個時候應該改名叫 CatWrt.v23.8.x86_64-6G-ext4-rootfs-efi.img 才對
Enjoy Image!
截圖#
以下是 10G 版本擴容的截圖
10G 擴容版的下載鏈接: Here
優化#
虛擬化環境下卸載 AMD GPU、Intel GPU 驅動
opkg remove amdgpu-firmware
opkg remove i915-firmware
更新 curl
opkg upgrade libcurl4 curl
可安全更新的程序列表 (等):
xray-core v2ray-core v2ray-geoip fdisk blkid mount-utils libopenssl-conf node libfdisk1 samba4-libs cfdisk parted samba4-server tailscale ethtool libblkid1 lsblk libmount1 tailscaled zerotier libopenssl3 terminfo
不建議更新的: kmod-xxx uci docker (d) dnsmasq-full containerd strongswan 等
安裝 apk 包管理器 && neofetch
* 顯示 Linux 系統信息和發行版圖標
opkg install apk alpine-keys alpine-repositories
apk update --allow-untrusted
apk add neofetch --allow-untrusted
neofetch
使用 apk 包管理器,我們可以安裝一些其它東西,比如 java,可以搭建 Minecraft 伺服器。安裝裝 glibc 支持 運行其它程序,安裝完整開發環境、做遠程測試伺服器等……
CatWrt 擴展應用安裝,全系生態通用 - 喵二の小博客 (miaoer.xyz)
本博客來自 CatWrt 用戶體驗計劃江西理工大學學長提供,原文: rootfs 版 CatWrt (OpenWrt) 啟動鏡像定制 | Enjoy your life | AEnjoy’s Blog
此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://www.miaoer.xyz/posts/blog/rootfs-catwrtoropenwrt-customization