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 | wget https://github.com/miaoermua/CatWrt/releases/download/v23.8/CatWrt.v23.8.x86_64-squashfs-combined-efi.img |
准备多分区挂载工具 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 |
第二步:镜像处理
1.使用cfdisk(fdisk)工具删掉镜像里的系统分区
1 | cfdisk CatWrt.v23.8.x86_64-squashfs-combined-efi.img |
完成Delete后,选择Write,输入yes,然后Quit退出
等待同步完成
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
接着,会询问我们要创建的分区大小,这里直接回车就行
完成后选择Write,yes,Quit
fdisk操作类似
4.使用kpartx挂载镜像为硬盘回环设备
1 | losetup /dev/loop7 CatWrt.v23.8.x86_64-squashfs-combined-efi.img |
如果/dev/loop7被占用就换其它的loop0 loop1什么的
查看映射的分区表
1 | kpartx -av /dev/loop7 |
其中 loop7p2就是我们的目标
格式化该分区
1 | mkfs.ext4 /dev/mapper/loop7p2 |
!CatWrt内核支持f2fs,格式化成f2fs格式也可以(f2fs适合将镜像刷写在闪存存储介质上 如U盘,移动硬盘SSD,固态硬盘(包括nvme固态,m2SATA,SATASSD等)) 命令mkfs.f2fs /dev/mapper/loop7p2
5.查看分区UUID (在格式化之后分区UUID会改变,因而需要先格式化再查看)
1 | cfdisk /dev/loop7 |
分区UUID用于在后续引导系统
6.建立一个临时挂载路径并挂载系统分区
1 | mkdir /mnt/mount |
7.解压rootfs
1 | tar -xzvf CatWrt.v23.8.x86_64-rootfs.tar.gz -C /mnt/mount |
可以看到 我们已经制作完成启动镜像了
第七步结束。如果不需要修改系统,请转到第八步
此时这个镜像的系统分区就已经处理好了 。当然,我们还可以优化一下镜像
1 | chroot /mnt/mount |
编辑源,更新部分软件等 (CatWrt具有)
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 | bash-5.2# mkdir /var/lock -p |
安装程序包等…(可看文末)
退出
1 | bash-5.2# exit |
8.卸载系统分区
root@pve:~# umount /mnt/mount
9.挂载boot分区,修改启动项
1 | mount /dev/mapper/loop7p1 /mnt/mount |
1 | root@pve:~/OpenWrt# cd /mnt/mount/boot/grub/ |
10.将前面记录的UUID填入(替换)到PARTUUID中
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
优化
虚拟化环境下卸载amdGPU、IntelGPU驱动
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 系统信息和发行版图标
1 | opkg install apk alpine-keys alpine-repositories |
使用apk包管理器,我们可以安装一些其它东西,比如java,可以搭建mc服务器。安装装glibc支持 运行其它程序,安装完整开发环境、做远程测试服务器等…
CatWrt扩展