Skip to content

Instantly share code, notes, and snippets.

@wbmins
Last active February 8, 2026 06:03
Show Gist options
  • Select an option

  • Save wbmins/0c9992ef4015ad7f060b16bb1dea6ba7 to your computer and use it in GitHub Desktop.

Select an option

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)
#!/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