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