banner
miaoer

miaoer

喵二の小博客 xLog 分站
tg_channel
telegram

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 结尾

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

image

第二步:镜像处理#

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

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

image

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

等待同步完成

image

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

image

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

完成后选择 Write,yes,Quit

fdisk 操作类似

image

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

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

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

查看映射的分区表

kpartx -av /dev/loop7

image

其中 loop7p2 就是我们的目标

格式化该分区

mkfs.ext4 /dev/mapper/loop7p2

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

image

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

cfdisk /dev/loop7

image

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

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

mkdir /mnt/mount
mount /dev/mapper/loop7p2 /mnt/mount

image

7. 解压 rootfs

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

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

image

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


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

chroot /mnt/mount

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

image

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

image

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. 保存文件,卸载分区

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

image

image

优化#

虚拟化环境下卸载 AMD GPU、Intel GPU 驱动

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

opkg install apk alpine-keys alpine-repositories
apk update --allow-untrusted
apk add neofetch --allow-untrusted
neofetch

image

使用 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


Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.