rootfs 版 CatWrt(OpenWrt) 启动镜像定制

这篇文章上次修改于 1 年前,可能部分内容已经不适用,如有疑问可询问作者。

rootfs 版 CatWrt(OpenWrt) 启动镜像定制

本篇是 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 结尾

BASH
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
Copy

准备多分区挂载工具 kpartx

Kpartx is a tool that creating device mappings for partitions.

Debian/Ubuntu:

BASH
apt install kpartx -y
Copy

alpineLinux:

BASH
apk add kpartx
Copy

CentOS/Fedora/OpenRuler:

BASH
yum install kpartx -y
Copy

第二步:镜像处理

1.使用 cfdisk(fdisk) 工具删掉镜像里的系统分区

BASH
cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img
Copy

完成 Delete 后,选择 Write,输入 yes,然后 Quit 退出

等待同步完成

2.使用 dd 命令给镜像增加空间

BASH
dd if=/dev/zero bs=1M count=256 >>CatWrt.v23.8.x86_64-squashfs-combined-efi.img
Copy

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 给扩容后的镜像尾建立分区

BASH
cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img
Copy

选择 Free space

接着,会询问我们要创建的分区大小,这里直接回车就行

完成后选择 Write,yes,Quit

fdisk 操作类似

4.使用 kpartx 挂载镜像为硬盘回环设备

BASH
losetup /dev/loop7 CatWrt.v23.8.x86_64-squashfs-combined-efi.img
Copy

如果 /dev/loop7 被占用就换其它的 loop0 loop1 什么的

查看映射的分区表

BASH
kpartx -av /dev/loop7
Copy

其中 loop7p2 就是我们的目标

格式化该分区

BASH
mkfs.ext4 /dev/mapper/loop7p2
Copy

CatWrt 内核支持 f2fs,格式化成 f2fs 格式也可以,f2fs适合将镜像刷写在闪存存储介质上 如U盘,移动硬盘SSD,固态硬盘(包括nvme固态,m2SATA,SATASSD等)) 命令 mkfs.f2fs /dev/mapper/loop7p2

5.查看分区 UUID (在格式化之后分区 UUID 会改变,因而需要先格式化再查看)

BASH
cfdisk /dev/loop7
Copy

分区 UUID 用于在后续引导系统

6.建立一个临时挂载路径并挂载系统分区

BASH
mkdir /mnt/mount
mount /dev/mapper/loop7p2 /mnt/mount
Copy

7.解压 rootfs

BASH
tar -xzvf CatWrt.v23.8.x86_64-rootfs.tar.gz -C /mnt/mount
cd /mnt/mount
ls
Copy

可以看到 我们已经制作完成启动镜像了

第七步结束。如果不需要修改系统,请转到第八步


此时这个镜像的系统分区就已经处理好了 。当然,我们还可以优化一下镜像

BASH
chroot /mnt/mount
Copy

编辑源,更新部分软件等 (CatWrt 具有)

bash-5.2# vim /etc/opkg/distfeeds.conf
Copy

换腾讯源

MIRRORS
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
Copy
SHELL
bash-5.2# mkdir /var/lock -p
bash-5.2# opkg update
Copy

安装程序包等…(可看文末)

退出

SHELL
bash-5.2# exit

exit
Copy

8.卸载系统分区

SHELL
root@pve:~# umount /mnt/mount
Copy

9.挂载boot分区,修改启动项

BASH
mount /dev/mapper/loop7p1 /mnt/mount

ls /mnt/mount
Copy

SHELL
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
Copy

10.将前面记录的 UUID 填入(替换)到 PARTUUID 中

11.保存文件,卸载分区

BASH
umount /mnt/mount
Copy

12.卸载回环设备

SHELL
root@pve:~# losetup -d /dev/loop7
Copy

完成

将新的镜像(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 驱动

BASH
opkg remove amdgpu-firmware

opkg remove i915-firmware
Copy

更新curl

BASH
opkg upgrade libcurl4 curl
Copy

可安全更新的程序列表(等):

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
Copy

使用 apk 包管理器,我们可以安装一些其它东西,比如 java,可以搭建 Minecraft 服务器。安装装 glibc 支持 运行其它程序,安装完整开发环境、做远程测试服务器等……

CatWrt 扩展应用安装,全系生态通用 - 喵二の小博客 (miaoer.xyz)

本博客来自 CatWrt 用户体验计划江西理工大学学长提供,原文: rootfs版CatWrt(OpenWrt)启动镜像定制 | Enjoy your life | AEnjoy’s Blog