Skip to content

Commit 9ca5f53

Browse files
committed
add btrfs
1 parent 9a11837 commit 9ca5f53

File tree

8 files changed

+202
-5
lines changed

8 files changed

+202
-5
lines changed

.github/workflows/OpenWrt-Matrix.yml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ jobs:
165165
run: |
166166
sudo -E apt-get -qq update
167167
sudo /bin/bash -c "$(curl -sL https://git.io/vokNn)"
168-
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
168+
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
169169
sudo -E apt-fast -y -qq install dos2unix dwarves jq npm quilt
170170
sudo -E npm install -g pnpm
171171
sudo -E npm install -g n
@@ -181,6 +181,7 @@ jobs:
181181
run: |
182182
sudo chown -R runner:runner /home/runner/work/YAOF
183183
cp -r ./SCRIPTS/${{ matrix.script_dir }}/. ./SCRIPTS/
184+
cp -r ./SCRIPTS/btrfs/. ./SCRIPTS/
184185
cp -r ./SCRIPTS/. ./
185186
/bin/bash 01_get_ready.sh
186187
@@ -286,17 +287,27 @@ jobs:
286287
env:
287288
LATEST_RELEASE: ${{ env.latest_release }}
288289
run: |
290+
# 1. 准备目录
289291
rm -rf ./artifact/
290292
mkdir -p ./artifact/
293+
294+
# 2. 将原始固件移动到工作目录
291295
mv openwrt/bin/targets/${{ matrix.arch }}/${{ env.sysupgrade_glob }} ./artifact/ || true
292296
cd ./artifact/
297+
298+
# 3. 执行 Btrfs 转换
299+
echo "正在生成 Btrfs 格式镜像..."
300+
target_ext4_img=$(ls ${{ env.ext4_zip }})
301+
sudo -E bash ../openwrt/convert_to_btrfs.sh "$target_ext4_img"
302+
293303
ls -Ahl
294-
gzip -d *.gz || true
295-
gzip --best *.img
304+
unpigz *.gz || true
305+
pigz --best *.img
296306
ls -Ahl
297307
sha256sum openwrt*${{ env.sha_match }}* | tee ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}.sha256sum
298308
zip ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}-ext4.zip ${{ env.ext4_zip }}
299309
zip ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}-sfs.zip ${{ env.sfs_zip }}
310+
zip ${{ env.artifact_prefix }}-$(date +%Y-%m-%d)-${{ env.latest_release }}-btrfs.zip *btrfs*.img*
300311
ls -Ahl
301312
302313
- name: Create release
@@ -308,7 +319,8 @@ jobs:
308319
allowUpdates: true
309320
prerelease: false
310321
tag: ${{ env.latest_release }}
311-
commit: "25.12"
322+
# commit: "25.12"
323+
commit: ${{ github.ref_name }}
312324
replacesArtifacts: true
313325
token: ${{ secrets.GITHUB_TOKEN }}
314326
artifacts: ./artifact/*.zip

SCRIPTS/02_prepare_package.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ KERNEL_VERSION="6.12"
211211
CONFIG_CONTENT='
212212
CONFIG_CPU_IDLE_GOV_MENU=n
213213
CONFIG_CPU_IDLE_GOV_TEO=y
214+
215+
CONFIG_BTRFS_FS=y
214216
'
215217
# 查找所有与内核 6.12 相关的配置文件并将这些配置项追加到文件末尾
216218
find ./target/linux/ -name "config-${KERNEL_VERSION}" | xargs -I{} sh -c "echo '$CONFIG_CONTENT' | tee -a {} > /dev/null"

SCRIPTS/btrfs/convert_to_btrfs.sh

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# --- 权限与依赖检查 ---
5+
if [ "$(id -u)" -ne 0 ]; then
6+
echo "Error: 请使用 sudo (root权限) 运行"
7+
exit 1
8+
fi
9+
10+
# GitHub Actions 环境自动安装 (使用 apt-fast)
11+
if [ "$GITHUB_ACTIONS" = "true" ]; then
12+
echo "正在安装依赖..."
13+
sudo apt-fast install -y -qq btrfs-progs rsync pigz
14+
fi
15+
16+
# 检查必要工具
17+
for cmd in mkfs.btrfs rsync losetup blkid pigz; do
18+
if ! command -v $cmd &> /dev/null; then
19+
echo "Error: 缺少工具 $cmd"
20+
exit 1
21+
fi
22+
done
23+
24+
# --- 输入校验 ---
25+
SOURCE_FILE="$1"
26+
if [[ -z "$SOURCE_FILE" || "$SOURCE_FILE" != *.gz ]]; then
27+
echo "用法: $0 <image.img.gz>"
28+
echo "Error: 仅支持 .gz 格式的压缩镜像"
29+
exit 1
30+
fi
31+
32+
if [ ! -f "$SOURCE_FILE" ]; then
33+
echo "Error: 文件不存在 $SOURCE_FILE"
34+
exit 1
35+
fi
36+
37+
# --- 变量定义 ---
38+
BASENAME=$(basename "$SOURCE_FILE" .gz)
39+
40+
# --- 替换文件名 ext4 为 btrfs ---
41+
if [[ "$BASENAME" == *"ext4"* ]]; then
42+
# 如果文件名包含 ext4,则进行替换
43+
WORK_IMG="${BASENAME//ext4/btrfs}"
44+
else
45+
# 如果原文件名不含 ext4,则在 .img 前面加上 -btrfs 后缀
46+
WORK_IMG="${BASENAME%.img}-btrfs.img"
47+
fi
48+
49+
# 使用当前目录下的 tmp 文件夹
50+
TEMP_BASE="./tmp"
51+
TEMP_MNT="${TEMP_BASE}/btrfs_mnt_$$"
52+
TEMP_DATA="${TEMP_BASE}/btrfs_data_$$"
53+
LOOP_DEV=""
54+
55+
# 定义退出清理函数
56+
cleanup() {
57+
mountpoint -q "$TEMP_MNT" && umount "$TEMP_MNT"
58+
[ -n "$LOOP_DEV" ] && losetup -d "$LOOP_DEV"
59+
# 仅删除本次运行生成的临时子目录,保留 ./tmp 父目录
60+
rm -rf "$TEMP_MNT" "$TEMP_DATA"
61+
}
62+
trap cleanup EXIT
63+
64+
# --- 核心流程 ---
65+
66+
echo "1. 解压镜像到: $WORK_IMG ..."
67+
pigz -d -c "$SOURCE_FILE" > "$WORK_IMG"
68+
69+
echo "2. 挂载镜像..."
70+
LOOP_DEV=$(losetup -fP --show "$WORK_IMG")
71+
ROOT_PART="${LOOP_DEV}p2" # 默认 OpenWrt Rootfs 为 p2
72+
73+
if [ ! -b "$ROOT_PART" ]; then
74+
echo "Error: 未找到分区 $ROOT_PART"
75+
exit 1
76+
fi
77+
78+
OLD_UUID=$(blkid -s UUID -o value "$ROOT_PART")
79+
echo "原 UUID 为: $OLD_UUID"
80+
OLD_PARTUUID=$(blkid -s PARTUUID -o value "$ROOT_PART")
81+
echo "原 Partition UUID : $OLD_PARTUUID"
82+
83+
# 创建临时目录
84+
mkdir -p "$TEMP_MNT" "$TEMP_DATA"
85+
86+
echo "3. 提取原系统数据..."
87+
mount "$ROOT_PART" "$TEMP_MNT"
88+
rsync -aAX --exclude "lost+found" "$TEMP_MNT/" "$TEMP_DATA/"
89+
umount "$TEMP_MNT"
90+
91+
echo "4. 格式化为 Btrfs..."
92+
mkfs.btrfs -f -L rootfs -m single -U "$OLD_UUID" "$ROOT_PART"
93+
94+
echo "5. 还原数据..."
95+
mount -t btrfs -o compress=zstd "$ROOT_PART" "$TEMP_MNT"
96+
btrfs property set "$TEMP_MNT" compression zstd
97+
rsync -aAX "$TEMP_DATA/" "$TEMP_MNT/"
98+
99+
echo "6. 更新系统配置..."
100+
# 验证 Filesystem UUID (mkfs -U 参数的效果)
101+
NEW_UUID=$(blkid -s UUID -o value "$ROOT_PART")
102+
echo "验证 UUID 完整性..."
103+
if [ "$NEW_UUID" != "$OLD_UUID" ]; then
104+
echo "Error: Filesystem UUID 未能保留!"
105+
echo "期望: $OLD_UUID"
106+
echo "实际: $NEW_UUID"
107+
exit 1
108+
fi
109+
echo " [OK] Filesystem UUID 保持一致: $NEW_UUID"
110+
# 验证 PARTUUID (mkfs 通常不会改变这个)
111+
NEW_PARTUUID=$(blkid -s PARTUUID -o value "$ROOT_PART")
112+
if [ "$NEW_PARTUUID" != "$OLD_PARTUUID" ]; then
113+
echo "Error: PARTUUID 发生了改变!"
114+
echo "原: $OLD_PARTUUID"
115+
echo "新: $NEW_PARTUUID"
116+
exit 1
117+
fi
118+
echo " [OK] PARTUUID 保持一致: $NEW_PARTUUID"
119+
120+
# 修改 fstab
121+
mkdir -p "$TEMP_MNT/etc/config"
122+
cat >> "$TEMP_MNT/etc/config/fstab" <<EOF
123+
124+
config mount
125+
option target '/'
126+
option uuid '$NEW_UUID'
127+
option enabled '1'
128+
option fstype 'btrfs'
129+
option options 'rw,noatime,compress=zstd,space_cache=v2'
130+
EOF
131+
132+
# 删除所有挂载点为 / 的行,如果有
133+
sed -i '\#\s/\s#d' "$TEMP_MNT/etc/fstab" 2>/dev/null || true
134+
echo "PARTUUID=$NEW_PARTUUID / btrfs rw,noatime,compress=zstd,space_cache=v2 0 0" >> "$TEMP_MNT/etc/fstab"
135+
136+
# --- 收尾 ---
137+
umount "$TEMP_MNT"
138+
losetup -d "$LOOP_DEV"
139+
LOOP_DEV=""
140+
141+
if [ "$GITHUB_ACTIONS" != "true" ]; then
142+
echo "7. 压缩输出文件..."
143+
pigz -9 "$WORK_IMG"
144+
# 这里的 WORK_IMG 已经是替换过名字的文件,pigz 会生成 WORK_IMG.gz
145+
rm -f "$WORK_IMG"
146+
fi
147+
148+
echo "=== 转换成功 ==="

SEED/R2C/config.seed

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y
234234
CONFIG_PACKAGE_kmod-crypto-user=y
235235
CONFIG_PACKAGE_kmod-crypto-xcbc=y
236236
CONFIG_PACKAGE_kmod-crypto-xxhash=y
237+
238+
# Btrfs
239+
CONFIG_KERNEL_BTRFS_FS=y
240+
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y
241+
CONFIG_PACKAGE_btrfs-progs=y
242+
CONFIG_BTRFS_PROGS_ZSTD=y
243+
CONFIG_PACKAGE_kmod-fs-btrfs=y

SEED/R2S/config.seed

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,3 +233,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y
233233
CONFIG_PACKAGE_kmod-crypto-user=y
234234
CONFIG_PACKAGE_kmod-crypto-xcbc=y
235235
CONFIG_PACKAGE_kmod-crypto-xxhash=y
236+
237+
# Btrfs
238+
CONFIG_KERNEL_BTRFS_FS=y
239+
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y
240+
CONFIG_PACKAGE_btrfs-progs=y
241+
CONFIG_BTRFS_PROGS_ZSTD=y
242+
CONFIG_PACKAGE_kmod-fs-btrfs=y

SEED/R3S/config.seed

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,11 @@ CONFIG_PACKAGE_kmod-crypto-xxhash=y
235235

236236
### QUAN ###
237237
CONFIG_PACKAGE_kmod-mt7921u=y
238-
CONFIG_PACKAGE_wpad-openssl=y
238+
CONFIG_PACKAGE_wpad-openssl=y
239+
240+
# Btrfs
241+
CONFIG_KERNEL_BTRFS_FS=y
242+
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y
243+
CONFIG_PACKAGE_btrfs-progs=y
244+
CONFIG_BTRFS_PROGS_ZSTD=y
245+
CONFIG_PACKAGE_kmod-fs-btrfs=y

SEED/R4S/config.seed

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y
232232
CONFIG_PACKAGE_kmod-crypto-user=y
233233
CONFIG_PACKAGE_kmod-crypto-xcbc=y
234234
CONFIG_PACKAGE_kmod-crypto-xxhash=y
235+
236+
# Btrfs
237+
CONFIG_KERNEL_BTRFS_FS=y
238+
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y
239+
CONFIG_PACKAGE_btrfs-progs=y
240+
CONFIG_BTRFS_PROGS_ZSTD=y
241+
CONFIG_PACKAGE_kmod-fs-btrfs=y

SEED/X86/config.seed

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,3 +233,10 @@ CONFIG_PACKAGE_kmod-crypto-sha512=y
233233
CONFIG_PACKAGE_kmod-crypto-user=y
234234
CONFIG_PACKAGE_kmod-crypto-xcbc=y
235235
CONFIG_PACKAGE_kmod-crypto-xxhash=y
236+
237+
# Btrfs
238+
CONFIG_KERNEL_BTRFS_FS=y
239+
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y
240+
CONFIG_PACKAGE_btrfs-progs=y
241+
CONFIG_BTRFS_PROGS_ZSTD=y
242+
CONFIG_PACKAGE_kmod-fs-btrfs=y

0 commit comments

Comments
 (0)