Last active
February 8, 2026 06:03
-
-
Save wbmins/0c9992ef4015ad7f060b16bb1dea6ba7 to your computer and use it in GitHub Desktop.
openwrt-x86_64自定镜像构建脚本,默认包含包(luci zoneinfo-asia lsd curl openssh-sftp-server vim luci-i18n-base-zh-cn luci-app-firewall luci-i18n-firewall-zh-cn luci-i18n-package-manager-zh-cn luci-i18n-momo-zh-cn)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # 如果出错则停止运行 | |
| set -e | |
| # --- 1. 变量配置区 --- | |
| VERSION="${1:-25.12.0-rc4}" | |
| # 自动提取前两位作为 Prefix (例如 25.12) | |
| PREFIX=$(echo $VERSION | cut -d. -f1-2) | |
| ARCH="x86-64" | |
| # 下载链接配置 | |
| DOWNLOAD_URL="https://downloads.openwrt.org/releases/${VERSION}/targets/x86/64/openwrt-imagebuilder-${VERSION}-${ARCH}.Linux-x86_64.tar.zst" | |
| IB_FILE="openwrt-imagebuilder-${VERSION}-${ARCH}.Linux-x86_64.tar.zst" | |
| IB_DIR="openwrt" | |
| # 第三方源相关变量 (momo) | |
| MOMO_DOMAIN="https://momomomo.pages.dev" | |
| MOMO_REPO_URL="${MOMO_DOMAIN}/openwrt-${PREFIX}/x86_64/momo" | |
| MOMO_KEY_URL="${MOMO_DOMAIN}/public-key.pem" | |
| # 自定义安装包列表 | |
| PACKAGES="luci zoneinfo-asia lsd curl openssh-sftp-server vim \ | |
| luci-i18n-base-zh-cn luci-app-firewall luci-i18n-firewall-zh-cn \ | |
| luci-i18n-package-manager-zh-cn luci-i18n-momo-zh-cn" | |
| # --- 2. 下载与解压 --- | |
| if [ ! -f "$IB_FILE" ]; then | |
| echo ">>>> 正在下载 ImageBuilder..." | |
| wget -q --show-progress -O "$IB_FILE" "$DOWNLOAD_URL" | |
| else | |
| echo ">>>> ImageBuilder 已存在,跳过下载。" | |
| fi | |
| echo ">>>> 正在清理并重新解压..." | |
| rm -rf "$IB_DIR" | |
| mkdir -p "$IB_DIR" | |
| tar -I zstd -xvf "$IB_FILE" -C "$IB_DIR" --strip-components=1 | |
| cd "$IB_DIR" | |
| # --- 3. 配置固件内置环境 (files 目录 - 固件启动后生效) --- | |
| echo ">>>> 设置固件内置 Feed 源与公钥..." | |
| mkdir -p files/etc/apk/keys/ | |
| mkdir -p files/etc/apk/repositories.d/ | |
| ###############################自定义设置设置############################### | |
| mkdir -p files/etc/uci-defaults | |
| cat <<'EOF' > files/etc/uci-defaults/99-init-settings | |
| #!/bin/sh | |
| # 禁用 IPv6(DHCP/RA) | |
| uci delete dhcp.lan.dhcpv6 2>/dev/null | |
| uci delete dhcp.lan.ra 2>/dev/null | |
| uci delete dhcp.lan.ra_slaac 2>/dev/null | |
| uci delete dhcp.lan.ra_flags 2>/dev/null | |
| uci set dhcp.@dnsmasq[0].filter_aaaa='1' | |
| # 禁用 DNS 缓存 | |
| uci set dhcp.@dnsmasq[0].cachesize='0' | |
| # 时区 | |
| uci set system.@system[0].zonename='Asia/Shanghai' | |
| # 禁用 attendedsysupgrade 自动检查 | |
| uci set attendedsysupgrade.client.login_check_for_upgrades='0' | |
| #填写IP地址 | |
| uci set network.lan.ipaddr='192.168.1.2' | |
| #填写子网掩码 | |
| uci set network.lan.netmask='255.255.255.0' | |
| #填写网关 | |
| uci set network.lan.gateway='192.168.1.1' | |
| #填写DNS服务器 | |
| uci set network.lan.dns='192.168.1.1' | |
| uci commit | |
| #重启网络 | |
| /etc/init.d/network restart | |
| # 禁用 IPv6 服务 | |
| /etc/init.d/odhcpd disable | |
| # sysctl | |
| grep -q disable_ipv6 /etc/sysctl.conf || \ | |
| echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf | |
| # 禁用 sing-box | |
| /etc/init.d/sing-box disable 2>/dev/null | |
| # shell 环境 | |
| cat <<'PROFILE_EOF' >> /etc/profile | |
| export PS1="\033[1;34m# \033[1;36m\u \033[0m@ \033[1;32m\h \033[0min \033[1;33m\w \033[0m[\$(date +%T)]\n\033[1;31m✦\033[0m " | |
| alias la='lsd -lah' | |
| alias uu="apk update && apk list -u" | |
| alias ua="apk upgrade" | |
| PROFILE_EOF | |
| exit 0 | |
| EOF | |
| chmod +x files/etc/uci-defaults/99-init-settings | |
| ###############################自定义设置设置############################### | |
| # 下载 momo 源公钥到固件内部 | |
| curl -sL "${MOMO_KEY_URL}" -o "files/etc/apk/keys/momo.pem" | |
| # 写入 Feed 地址到固件内部 (指向 packages.adb) | |
| echo "${MOMO_REPO_URL}/packages.adb" > files/etc/apk/repositories.d/customfeeds.list | |
| # --- 4. 配置 ImageBuilder 构建环境 (宿主机环境 - 编译时下载包生效) --- | |
| echo ">>>> 配置构建环境签名校验..." | |
| mkdir -p keys | |
| # 复制公钥到 IB 根目录的 keys 文件夹供 apk 使用 | |
| cp files/etc/apk/keys/momo.pem keys/ | |
| # 添加第三方源到 ImageBuilder 的 repositories 配置文件 | |
| if ! grep -q "${MOMO_REPO_URL}" repositories; then | |
| echo "${MOMO_REPO_URL}/packages.adb" >> repositories | |
| fi | |
| # --- 5. 执行构建 --- | |
| echo ">>>> 开始构建固件 (Target: ext4 combined)..." | |
| # 禁用 SQUASHFS 和 EFI,只生成你需要的 ext4 combined 镜像 | |
| make image PROFILE="generic" \ | |
| FILESYSTEMS="ext4" \ | |
| CONFIG_TARGET_ROOTFS_SQUASHFS=n \ | |
| CONFIG_GRUB_EFI_IMAGES=n \ | |
| PACKAGES="${PACKAGES}" \ | |
| FILES="files" | |
| # --- 6. 整理输出文件 --- | |
| OUTPUT_DIR="../output" | |
| mkdir -p "$OUTPUT_DIR" | |
| # 你指定的最终构建位置 (tmp 目录下) | |
| # 对应变量:build_dir/target-x86_64_musl/linux-x86_64/tmp/ | |
| TMP_PATH="build_dir/target-x86_64_musl/linux-x86_64/tmp/openwrt-${VERSION}-x86-64-generic-ext4-combined.img.gz" | |
| echo ">>>> 正在提取固件..." | |
| if [ -f "$TMP_PATH" ]; then | |
| cp "$TMP_PATH" "$OUTPUT_DIR/openwrt-${VERSION}-combined-ext4.img.gz" | |
| echo "------------------------------------------------" | |
| echo "构建成功!" | |
| echo "固件原始位置: $TMP_PATH" | |
| echo "最终输出位置: $OUTPUT_DIR/openwrt-${VERSION}-combined-ext4.img.gz" | |
| echo "------------------------------------------------" | |
| else | |
| # 如果 tmp 目录找不到,尝试在常规 bin 目录寻找(兜底方案) | |
| FINAL_IMAGE=$(find bin/targets/x86/64/ -name "*-ext4-combined.img.gz" | head -n 1) | |
| if [ -n "$FINAL_IMAGE" ]; then | |
| cp "$FINAL_IMAGE" "$OUTPUT_DIR/openwrt-${VERSION}-combined-ext4.img.gz" | |
| echo "构建成功 (从 bin 目录提取)!" | |
| else | |
| echo "错误:无法在 $TMP_PATH 或 bin 目录下找到生成的镜像文件。" | |
| exit 1 | |
| fi | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment