#!/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=( 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"