Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions .github/workflows/OpenWrt-Matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions SCRIPTS/02_prepare_package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
148 changes: 148 additions & 0 deletions SCRIPTS/btrfs/convert_to_btrfs.sh
Original file line number Diff line number Diff line change
@@ -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 <image.img.gz>"
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" <<EOF

config mount
option target '/'
option uuid '$NEW_UUID'
option enabled '1'
option fstype 'btrfs'
option options 'rw,noatime,compress=zstd,space_cache=v2'
EOF

# 删除所有挂载点为 / 的行,如果有
sed -i '\#\s/\s#d' "$TEMP_MNT/etc/fstab" 2>/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 "=== 转换成功 ==="
7 changes: 7 additions & 0 deletions SEED/R2C/config.seed
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 7 additions & 0 deletions SEED/R2S/config.seed
Original file line number Diff line number Diff line change
Expand Up @@ -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
9 changes: 8 additions & 1 deletion SEED/R3S/config.seed
Original file line number Diff line number Diff line change
Expand Up @@ -235,4 +235,11 @@ CONFIG_PACKAGE_kmod-crypto-xxhash=y

### QUAN ###
CONFIG_PACKAGE_kmod-mt7921u=y
CONFIG_PACKAGE_wpad-openssl=y
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
7 changes: 7 additions & 0 deletions SEED/R4S/config.seed
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 7 additions & 0 deletions SEED/X86/config.seed
Original file line number Diff line number Diff line change
Expand Up @@ -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