22 Commits

Author SHA1 Message Date
Olia Lisa 05da3a4d57 fix: 新三路由和极路由B70增加vim和nano-full插件 2026-06-28 11:48:19 +08:00
Olia Lisa 09f1e7d567 doc: 增加极路由b70说明 2026-06-28 11:17:55 +08:00
Olia Lisa 24e2f7188d feat: 增加极路由B70脚本 2026-06-28 11:13:44 +08:00
Olia Lisa 3c860fc7e6 doc: 增加新三路由说明 2026-06-28 10:47:53 +08:00
Olia Lisa 502113f2a6 feat: 增加构建新三路由固件脚本 2026-06-28 10:26:03 +08:00
Olia Lisa 5deda07401 chore: 修改根分区大小为600MB 2026-06-27 16:15:37 +08:00
Olia Lisa c03f61acfb chore: 更新文档 2026-06-27 13:30:36 +08:00
Olia Lisa 3ffeb904bb fix: 如果找不到files文件夹, 跳过复制 2026-06-27 13:23:29 +08:00
Olia Lisa 60e539a694 doc: 更正文档 2026-06-27 12:58:09 +08:00
Olia Lisa 6e4c2f37c5 refeator: 抽取变量 2026-06-27 12:54:46 +08:00
Olia Lisa bf0d9d2db9 refeator: 修改x86构建脚本名字 2026-06-27 11:13:23 +08:00
Olia Lisa 99091363c7 doc: 增加r2s固件构建方式说明 2026-06-27 11:12:39 +08:00
Olia Lisa ffee41eabc feat: 增加r2s固件构建方式 2026-06-27 11:11:43 +08:00
Olia Lisa c55f0c6f83 feat: 软件列表增加插件 curl 2026-06-26 09:33:39 +08:00
Olia Lisa 073955ce4a doc: 修改readme.md, 修改构建说明 2026-06-25 17:03:56 +08:00
Olia Lisa 5d001e22da feat: 增加构建参数 ROOTFS_PARTSIZE , 设置根分区大小. 2026-06-25 11:50:42 +08:00
Olia Lisa d374bfba8b fix: 取消命令行终端插件 2026-06-25 10:21:23 +08:00
Olia Lisa 084caf164c feat: 增加第一次启动触发的用户脚本"如果有安装ssh server, 允许root用户远程密码登录" 2026-06-24 23:19:21 +08:00
Olia Lisa b8a9dba5c0 feat: 增加软件包, 方便切换为fish shell 2026-06-24 19:12:39 +08:00
Olia Lisa a563f425ee feat: 取消功能"不构建SQUASHFS格式固件" 2026-06-24 16:33:57 +08:00
Olia Lisa 30de1e3914 feat:插件列表增加bash和ssh终端 2026-06-24 16:32:33 +08:00
Olia Lisa 85c4a8a2bd feat: 不构建SQUASHFS格式固件 2026-06-24 15:14:07 +08:00
6 changed files with 762 additions and 26 deletions
+173 -16
View File
@@ -1,43 +1,200 @@
# ImmortalWrt Image Builder
这是一个用于快速构建 ImmortalWrt 固件的自动化项目,基于 ImmortalWrt 官方 Image Builder 生成 x86_64 平台固件。它适合用于定制个人或家庭网络环境中的 OpenWrt/ImmortalWrt 系统.
这是一个用于快速构建 ImmortalWrt 固件的自动化项目,基于 ImmortalWrt 官方 Image Builder 生成自定义固件。
**目前只支持 x86-64 固件构建**
当前仓库提供两个构建脚本:
## 使用说明
- `x86-64.sh`:构建 x86/64 通用固件
- `r2s.sh`:构建 FriendlyARM NanoPi R2S 固件
执行构建
脚本会自动安装构建依赖、下载对应版本的 Image Builder、复制 `files/` 目录中的自定义文件,并执行固件构建
## 环境要求
建议在 Debian/Ubuntu 或 WSL Ubuntu 环境中运行。
最好找一个独立的环境执行代码.
官方说最好找一个非 root 用户执行代码. 怕是 root 权限太大, 怕出现误删文件的情况.
## 使用方法
克隆本仓库:
```bash
bash main.sh
git clone https://gitea.9001003.xyz/William/immortalwrt_image_builder.git
cd immortalwrt_image_builder
```
构建完成后,固件文件会生成在 `output/` 目录中。
### 构建 x86-64 固件
```bash
sudo bash x86-64.sh
```
## 其他问题
- 如何修改构建固件的版本?
构建完成后,固件文件会生成到:
`main.sh` 中修改 `version` 变量:
```text
output/
```
### 构建 NanoPi R2S 固件
```bash
sudo bash r2s.sh
```
构建完成后,固件文件会生成到:
```text
r2s_output/
```
### 构建 新三路由 wifi3-d2 固件
```bash
sudo bash newifi3_d2.sh
```
构建完成后,固件文件会生成到:
```text
newifi3_output/
```
### 构建 极路由 B70 固件
```bash
sudo bash hiwifi-b70.sh
```
构建完成后,固件文件会生成到:
```text
hiwifi_b70_output/
```
如果输出目录已经存在,脚本会先将旧目录备份为带时间戳的 `.bak` 目录,再移动新的构建结果。
## 默认配置
### x86-64
- ImmortalWrt 版本:`25.12.0`
- Target`x86/64`
- Profile`generic`
- 根分区大小:`600 MB`
- 输出目录:`output/`
### NanoPi R2S
- ImmortalWrt 版本:`25.12.0`
- Target`rockchip/armv8`
- Profile`friendlyarm_nanopi-r2s`
- 根分区大小:`600 MB`
- 输出目录:`r2s_output/`
### 新三路由(Newifi3 D2
- ImmortalWrt 版本:`25.12.0`
- Target`ramips/mt7621`
- Profile`d-team_newifi-d2`
- 输出目录:`newifi3_output/`
> mt7621newifi3-d2)构建已移除 rootfs_partsize 参数,使用 ImageBuilder 默认分区策略。
### 极路由 B70
- ImmortalWrt 版本:`25.12.0`
- Target`ramips/mt7621`
- Profile`hiwifi_hc5962`
- 输出目录:`newifi3_output/`
## 自定义固件
### 修改 ImmortalWrt 版本
编辑对应脚本中的 `version` 变量:
```bash
version="25.12.0"
```
例如要构建其他版本,就把版本号改成 ImmortalWrt 官方下载站中存在的版本
例如改为
```bash
version="24.10.2"
```
保存后重新执行:
请确认该版本在 ImmortalWrt 官方下载站中存在,否则 Image Builder 下载会失败。
```bash
bash main.sh
```
脚本会根据该版本号下载对应的 x86-64 Image Builder
x86-64 对应下载路径:
```text
https://downloads.immortalwrt.org/releases/<version>/targets/x86/64/
```
NanoPi R2S 对应下载路径:
```text
https://downloads.immortalwrt.org/releases/<version>/targets/rockchip/armv8/
```
### 修改预装软件包
编辑对应脚本中 `build()` 函数里的 `PKG_LIST` 数组。
示例:
```bash
PKG_LIST=(
openssh-sftp-server
vim-full
curl
luci-i18n-firewall-zh-cn
)
```
如果要从固件中移除某个包,可以在包名前加 `-`,例如:
```bash
-dropbear
```
### 修改根分区大小
脚本最后会调用 `build` 函数并传入根分区大小,单位为 MB。
示例:
```bash
rootfs_partsize=500 # 根分区大小,单位为 MB
build $builder_dir $rootfs_partsize
```
### 添加自定义文件
仓库中的 `files/` 目录会被复制到固件根文件系统。
例如:
```text
files/etc/uci-defaults/99-sshd-root-login
```
构建后会出现在固件中的:
```text
/etc/uci-defaults/99-sshd-root-login
```
这个机制适合放置默认配置、初始化脚本、SSH 配置、LuCI 配置等文件。
## 注意事项
- 不建议直接使用 `curl | bash` 运行脚本,因为脚本依赖仓库中的 `files/` 目录。
- 如果下载或安装依赖失败,请检查网络、系统源以及当前用户权限。
- 如需查看某个目标支持的全部 profile,可进入解压后的 Image Builder 目录执行:
```bash
make info
```
+31
View File
@@ -0,0 +1,31 @@
#!/bin/sh
# 仅在首次启动时执行(/etc/uci-defaults机制)
SSHD_CONF="/etc/ssh/sshd_config"
# 如果 sshd 配置文件存在,则修改配置
if [ -f "$SSHD_CONF" ]; then
# 允许 root 远程登录
if grep -q "^#*PermitRootLogin" "$SSHD_CONF"; then
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' "$SSHD_CONF"
else
echo "PermitRootLogin yes" >> "$SSHD_CONF"
fi
# 允许密码登录
if grep -q "^#*PasswordAuthentication" "$SSHD_CONF"; then
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' "$SSHD_CONF"
else
echo "PasswordAuthentication yes" >> "$SSHD_CONF"
fi
fi
# 重启 OpenSSH 服务(如果已安装)
if [ -x /etc/init.d/sshd ]; then
/etc/init.d/sshd enable
/etc/init.d/sshd restart
fi
exit 0
+155
View File
@@ -0,0 +1,155 @@
#!/bin/bash
set -e
install_dependencies() {
apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
download_imagebuilder() {
local version="$1"
local target="ramips/mt7621"
local file="immortalwrt-imagebuilder-$version-ramips-mt7621.Linux-x86_64.tar.zst"
local url="https://downloads.immortalwrt.org/releases/$version/targets/ramips/mt7621/$file"
local folder="immortalwrt-imagebuilder-$version-ramips-mt7621.Linux-x86_64"
local marker="$folder/.ready"
if [ -f "$marker" ]; then
echo "$(pwd)/$folder"
return 0
fi
if [ -d "$folder" ] && [ ! -f "$marker" ]; then
rm -rf "$folder"
fi
wget -O "$file" "$url" >&2
tar -I zstd -xvf "$file" >&2
touch "$marker"
echo "$(pwd)/$folder"
}
build() {
# =============================================================
# 设备 ProfileHiWiFi HC5962 / 极路由B70
# =============================================================
PROFILE="hiwifi_hc5962"
# =============================================================
# 自定义文件目录(映射到固件 rootfs)
# =============================================================
FILES_DIR="files"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILDER_DIR="$1"
# =============================================================
# 固件输出目录
# =============================================================
OUTPUT_DIR="$BUILDER_DIR/hiwifi_b70_output"
PROJECT_OUTPUT_DIR="$SCRIPT_DIR/hiwifi_b70_output"
# =============================================================
# 固件名称标识
# =============================================================
EXTRA_IMAGE_NAME="hc5962"
# =============================================================
# 插件包列表(按需增删)
# =============================================================
PKG_LIST=(
vim
nano-full
openssh-sftp-server
luci-i18n-vlmcsd-zh-cn
luci-i18n-argon-config-zh-cn
luci-i18n-arpbind-zh-cn
luci-i18n-package-manager-zh-cn
# 代理插件
luci-i18n-homeproxy-zh-cn
sing-box
)
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
# =============================================================
# 颜色输出
# =============================================================
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
RED="\033[0;31m"
NC="\033[0m"
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} ImmortalWrt Image Builder 开始构建${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e " Device : HiWiFi HC5962 (B70)"
echo -e " Target : ramips/mt7621"
echo -e " Profile : ${PROFILE}"
echo -e " Output : ${OUTPUT_DIR}"
echo ""
cd "$BUILDER_DIR"
mkdir -p "$FILES_DIR"
# =============================================================
# 复制自定义 files 目录(如果存在)
# =============================================================
if [ -d "${SCRIPT_DIR}/files" ]; then
cp -rf "${SCRIPT_DIR}/files/." "$BUILDER_DIR/files/"
fi
# =============================================================
# 校验 ImageBuilder 环境
# =============================================================
if [ ! -f "Makefile" ]; then
echo -e "${RED}未找到 Makefile,请在 ImageBuilder 目录运行${NC}"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
# =============================================================
# 开始构建固件
# =============================================================
make image \
PROFILE="$PROFILE" \
PACKAGES="$PACKAGES" \
FILES="$FILES_DIR" \
BIN_DIR="$OUTPUT_DIR" \
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME"
# =============================================================
# 输出目录整理
# =============================================================
if [ "$OUTPUT_DIR" != "$PROJECT_OUTPUT_DIR" ]; then
if [ -e "$PROJECT_OUTPUT_DIR" ]; then
BACKUP="${PROJECT_OUTPUT_DIR}.bak.$(date +%Y%m%d%H%M%S)"
mv "$PROJECT_OUTPUT_DIR" "$BACKUP"
fi
mv "$OUTPUT_DIR" "$PROJECT_OUTPUT_DIR"
fi
echo ""
echo -e "${GREEN}构建完成${NC}"
echo -e "固件输出: ${PROJECT_OUTPUT_DIR}"
}
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本
version="25.12.0"
install_dependencies
builder_dir="$(download_imagebuilder "$version")"
build "$builder_dir"
+158
View File
@@ -0,0 +1,158 @@
#!/bin/bash
set -e
install_dependencies() {
apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
download_imagebuilder() {
local version="$1"
local target="ramips/mt7621"
local file="immortalwrt-imagebuilder-$version-ramips-mt7621.Linux-x86_64.tar.zst"
local url="https://downloads.immortalwrt.org/releases/$version/targets/ramips/mt7621/$file"
local folder="immortalwrt-imagebuilder-$version-ramips-mt7621.Linux-x86_64"
local marker="$folder/.ready"
if [ -f "$marker" ]; then
echo "$(pwd)/$folder"
return 0
fi
if [ -d "$folder" ] && [ ! -f "$marker" ]; then
rm -rf "$folder"
fi
wget -O "$file" "$url" >&2
tar -I zstd -xvf "$file" >&2
touch "$marker"
echo "$(pwd)/$folder"
}
build() {
# =============================================================
# 设备 Profile(必须与 ImageBuilder 支持的设备一致)
# =============================================================
PROFILE="d-team_newifi-d2"
# =============================================================
# 自定义文件目录(映射到固件 rootfs)
# =============================================================
FILES_DIR="files"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILDER_DIR="$1"
# =============================================================
# 固件输出目录
# =============================================================
OUTPUT_DIR="$BUILDER_DIR/newifi3_output"
PROJECT_OUTPUT_DIR="$SCRIPT_DIR/newifi3_output"
# =============================================================
# 固件名称标识
# =============================================================
EXTRA_IMAGE_NAME="newifi3"
# =============================================================
# 插件包列表(按需增删)
# =============================================================
PKG_LIST=(
vim
nano-full
openssh-sftp-server
luci-i18n-vlmcsd-zh-cn
luci-i18n-argon-config-zh-cn
luci-i18n-arpbind-zh-cn
luci-i18n-package-manager-zh-cn
# 代理插件
luci-i18n-homeproxy-zh-cn
sing-box
)
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
# =============================================================
# 颜色输出
# =============================================================
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
RED="\033[0;31m"
NC="\033[0m"
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} ImmortalWrt Image Builder 开始构建${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e " Device : Newifi D2"
echo -e " Target : ramips/mt7621"
echo -e " Profile : ${PROFILE}"
echo -e " Output : ${OUTPUT_DIR}"
echo ""
cd "$BUILDER_DIR"
mkdir -p "$FILES_DIR"
# =============================================================
# 复制自定义 files 目录(如果存在)
# =============================================================
if [ -d "${SCRIPT_DIR}/files" ]; then
cp -rf "${SCRIPT_DIR}/files/." "$BUILDER_DIR/files/"
fi
# =============================================================
# 校验 ImageBuilder 环境
# =============================================================
if [ ! -f "Makefile" ]; then
echo -e "${RED}未找到 Makefile,请在 ImageBuilder 目录运行${NC}"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
# =============================================================
# 开始构建固件
# =============================================================
make image \
PROFILE="$PROFILE" \
PACKAGES="$PACKAGES" \
FILES="$FILES_DIR" \
BIN_DIR="$OUTPUT_DIR" \
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME"
# =============================================================
# 输出目录整理
# =============================================================
if [ "$OUTPUT_DIR" != "$PROJECT_OUTPUT_DIR" ]; then
if [ -e "$PROJECT_OUTPUT_DIR" ]; then
BACKUP="${PROJECT_OUTPUT_DIR}.bak.$(date +%Y%m%d%H%M%S)"
mv "$PROJECT_OUTPUT_DIR" "$BACKUP"
fi
mv "$OUTPUT_DIR" "$PROJECT_OUTPUT_DIR"
fi
echo ""
echo -e "${GREEN}构建完成${NC}"
echo -e "固件输出: ${PROJECT_OUTPUT_DIR}"
}
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
version="25.12.0"
# 安装依赖
install_dependencies
# 下载并解压 Image Builder,返回解压后的目录路径
builder_dir="$(download_imagebuilder "$version")"
# 构建固件
build "$builder_dir"
+215
View File
@@ -0,0 +1,215 @@
#!/bin/bash
set -e
# 安装 Image Builder 构建所需依赖
install_dependencies() {
apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
# 下载并解压 FriendlyARM NanoPi R2S 的 Image Builder
# 参数 1: ImmortalWrt 版本号,例如 25.12.0
# 输出: 解压后的 Image Builder 目录绝对路径
download_imagebuilder() {
local version="$1"
local target="rockchip-armv8"
local file="immortalwrt-imagebuilder-$version-$target.Linux-x86_64.tar.zst"
local url="https://downloads.immortalwrt.org/releases/$version/targets/rockchip/armv8/$file"
local folder="immortalwrt-imagebuilder-$version-$target.Linux-x86_64"
local marker="$folder/.ready"
if [ -f "$marker" ]; then
echo "$(pwd)/$folder"
return 0
fi
# 如果目录存在但不完整,先清理
if [ -d "$folder" ] && [ ! -f "$marker" ]; then
echo "[WARN] found incomplete folder, cleaning..." >&2
rm -rf "$folder"
fi
# 下载并覆盖同名压缩包
wget -O "$file" "$url" >&2
# 解压
tar -I zstd -xvf "$file" >&2
touch "$marker"
echo "$(pwd)/$folder"
}
build(){
# =============================================================
# 设备 Profile
# 可在 Image Builder 目录运行 `make info` 查看所有可用 profile
# =============================================================
PROFILE="friendlyarm_nanopi-r2s"
# =============================================================
# 自定义文件目录,映射到固件根文件系统
# =============================================================
FILES_DIR="files"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILDER_DIR="${1}"
# =============================================================
# 固件输出目录
# =============================================================
OUTPUT_DIR="$BUILDER_DIR/r2s_output"
PROJECT_OUTPUT_DIR="$SCRIPT_DIR/r2s_output"
# =============================================================
# 固件文件名附加标识,可留空
# =============================================================
EXTRA_IMAGE_NAME="r2s"
# =============================================================
# 根分区大小,单位 MB;留空则使用 imagebuilder 默认值
# =============================================================
ROOTFS_PARTSIZE="${2:-}"
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
PKG_LIST=(
openssh-sftp-server
vim-full
nano-plus
bash
shadow-chsh
curl
luci-i18n-argon-config-zh-cn
luci-i18n-package-manager-zh-cn
luci-i18n-firewall-zh-cn
luci-i18n-arpbind-zh-cn
# 现代终端工具
ripgrep
diffutils
less
# 分区扩容
luci-i18n-diskman-zh-cn
cfdisk
resize2fs
e2fsprogs
losetup
# 代理插件
luci-i18n-daed-zh-cn
luci-i18n-homeproxy-zh-cn
sing-box
)
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
RED="\033[0;31m"
NC="\033[0m"
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} OpenWrt Image Builder 开始构建${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e " Device : ${YELLOW}FriendlyARM NanoPi R2S${NC}"
echo -e " Target : ${YELLOW}rockchip/armv8${NC}"
echo -e " Profile : ${YELLOW}${PROFILE}${NC}"
echo -e " Files 目录 : ${YELLOW}${FILES_DIR}${NC}"
echo -e " 输出目录 : ${YELLOW}${OUTPUT_DIR}${NC}"
echo -e " 项目输出目录: ${YELLOW}${PROJECT_OUTPUT_DIR}${NC}"
echo -e " 镜像标识 : ${YELLOW}${EXTRA_IMAGE_NAME}${NC}"
echo ""
cd "$BUILDER_DIR"
mkdir -p "$FILES_DIR"
# 复制 files 目录下的自定义文件到 Image Builder 的 files 目录
if [ -d "${SCRIPT_DIR}/files" ]; then
echo -e "${YELLOW}[提示] 复制自定义 files/ 目录到 Image Builder${NC}"
cp ${SCRIPT_DIR}/files/* $BUILDER_DIR/files/ -rf
else
echo -e "${YELLOW}[提示] 未找到自定义 files/ 目录,跳过复制${NC}"
fi
# 禁用 x86 Image Builder 中常见的额外镜像格式;rockchip 目标不存在时会自动跳过
sed -i \
-e 's/^CONFIG_ISO_IMAGES=y/# CONFIG_ISO_IMAGES is not set/' \
-e 's/^CONFIG_QCOW2_IMAGES=y/# CONFIG_QCOW2_IMAGES is not set/' \
-e 's/^CONFIG_VDI_IMAGES=y/# CONFIG_VDI_IMAGES is not set/' \
-e 's/^CONFIG_VMDK_IMAGES=y/# CONFIG_VMDK_IMAGES is not set/' \
-e 's/^CONFIG_VHDX_IMAGES=y/# CONFIG_VHDX_IMAGES is not set/' \
.config
if [ ! -f "Makefile" ]; then
echo -e "${RED}[错误] 未找到 Makefile,请在 imagebuilder 根目录下运行本脚本!${NC}"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
make image \
PROFILE="$PROFILE" \
PACKAGES="$PACKAGES" \
FILES="$FILES_DIR" \
BIN_DIR="$OUTPUT_DIR" \
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME" \
${ROOTFS_PARTSIZE:+ROOTFS_PARTSIZE="$ROOTFS_PARTSIZE"}
if [ $? -eq 0 ]; then
if [ "$OUTPUT_DIR" != "$PROJECT_OUTPUT_DIR" ]; then
if [ ! -d "$OUTPUT_DIR" ]; then
echo -e "${RED} 未找到构建输出目录: ${OUTPUT_DIR}${NC}"
exit 1
fi
if [ -e "$PROJECT_OUTPUT_DIR" ]; then
BACKUP_OUTPUT_DIR="${PROJECT_OUTPUT_DIR}.bak.$(date +%Y%m%d%H%M%S)"
if ! mv "$PROJECT_OUTPUT_DIR" "$BACKUP_OUTPUT_DIR"; then
echo -e "${RED} 备份已有输出目录失败: ${PROJECT_OUTPUT_DIR}${NC}"
exit 1
fi
echo -e "${YELLOW} 已有输出目录,已备份到: ${BACKUP_OUTPUT_DIR}${NC}"
fi
if ! mv "$OUTPUT_DIR" "$PROJECT_OUTPUT_DIR"; then
echo -e "${RED} 移动构建输出目录失败: ${OUTPUT_DIR} -> ${PROJECT_OUTPUT_DIR}${NC}"
exit 1
fi
fi
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} 构建成功!${NC}"
echo -e "${GREEN} 固件路径: ${PROJECT_OUTPUT_DIR}${NC}"
echo -e "${GREEN}========================================${NC}"
else
echo ""
echo -e "${RED}========================================${NC}"
echo -e "${RED} 构建失败,请检查上方错误日志${NC}"
echo -e "${RED}========================================${NC}"
exit 1
fi
}
# 项目根目录,保证从任意位置执行 r2s.sh 都能找到其他资源
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本
version="25.12.0"
# 根分区大小(单位: MB)
rootfs_partsize=600
install_dependencies
builder_dir="$(download_imagebuilder "$version")"
build $builder_dir $rootfs_partsize
+22 -2
View File
@@ -66,6 +66,11 @@ build(){
# ────────────────────────────────────────────
EXTRA_IMAGE_NAME=""
# ────────────────────────────────────────────
# 根分区大小(单位:MB),留空则使用 imagebuilder 默认值
# ────────────────────────────────────────────
ROOTFS_PARTSIZE="${2:-}"
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
@@ -77,6 +82,9 @@ build(){
openssh-sftp-server
vim-full
nano-plus
bash
shadow-chsh
curl
luci-i18n-vlmcsd-zh-cn
luci-i18n-argon-config-zh-cn
luci-i18n-package-manager-zh-cn
@@ -127,6 +135,14 @@ build(){
# 切换到 Image Builder 目录
cd "$BUILDER_DIR"
# 复制 files 目录下的自定义文件到 Image Builder 的 files 目录
if [ -d "${SCRIPT_DIR}/files" ]; then
echo -e "${YELLOW}[提示] 复制自定义 files/ 目录到 Image Builder${NC}"
cp ${SCRIPT_DIR}/files/* $BUILDER_DIR/files/ -rf
else
echo -e "${YELLOW}[提示] 未找到自定义 files/ 目录,跳过复制${NC}"
fi
# 修改.config文件, 不构建以下格式固件
sed -i \
-e 's/^CONFIG_ISO_IMAGES=y/# CONFIG_ISO_IMAGES is not set/' \
@@ -157,7 +173,8 @@ build(){
PACKAGES="$PACKAGES" \
FILES="$FILES_DIR" \
BIN_DIR="$OUTPUT_DIR" \
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME"
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME" \
${ROOTFS_PARTSIZE:+ROOTFS_PARTSIZE="$ROOTFS_PARTSIZE"} # ROOTFS_PARTSIZE 参数不为空才添加
# 构建结果判断
if [ $? -eq 0 ]; then
@@ -205,6 +222,9 @@ cd "$project_dir"
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
version="25.12.0"
# 根分区大小(单位: MB)
rootfs_partsize=600
# 安装依赖
install_dependencies
@@ -212,4 +232,4 @@ install_dependencies
builder_dir="$(download_imagebuilder "$version")"
# 构建固件
build $builder_dir
build $builder_dir $rootfs_partsize