From 1787d52591f6d01c1eeac45dee5660363c8f14c7 Mon Sep 17 00:00:00 2001 From: NuoFang6 <991921514@qq.com> Date: Sat, 27 Dec 2025 01:54:27 +0800 Subject: [PATCH] add btrfs --- .github/workflows/OpenWrt-Matrix.yml | 21 +++- SCRIPTS/02_prepare_package.sh | 2 + SCRIPTS/btrfs/convert_to_btrfs.sh | 148 +++++++++++++++++++++++++++ SEED/R2C/config.seed | 7 ++ SEED/R2S/config.seed | 7 ++ SEED/R3S/config.seed | 9 +- SEED/R4S/config.seed | 7 ++ SEED/X86/config.seed | 7 ++ 8 files changed, 203 insertions(+), 5 deletions(-) create mode 100644 SCRIPTS/btrfs/convert_to_btrfs.sh diff --git a/.github/workflows/OpenWrt-Matrix.yml b/.github/workflows/OpenWrt-Matrix.yml index 4c0a49c9f..385f1ff13 100644 --- a/.github/workflows/OpenWrt-Matrix.yml +++ b/.github/workflows/OpenWrt-Matrix.yml @@ -165,7 +165,7 @@ jobs: run: | sudo -E apt-get -qq update sudo /bin/bash -c "$(curl -sL https://git.io/vokNn)" - sudo -E apt-fast -y -qq install asciidoc bash bcc bin86 binutils bison bzip2 clang file flex g++ g++-multilib gawk gcc-multilib gettext git gzip help2man intltool libbpf-dev libboost-dev libelf-dev libncurses-dev libssl-dev libthread-queue-any-perl libusb-dev libxml-parser-perl linux-tools-generic llvm make patch perl-modules pkg-config python3-dev python3-pip python3-pyelftools python3-setuptools rsync sharutils swig time unzip util-linux wget xsltproc zlib1g-dev zip zstd + sudo -E apt-fast -y -qq install asciidoc bash bcc bin86 binutils bison bzip2 clang file flex g++ g++-multilib gawk gcc-multilib gettext git gzip help2man intltool libbpf-dev libboost-dev libelf-dev libncurses-dev libssl-dev libthread-queue-any-perl libusb-dev libxml-parser-perl linux-tools-generic llvm make patch perl-modules pkg-config python3-dev python3-pip python3-pyelftools python3-setuptools rsync sharutils swig time unzip util-linux wget xsltproc zlib1g-dev zip zstd pigz sudo -E apt-fast -y -qq install dos2unix dwarves jq npm quilt sudo -E npm install -g pnpm sudo -E npm install -g n @@ -181,6 +181,7 @@ jobs: run: | sudo chown -R runner:runner /home/runner/work/YAOF cp -r ./SCRIPTS/${{ matrix.script_dir }}/. ./SCRIPTS/ + cp -r ./SCRIPTS/btrfs/. ./SCRIPTS/ cp -r ./SCRIPTS/. ./ /bin/bash 01_get_ready.sh @@ -270,6 +271,7 @@ jobs: id: compileopenwrt continue-on-error: true run: | + make package/feeds/luci/luci-base/compile -j$(($(nproc) + 1)) # luci-app-openclash 依赖这个,否则随机编译失败 IGNORE_ERRORS=1 make -j$(($(nproc) + 1)) echo $? - name: If Error @@ -286,17 +288,27 @@ jobs: env: LATEST_RELEASE: ${{ env.latest_release }} run: | + # 1. 准备目录 rm -rf ./artifact/ mkdir -p ./artifact/ + + # 2. 将原始固件移动到工作目录 mv openwrt/bin/targets/${{ matrix.arch }}/${{ env.sysupgrade_glob }} ./artifact/ || true cd ./artifact/ + + # 3. 执行 Btrfs 转换 + echo "正在生成 Btrfs 格式镜像..." + target_ext4_img=$(ls ${{ env.ext4_zip }}) + sudo -E bash ../openwrt/convert_to_btrfs.sh "$target_ext4_img" + ls -Ahl - gzip -d *.gz || true - gzip --best *.img + unpigz *.gz || true + pigz --best *.img ls -Ahl sha256sum openwrt*${{ env.sha_match }}* | tee ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}.sha256sum zip ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}-ext4.zip ${{ env.ext4_zip }} zip ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}-sfs.zip ${{ env.sfs_zip }} + zip ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}-btrfs.zip *btrfs*.img* ls -Ahl - name: Create release @@ -308,7 +320,8 @@ jobs: allowUpdates: true prerelease: false tag: ${{ env.latest_release }} - commit: "25.12" + # commit: "25.12" + commit: ${{ github.ref_name }} replacesArtifacts: true token: ${{ secrets.GITHUB_TOKEN }} artifacts: ./artifact/*.zip diff --git a/SCRIPTS/02_prepare_package.sh b/SCRIPTS/02_prepare_package.sh index d6cc22fdd..b4db4da50 100755 --- a/SCRIPTS/02_prepare_package.sh +++ b/SCRIPTS/02_prepare_package.sh @@ -211,6 +211,8 @@ KERNEL_VERSION="6.12" CONFIG_CONTENT=' CONFIG_CPU_IDLE_GOV_MENU=n CONFIG_CPU_IDLE_GOV_TEO=y + +CONFIG_BTRFS_FS=y ' # 查找所有与内核 6.12 相关的配置文件并将这些配置项追加到文件末尾 find ./target/linux/ -name "config-${KERNEL_VERSION}" | xargs -I{} sh -c "echo '$CONFIG_CONTENT' | tee -a {} > /dev/null" diff --git a/SCRIPTS/btrfs/convert_to_btrfs.sh b/SCRIPTS/btrfs/convert_to_btrfs.sh new file mode 100644 index 000000000..ddd47d1eb --- /dev/null +++ b/SCRIPTS/btrfs/convert_to_btrfs.sh @@ -0,0 +1,148 @@ +#!/bin/bash +set -e + +# --- 权限与依赖检查 --- +if [ "$(id -u)" -ne 0 ]; then + echo "Error: 请使用 sudo (root权限) 运行" + exit 1 +fi + +# GitHub Actions 环境自动安装 (使用 apt-fast) +if [ "$GITHUB_ACTIONS" = "true" ]; then + echo "正在安装依赖..." + sudo apt-fast install -y -qq btrfs-progs rsync pigz +fi + +# 检查必要工具 +for cmd in mkfs.btrfs rsync losetup blkid pigz; do + if ! command -v $cmd &> /dev/null; then + echo "Error: 缺少工具 $cmd" + exit 1 + fi +done + +# --- 输入校验 --- +SOURCE_FILE="$1" +if [[ -z "$SOURCE_FILE" || "$SOURCE_FILE" != *.gz ]]; then + echo "用法: $0 " + echo "Error: 仅支持 .gz 格式的压缩镜像" + exit 1 +fi + +if [ ! -f "$SOURCE_FILE" ]; then + echo "Error: 文件不存在 $SOURCE_FILE" + exit 1 +fi + +# --- 变量定义 --- +BASENAME=$(basename "$SOURCE_FILE" .gz) + +# --- 替换文件名 ext4 为 btrfs --- +if [[ "$BASENAME" == *"ext4"* ]]; then + # 如果文件名包含 ext4,则进行替换 + WORK_IMG="${BASENAME//ext4/btrfs}" +else + # 如果原文件名不含 ext4,则在 .img 前面加上 -btrfs 后缀 + WORK_IMG="${BASENAME%.img}-btrfs.img" +fi + +# 使用当前目录下的 tmp 文件夹 +TEMP_BASE="./tmp" +TEMP_MNT="${TEMP_BASE}/btrfs_mnt_$$" +TEMP_DATA="${TEMP_BASE}/btrfs_data_$$" +LOOP_DEV="" + +# 定义退出清理函数 +cleanup() { + mountpoint -q "$TEMP_MNT" && umount "$TEMP_MNT" + [ -n "$LOOP_DEV" ] && losetup -d "$LOOP_DEV" + # 仅删除本次运行生成的临时子目录,保留 ./tmp 父目录 + rm -rf "$TEMP_MNT" "$TEMP_DATA" +} +trap cleanup EXIT + +# --- 核心流程 --- + +echo "1. 解压镜像到: $WORK_IMG ..." +pigz -d -c "$SOURCE_FILE" > "$WORK_IMG" + +echo "2. 挂载镜像..." +LOOP_DEV=$(losetup -fP --show "$WORK_IMG") +ROOT_PART="${LOOP_DEV}p2" # 默认 OpenWrt Rootfs 为 p2 + +if [ ! -b "$ROOT_PART" ]; then + echo "Error: 未找到分区 $ROOT_PART" + exit 1 +fi + +OLD_UUID=$(blkid -s UUID -o value "$ROOT_PART") +echo "原 UUID 为: $OLD_UUID" +OLD_PARTUUID=$(blkid -s PARTUUID -o value "$ROOT_PART") +echo "原 Partition UUID : $OLD_PARTUUID" + +# 创建临时目录 +mkdir -p "$TEMP_MNT" "$TEMP_DATA" + +echo "3. 提取原系统数据..." +mount "$ROOT_PART" "$TEMP_MNT" +rsync -aAX --exclude "lost+found" "$TEMP_MNT/" "$TEMP_DATA/" +umount "$TEMP_MNT" + +echo "4. 格式化为 Btrfs..." +mkfs.btrfs -f -L rootfs -m single -U "$OLD_UUID" "$ROOT_PART" + +echo "5. 还原数据..." +mount -t btrfs -o compress=zstd "$ROOT_PART" "$TEMP_MNT" +btrfs property set "$TEMP_MNT" compression zstd +rsync -aAX "$TEMP_DATA/" "$TEMP_MNT/" + +echo "6. 更新系统配置..." +# 验证 Filesystem UUID (mkfs -U 参数的效果) +NEW_UUID=$(blkid -s UUID -o value "$ROOT_PART") +echo "验证 UUID 完整性..." +if [ "$NEW_UUID" != "$OLD_UUID" ]; then + echo "Error: Filesystem UUID 未能保留!" + echo "期望: $OLD_UUID" + echo "实际: $NEW_UUID" + exit 1 +fi +echo " [OK] Filesystem UUID 保持一致: $NEW_UUID" +# 验证 PARTUUID (mkfs 通常不会改变这个) +NEW_PARTUUID=$(blkid -s PARTUUID -o value "$ROOT_PART") +if [ "$NEW_PARTUUID" != "$OLD_PARTUUID" ]; then + echo "Error: PARTUUID 发生了改变!" + echo "原: $OLD_PARTUUID" + echo "新: $NEW_PARTUUID" + exit 1 +fi +echo " [OK] PARTUUID 保持一致: $NEW_PARTUUID" + +# 修改 fstab +mkdir -p "$TEMP_MNT/etc/config" +cat >> "$TEMP_MNT/etc/config/fstab" </dev/null || true +echo "PARTUUID=$NEW_PARTUUID / btrfs rw,noatime,compress=zstd,space_cache=v2 0 0" >> "$TEMP_MNT/etc/fstab" + +# --- 收尾 --- +umount "$TEMP_MNT" +losetup -d "$LOOP_DEV" +LOOP_DEV="" + +if [ "$GITHUB_ACTIONS" != "true" ]; then + echo "7. 压缩输出文件..." + pigz -9 "$WORK_IMG" + # 这里的 WORK_IMG 已经是替换过名字的文件,pigz 会生成 WORK_IMG.gz + rm -f "$WORK_IMG" +fi + +echo "=== 转换成功 ===" \ No newline at end of file diff --git a/SEED/R2C/config.seed b/SEED/R2C/config.seed index f6919bfc5..0d1ffde78 100644 --- a/SEED/R2C/config.seed +++ b/SEED/R2C/config.seed @@ -234,3 +234,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y CONFIG_PACKAGE_kmod-crypto-user=y CONFIG_PACKAGE_kmod-crypto-xcbc=y CONFIG_PACKAGE_kmod-crypto-xxhash=y + +# Btrfs +CONFIG_KERNEL_BTRFS_FS=y +CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y +CONFIG_PACKAGE_btrfs-progs=y +CONFIG_BTRFS_PROGS_ZSTD=y +CONFIG_PACKAGE_kmod-fs-btrfs=y diff --git a/SEED/R2S/config.seed b/SEED/R2S/config.seed index 837a481db..42eec03b8 100644 --- a/SEED/R2S/config.seed +++ b/SEED/R2S/config.seed @@ -233,3 +233,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y CONFIG_PACKAGE_kmod-crypto-user=y CONFIG_PACKAGE_kmod-crypto-xcbc=y CONFIG_PACKAGE_kmod-crypto-xxhash=y + +# Btrfs +CONFIG_KERNEL_BTRFS_FS=y +CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y +CONFIG_PACKAGE_btrfs-progs=y +CONFIG_BTRFS_PROGS_ZSTD=y +CONFIG_PACKAGE_kmod-fs-btrfs=y \ No newline at end of file diff --git a/SEED/R3S/config.seed b/SEED/R3S/config.seed index 7dd8f6116..24d0efdfd 100644 --- a/SEED/R3S/config.seed +++ b/SEED/R3S/config.seed @@ -235,4 +235,11 @@ CONFIG_PACKAGE_kmod-crypto-xxhash=y ### QUAN ### CONFIG_PACKAGE_kmod-mt7921u=y -CONFIG_PACKAGE_wpad-openssl=y \ No newline at end of file +CONFIG_PACKAGE_wpad-openssl=y + +# Btrfs +CONFIG_KERNEL_BTRFS_FS=y +CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y +CONFIG_PACKAGE_btrfs-progs=y +CONFIG_BTRFS_PROGS_ZSTD=y +CONFIG_PACKAGE_kmod-fs-btrfs=y \ No newline at end of file diff --git a/SEED/R4S/config.seed b/SEED/R4S/config.seed index 5773685d8..5d93ff087 100644 --- a/SEED/R4S/config.seed +++ b/SEED/R4S/config.seed @@ -232,3 +232,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y CONFIG_PACKAGE_kmod-crypto-user=y CONFIG_PACKAGE_kmod-crypto-xcbc=y CONFIG_PACKAGE_kmod-crypto-xxhash=y + +# Btrfs +CONFIG_KERNEL_BTRFS_FS=y +CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y +CONFIG_PACKAGE_btrfs-progs=y +CONFIG_BTRFS_PROGS_ZSTD=y +CONFIG_PACKAGE_kmod-fs-btrfs=y \ No newline at end of file diff --git a/SEED/X86/config.seed b/SEED/X86/config.seed index 81031d847..4ee9d76ea 100644 --- a/SEED/X86/config.seed +++ b/SEED/X86/config.seed @@ -233,3 +233,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y CONFIG_PACKAGE_kmod-crypto-user=y CONFIG_PACKAGE_kmod-crypto-xcbc=y CONFIG_PACKAGE_kmod-crypto-xxhash=y + +# Btrfs +CONFIG_KERNEL_BTRFS_FS=y +CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y +CONFIG_PACKAGE_btrfs-progs=y +CONFIG_BTRFS_PROGS_ZSTD=y +CONFIG_PACKAGE_kmod-fs-btrfs=y \ No newline at end of file