8 Commits

Author SHA1 Message Date
Olia Lisa fe9ec13323 feat: 增加x86-64固件打包iso镜像功能 2026-07-25 23:47:21 +08:00
Olia Lisa 3f83643cb2 refactor: 抽取插件包变量PACKAGES 2026-07-24 15:56:41 +08:00
Olia Lisa 8fa54c5ae3 fix: 修改lan口ip脚本复制到构建后, 再经行修改 2026-07-24 12:17:56 +08:00
Olia Lisa 6aa3a55f32 doc: 修正注释 2026-07-24 11:38:48 +08:00
Olia Lisa 3d77814af4 refactor: 重构"构建结果判断"代码片段 2026-07-24 11:36:25 +08:00
Olia Lisa cfd573c5c8 refactor: 调整代码顺序 2026-07-24 11:14:42 +08:00
Olia Lisa a9b7f09e06 refactor: 抽取函数, 统一放入common.sh 2026-07-24 11:13:07 +08:00
Olia Lisa 2b5026d76c refactor: 调整代码顺序 2026-07-23 14:02:32 +08:00
7 changed files with 344 additions and 428 deletions
+30
View File
@@ -0,0 +1,30 @@
# EditorConfig is awesome: https://EditorConfig.org
# 根目录配置文件
root = true
# 默认规则
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
# Shell scripts
[*.sh]
indent_style = space
indent_size = 2
# Markdown documents
[*.md]
indent_style = space
indent_size = 2
trim_trailing_whitespace = false
[*.{json,yml,yaml}]
indent_style = space
indent_size = 2
+62
View File
@@ -0,0 +1,62 @@
#!/bin/bash
# 安装 Image Builder 构建所需依赖
install_dependencies() {
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
# =============================================================
# 交互输入函数
# 参数1: 提示信息
# 参数2: 默认值
# 返回: 用户输入值,直接回车返回默认值
# =============================================================
ask_input() {
local prompt="$1"
local default="$2"
read -p "${prompt} [ 默认: ${default} ]: " value
if [ -z "$value" ]; then
echo "$default"
else
echo "$value"
fi
}
# 获取lan口ip
input_lan_ip() {
local default_ip="$1"
while true; do
local ip
ip=$(ask_input "请输入lan口ip" "$default_ip")
if valid_ipv4 "$ip"; then
echo "$ip"
return 0
else
echo "[错误] IP地址格式不正确,请重新输入" >&2
fi
done
}
valid_ipv4() {
local ip="$1"
# 第一层:检查格式,必须是4段数字
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
# 第二层:检查每段范围
echo "$ip" | awk -F. '
$1>=0 && $1<=255 &&
$2>=0 && $2<=255 &&
$3>=0 && $3<=255 &&
$4>=0 && $4<=255
' | grep -q . || return 1
return 0
}
+41 -89
View File
@@ -1,10 +1,7 @@
#!/bin/bash
set -e
install_dependencies() {
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
source common.sh
download_imagebuilder() {
local version="$1"
@@ -49,7 +46,12 @@ build() {
# ────────────────────────────────────────────
# lan口ip
# ────────────────────────────────────────────
LAN_IP=${2}
LAN_IP="${2}"
# =============================================================
# 插件包列表
# =============================================================
PACKAGES="${3}"
# =============================================================
# 固件输出目录
@@ -62,25 +64,6 @@ build() {
# =============================================================
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[@]}")
# =============================================================
# 颜色输出
# =============================================================
@@ -102,15 +85,6 @@ build() {
mkdir -p "$FILES_DIR"
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
# =============================================================
# 复制自定义 files 目录(如果存在)
# =============================================================
@@ -118,6 +92,15 @@ build() {
cp -rf "${SCRIPT_DIR}/files/." "$BUILDER_DIR/files/"
fi
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
# =============================================================
# 校验 ImageBuilder 环境
@@ -156,61 +139,6 @@ build() {
echo -e "固件输出: ${PROJECT_OUTPUT_DIR}"
}
# =============================================================
# 交互输入函数
# 参数1: 提示信息
# 参数2: 默认值
# 返回: 用户输入值,直接回车返回默认值
# =============================================================
ask_input() {
local prompt="$1"
local default="$2"
read -p "${prompt} [ 默认: ${default} ]: " value
if [ -z "$value" ]; then
echo "$default"
else
echo "$value"
fi
}
# 获取lan口ip
input_lan_ip() {
local default_ip="$1"
while true; do
local ip
ip=$(ask_input "请输入lan口ip" "$default_ip")
if valid_ipv4 "$ip"; then
echo "$ip"
return 0
else
echo "[错误] IP地址格式不正确,请重新输入" >&2
fi
done
}
valid_ipv4() {
local ip="$1"
# 第一层:检查格式,必须是4段数字
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
# 第二层:检查每段范围
echo "$ip" | awk -F. '
$1>=0 && $1<=255 &&
$2>=0 && $2<=255 &&
$3>=0 && $3<=255 &&
$4>=0 && $4<=255
' | grep -q . || return 1
return 0
}
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
default_version="25.12.1"
@@ -220,8 +148,32 @@ version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
default_lan_ip="192.168.1.1"
lan_ip=$(input_lan_ip "$default_lan_ip")
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
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[@]}") # 动态拼接成字符串
# 进入项目根目
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
install_dependencies
builder_dir="$(download_imagebuilder "$version")"
build $builder_dir $lan_ip
build "$builder_dir" "$lan_ip" "$packages"
+43 -88
View File
@@ -1,10 +1,7 @@
#!/bin/bash
set -e
install_dependencies() {
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
source common.sh
download_imagebuilder() {
local version="$1"
@@ -32,24 +29,7 @@ download_imagebuilder() {
echo "$(pwd)/$folder"
}
# =============================================================
# 交互输入函数
# 参数1: 提示信息
# 参数2: 默认值
# 返回: 用户输入值,直接回车返回默认值
# =============================================================
ask_input() {
local prompt="$1"
local default="$2"
read -p "${prompt} [ 默认: ${default} ]: " value
if [ -z "$value" ]; then
echo "$default"
else
echo "$value"
fi
}
build() {
# =============================================================
@@ -65,11 +45,16 @@ build() {
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILDER_DIR="$1"
# ────────────────────────────────────────────
# =============================================================
# lan口ip
# ────────────────────────────────────────────
# =============================================================
LAN_IP=${2}
# =============================================================
# 插件包列表
# =============================================================
PACKAGES=${3}
# =============================================================
# 固件输出目录
# =============================================================
@@ -81,25 +66,6 @@ build() {
# =============================================================
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[@]}")
# =============================================================
# 颜色输出
# =============================================================
@@ -121,14 +87,6 @@ build() {
mkdir -p "$FILES_DIR"
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
# =============================================================
# 复制自定义 files 目录(如果存在)
@@ -137,6 +95,15 @@ build() {
cp -rf "${SCRIPT_DIR}/files/." "$BUILDER_DIR/files/"
fi
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
# =============================================================
# 校验 ImageBuilder 环境
# =============================================================
@@ -174,43 +141,6 @@ build() {
echo -e "固件输出: ${PROJECT_OUTPUT_DIR}"
}
# 获取lan口ip
input_lan_ip() {
local default_ip="$1"
while true; do
local ip
ip=$(ask_input "请输入lan口ip" "$default_ip")
if valid_ipv4 "$ip"; then
echo "$ip"
return 0
else
echo "[错误] IP地址格式不正确,请重新输入" >&2
fi
done
}
valid_ipv4() {
local ip="$1"
# 第一层:检查格式,必须是4段数字
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
# 第二层:检查每段范围
echo "$ip" | awk -F. '
$1>=0 && $1<=255 &&
$2>=0 && $2<=255 &&
$3>=0 && $3<=255 &&
$4>=0 && $4<=255
' | grep -q . || return 1
return 0
}
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
default_version="25.12.1"
@@ -220,6 +150,31 @@ version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
default_lan_ip="192.168.1.1"
lan_ip=$(input_lan_ip "$default_lan_ip")
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
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[@]}") # 动态拼接成字符串
# 进入项目根目
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 安装依赖
install_dependencies
@@ -227,4 +182,4 @@ install_dependencies
builder_dir="$(download_imagebuilder "$version")"
# 构建固件
build "$builder_dir" $lan_ip
build "$builder_dir" "$lan_ip" "$packages"
+53 -109
View File
@@ -1,11 +1,7 @@
#!/bin/bash
set -e
# 安装 Image Builder 构建所需依赖
install_dependencies() {
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
source common.sh
# 下载并解压 FriendlyARM NanoPi R2S 的 Image Builder
# 参数 1: ImmortalWrt 版本号,例如 25.12.1
@@ -77,42 +73,10 @@ build(){
# ────────────────────────────────────────────
LAN_IP=${3}
# =============================================================
# ────────────────────────────────────────────
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
PKG_LIST=(
vim-full
nano-plus
bash
curl
shadow-chsh
openssh-sftp-server
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[@]}")
# ────────────────────────────────────────────
PACKAGES="${4}"
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
@@ -133,24 +97,22 @@ build(){
cd "$BUILDER_DIR"
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
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
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
if [ ! -f "Makefile" ]; then
echo -e "${RED}[错误] 未找到 Makefile,请在 imagebuilder 根目录下运行本脚本!${NC}"
@@ -203,64 +165,6 @@ build(){
fi
}
# =============================================================
# 交互输入函数
# 参数1: 提示信息
# 参数2: 默认值
# 返回: 用户输入值,直接回车返回默认值
# =============================================================
ask_input() {
local prompt="$1"
local default="$2"
read -p "${prompt} [ 默认: ${default} ]: " value
if [ -z "$value" ]; then
echo "$default"
else
echo "$value"
fi
}
# 获取lan口ip
input_lan_ip() {
local default_ip="$1"
while true; do
local ip
ip=$(ask_input "请输入lan口ip" "$default_ip")
if valid_ipv4 "$ip"; then
echo "$ip"
return 0
else
echo "[错误] IP地址格式不正确,请重新输入" >&2
fi
done
}
valid_ipv4() {
local ip="$1"
# 第一层:检查格式,必须是4段数字
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
# 第二层:检查每段范围
echo "$ip" | awk -F. '
$1>=0 && $1<=255 &&
$2>=0 && $2<=255 &&
$3>=0 && $3<=255 &&
$4>=0 && $4<=255
' | grep -q . || return 1
return 0
}
# 项目根目录,保证从任意位置执行 r2s.sh 都能找到其他资源
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
default_version="25.12.1"
version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
@@ -269,12 +173,52 @@ version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
default_rootfs_partsize="600"
rootfs_partsize=$(ask_input "请输入根分区大小(MB)" "$default_rootfs_partsize")
# 项目根目录
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# lan口ip
default_lan_ip="192.168.1.1"
lan_ip=$(input_lan_ip "$default_lan_ip")
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
pkg_list=(
vim-full
nano-plus
bash
curl
shadow-chsh
openssh-sftp-server
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[@]}") # 动态拼接成字符串
install_dependencies
builder_dir="$(download_imagebuilder "$version")"
build $builder_dir $rootfs_partsize $lan_ip
build "$builder_dir" "$rootfs_partsize" "$lan_ip" "$packages"
+74 -127
View File
@@ -1,11 +1,7 @@
#!/bin/bash
set -e
# 安装 Image Builder 构建所需依赖
install_dependencies() {
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
}
source common.sh
# 下载并解压 x86-64 的 Image Builder
# 参数 1: ImmortalWrt 版本号,例如 25.12.1
@@ -74,52 +70,12 @@ build(){
# ────────────────────────────────────────────
# lan口ip
# ────────────────────────────────────────────
LAN_IP=${3}
LAN_IP="${3}"
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
PKG_LIST=(
-dropbear
openssh-server
vim-full
nano-plus
bash
curl
shadow-chsh
openssh-sftp-server
luci-i18n-vlmcsd-zh-cn
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
eza
fish
# 分区扩容
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[@]}")
# ────────────────────────────────────────────
# 插件包列表字符串
# ────────────────────────────────────────────
PACKAGES="${4}"
# 颜色输出
@@ -147,14 +103,6 @@ build(){
mkdir -p "$FILES_DIR"
fi
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
# 复制 files 目录下的自定义文件到 Image Builder 的 files 目录
if [ -d "${SCRIPT_DIR}/files" ]; then
@@ -164,6 +112,15 @@ build(){
echo -e "${YELLOW}[提示] 未找到自定义 files/ 目录,跳过复制${NC}"
fi
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
if [ -e "$LAN_SETTING_FILE" ]; then
# 根据用户输入的 LAN_IP 修改默认 IP
sed -i \
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
"$LAN_SETTING_FILE"
fi
# 修改.config文件, 不构建以下格式固件
sed -i \
-e 's/^CONFIG_ISO_IMAGES=y/# CONFIG_ISO_IMAGES is not set/' \
@@ -191,8 +148,16 @@ build(){
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME" \
${ROOTFS_PARTSIZE:+ROOTFS_PARTSIZE="$ROOTFS_PARTSIZE"} # ROOTFS_PARTSIZE 参数不为空才添加
# 构建结果判断
if [ $? -eq 0 ]; then
# 构建失败
if [ $? -ne 0 ]; then
echo ""
echo -e "${RED}========================================${NC}"
echo -e "${RED} 构建失败,请检查上方错误日志${NC}"
echo -e "${RED}========================================${NC}"
exit 1
fi
# 构建成功
if [ "$OUTPUT_DIR" != "$PROJECT_OUTPUT_DIR" ]; then
if [ ! -d "$OUTPUT_DIR" ]; then
echo -e "${RED} 未找到构建输出目录: ${OUTPUT_DIR}${NC}"
@@ -201,10 +166,12 @@ build(){
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
@@ -213,79 +180,14 @@ build(){
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
}
# =============================================================
# 交互输入函数
# 参数1: 提示信息
# 参数2: 默认值
# 返回: 用户输入值,直接回车返回默认值
# =============================================================
ask_input() {
local prompt="$1"
local default="$2"
read -p "${prompt} [ 默认: ${default} ]: " value
if [ -z "$value" ]; then
echo "$default"
else
echo "$value"
fi
}
# 获取lan口ip
input_lan_ip() {
local default_ip="$1"
while true; do
local ip
ip=$(ask_input "请输入lan口ip" "$default_ip")
if valid_ipv4 "$ip"; then
echo "$ip"
return 0
else
echo "[错误] IP地址格式不正确,请重新输入" >&2
fi
done
}
valid_ipv4() {
local ip="$1"
# 第一层:检查格式,必须是4段数字
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
# 第二层:检查每段范围
echo "$ip" | awk -F. '
$1>=0 && $1<=255 &&
$2>=0 && $2<=255 &&
$3>=0 && $3<=255 &&
$4>=0 && $4<=255
' | grep -q . || return 1
return 0
}
# 项目根目录,用来保证从任意位置执行 main.sh 都能找到其他脚本
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
default_version="25.12.1"
@@ -298,7 +200,52 @@ rootfs_partsize=$(ask_input "请输入根分区大小(MB)" "$default_rootfs_part
# lan口ip
default_lan_ip="192.168.1.1"
lan_ip=$(input_lan_ip "$default_lan_ip")
echo $lan_ip
# =============================================================
# 插件包列表
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
# - 每行一个,方便增删注释
# =============================================================
pkg_list=(
-dropbear
openssh-server
vim-full
nano-plus
bash
curl
shadow-chsh
openssh-sftp-server
luci-i18n-vlmcsd-zh-cn
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
eza
fish
# 分区扩容
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[@]}") # 动态拼接成字符串
# 进入项目根目
project_dir="$(cd "$(dirname "$0")" && pwd)"
cd "$project_dir"
# 安装依赖
install_dependencies
@@ -307,4 +254,4 @@ install_dependencies
builder_dir="$(download_imagebuilder "$version")"
# 构建固件
build $builder_dir $rootfs_partsize $lan_ip
build "$builder_dir" "$rootfs_partsize" "$lan_ip" "$packages"
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
set -e
source $(pwd)/x86-64.sh
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd ${SCRIPT_DIR}
# 如果img-installer文件夹不存在, 下载img-installer
if [ ! -d "${SCRIPT_DIR}/img-installer" ]; then
git clone https://github.com/wukongdaily/img-installer.git
fi
chmod +x "${SCRIPT_DIR}/img-installer/custom.sh"
chmod +x "${SCRIPT_DIR}/img-installer/supportFiles/custom/build.sh"
# 构建ISO固件
PROJECT_OUTPUT_DIR="${SCRIPT_DIR}/x86-64_output"
TARGET_FILE=$(ls ${PROJECT_OUTPUT_DIR}/*ext4-combined.img.gz)
INPUT_FILE=${SCRIPT_DIR}/img-installer/input.img.gz
cp $TARGET_FILE $INPUT_FILE
cd ${SCRIPT_DIR}/img-installer
bash autobuild/autobuild.sh "$INPUT_FILE"
mv ${SCRIPT_DIR}/img-installer/output/custom-installer-x86_64.iso ${PROJECT_OUTPUT_DIR}
echo ""
echo 构建 ISO 镜像成功