Enjoy your life

AEnjoy’s Blog

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

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

包括镜像扩容,源修改,软件包定制

​ 熟悉软路由的朋友们都知道我们在下载固件(镜像)的时候,一般都是选择带有squashfs字样的镜像,然而往往还有另一个神秘的选择- rootfs。它却很少被人们提起,它的一般用途是拿来做docker的镜像,但是我们还可以拿做另一件事,OpenWrt的系统分区制作。

​ 我们平时接触到的OpenWrt的根文件系统一般都是 squashfs,这个文件系统给我们带来一定的安全感,我们在软路由上装插件、修改配置导致OpenWrt出现异常时可以通过清除挂载的文件修改操作来还原初始状态;在硬路由上,squashfs+配置分区的外挂载使我们可以轻易的通过外置按键还原对路由器的更改。虽然squashfs很好,但是它也阻止了我们直接往系统分区增添、删除、修改我们想要的文件、配置和程序。

想要解决系统分区不能修改的解决方法很简单,也是OpenWrt系默认的操作,

第一种方式:建立一个overlay分区,将所有修改后的文件存放于此,使用挂载的方式直接覆盖系统分区,实现修改,这种操作类似建立一个镜像,通过对镜像的修改而改动系统。

当我们清空/overlay分区的时候,便实现了对系统分区修改的还原。

第二种方式,就是将系统分区的squashfs文件系统中的文件移动到其它可写的文件系统,如f2fs,ext4,xfs等,并建立启动信息启动系统。OpenWrtx86可以在系统->挂载点->/->修改,通过拷贝/下的文件到新的可写路径,并建立启动项来实现对/的可读写,但是这种方式对新手并不友好,甚至一些老手都在此栽过跟头。

除此之外,我们还有第三种方式:使用Linux kernel+rootfs+grub(bootlodaer)制作一个可启动的Linux系统,这种方式建立的系统,根路径在root权限下是可读写的,本文将介绍此种方法

实现的原理:同Linux启动过程

第一步:准备阶段

准备内核(kernel)、引导(grub))和rootfs。

启动引导(bootlodaer)启动引导程序(grub),引导程序启动内核(kernel),内核初始化(mount and init)rootfs,启动rootfs里的进程。

下载启动分区 EFI引导的 传统BIOS引导方式

由于一般的OpenWrt都不提供单独的内核和引导,我们只能下载我们要制作的目标版本镜像来做底包修改。 选择适当引导方式的底包制作镜像将可以很方便的在对应目标的系统启动openwrt系统。

下载rootfs 链接 一般rootfs都是以 xxx-rootfs.tar.gz结尾

1
2
3
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:

1
apt install kpartx -y 

alpineLinux:

1
apk add kpartx

CentOS/Fedora/OpenRuler:

1
yum install kpartx -y

image

第二步:镜像处理

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

1
cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img

image

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

等待同步完成

image

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

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

1
cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img

选择Free space

image

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

完成后选择Write,yes,Quit

fdisk操作类似

image

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

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

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

查看映射的分区表

1
kpartx -av /dev/loop7

image

其中 loop7p2就是我们的目标

格式化该分区

1
mkfs.ext4 /dev/mapper/loop7p2

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

image

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

1
cfdisk /dev/loop7

image

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

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

1
2
mkdir /mnt/mount
mount /dev/mapper/loop7p2 /mnt/mount

image

7.解压rootfs

1
2
3
tar -xzvf CatWrt.v23.8.x86_64-rootfs.tar.gz -C /mnt/mount
cd /mnt/mount
ls

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

image

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


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

1
chroot /mnt/mount

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

image

1
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

1
2
bash-5.2# mkdir /var/lock -p
bash-5.2# opkg update

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

退出

1
2
3
bash-5.2# exit

exit

8.卸载系统分区

root@pve:~# umount /mnt/mount

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

1
2
3
mount /dev/mapper/loop7p1 /mnt/mount

ls /mnt/mount

image

1
2
3
4
5
6
7
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中

image

11.保存文件,卸载分区

1
umount /mnt/mount

12.卸载回环设备

1
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

image

image

优化

虚拟化环境下卸载amdGPU、IntelGPU驱动

opkg remove amdgpu-firmware

opkg remove i915-firmware

更新curl

opkg upgrade libcurl4 curl

image

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

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 系统信息和发行版图标

1
2
3
4
opkg install apk alpine-keys alpine-repositories
apk update --allow-untrusted
apk add neofetch --allow-untrusted
neofetch

image

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

CatWrt扩展

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