ImageBuilder入门使用指南
下载ImageBuilder
https://mirrors.aliyun.com/openwrt/releases/24.10.2/targets/x86/64/
https://mirror-03.infra.openwrt.org/releases/24.10.2/targets/x86/64/
# 下载
wget https://mirrors.aliyun.com/openwrt/releases/24.10.2/targets/x86/64/openwrt-imagebuilder-24.10.2-x86-64.Linux-x86_64.tar.zst
# 解压
tar --use-compress-program=unzstd -xvf openwrt-imagebuilder-24.10.2-x86-64.Linux-x86_64.tar.zst
# 进入ImageBuilder目录
cd openwrt-imagebuilder-24.10.2-x86-64.Linux-x86_64/
具体我改了哪些文件 我将改动的文件托管在github
https://github.com/wukongdaily/ib-overlay
# 下载整个项目的 master.zip
wget -O master.zip https://gh-proxy.com/https://github.com/wukongdaily/ib-overlay/archive/refs/heads/master.zip
# 解压 master.zip 到当前目录,去除无关文件
unzip master.zip -d tempdir
rm -f tempdir/*/.gitignore tempdir/*/README.md tempdir/*/LICENSE
mv tempdir/*/* ./
rm -rf tempdir
ls -lah
dufs
目录结构
.config
此文件是全部配置,一般不需要动。如果 想去掉ext4 格式 可以在这里改
extra-packages
这是我新建的目录 可以存放run文件。也可以存放自定义ipk 但最好是run 因为这样比较整齐 是一个整体
files
这也是我新建的目录 它对应的就是openwrt的根目录,比如files/etc 可覆盖openwrt系统里的/etc
prepare-packages.sh
此脚本用于 make image之前的准备工作,用于将extra-packages
中的run解压后的ipk 或者原本的ipk复制到packages
中
packages
用于存放自定义ipk的,但是我为了整齐 为了不乱,我采用脚本方式 自动放入
repositories.conf
这是仓库地址 你可以修改它 将ImageBuilder工具中的仓库地址替换为阿里云仓库
.config 文件设置
在ImageBuilder工具的根目录中有一个隐藏文件叫做 .config
将下列2项设置为n 代表不构建ext4格式的固件 节省时间
CONFIG_USES_EXT4=n
CONFIG_TARGET_ROOTFS_EXT4FS=n
repositories.conf 仓库设置
# 将ImageBuilder工具中的仓库地址替换为阿里云仓库 位于repositories.conf
## Remote package repositories
#src/gz openwrt_core https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/packages
#src/gz openwrt_base https://downloads.openwrt.org/releases/24.10.2/packages/x86_64/base
#src/gz openwrt_kmods https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/kmods/6.6.93-1-1745ebad77278f5cdc8330d17a3f43d6
#src/gz openwrt_luci https://downloads.openwrt.org/releases/24.10.2/packages/x86_64/luci
#src/gz openwrt_packages https://downloads.openwrt.org/releases/24.10.2/packages/x86_64/packages
#src/gz openwrt_routing https://downloads.openwrt.org/releases/24.10.2/packages/x86_64/routing
#src/gz openwrt_telephony https://downloads.openwrt.org/releases/24.10.2/packages/x86_64/telephony
src/gz openwrt_core https://mirrors.aliyun.com/openwrt/releases/24.10.2/targets/x86/64/packages
src/gz openwrt_base https://mirrors.aliyun.com/openwrt/releases/24.10.2/packages/x86_64/base
src/gz openwrt_kmods https://mirrors.aliyun.com/openwrt/releases/24.10.2/targets/x86/64/kmods/6.6.93-1-1745ebad77278f5cdc8330d17a3f43d6
src/gz openwrt_luci https://mirrors.aliyun.com/openwrt/releases/24.10.2/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.aliyun.com/openwrt/releases/24.10.2/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.aliyun.com/openwrt/releases/24.10.2/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.aliyun.com/openwrt/releases/24.10.2/packages/x86_64/telephony
## This is the local package repository, do not remove!
src imagebuilder file:packages
## 可以不检查签名 进一步节省构建时间
#option check_signature
files目录结构如下
files/
├── etc
│ ├── banner
│ ├── openclash
│ │ └── core
│ │ └── clash_meta
│ ├── opkg
│ │ └── distfeeds.conf
│ └── uci-defaults
│ └── 99-init.sh
└── mnt
└── shell
└── istore.sh
files目录对应openwrt目录示意图
准备第三方包 prepare-packages.sh
你可以将所有run文件放入extra-packages目录 写一个脚本叫
prepare-packages.sh
提示:如何解压run文件?sh "$run_file" --target "$dest" --noexec
#!/bin/sh
# prepare-packages.sh
BASE_DIR="extra-packages"
TEMP_DIR="$BASE_DIR/temp-unpack"
TARGET_DIR="packages"
# 清理旧的临时解压目录和 packages 目录
rm -rf "$TEMP_DIR" "$TARGET_DIR"
mkdir -p "$TEMP_DIR" "$TARGET_DIR"
# 遍历 extra-packages 下的所有 .run 文件
for run_file in "$BASE_DIR"/*.run; do
[ -e "$run_file" ] || continue
echo "🧩 解压 $run_file -> $TEMP_DIR"
sh "$run_file" --target "$TEMP_DIR" --noexec
done
# 收集所有解压出的 .ipk 文件
find "$TEMP_DIR" -type f -name "*.ipk" -exec cp {} "$TARGET_DIR"/ \;
# 拷贝 extra-packages 所有 .ipk 文件
find "$BASE_DIR" -maxdepth 1 -type f -name "*.ipk" -exec cp {} "$TARGET_DIR"/ \;
echo "✅ 所有 .ipk 已整理至 $TARGET_DIR/"
extra-packages 可用于放第三方的run或者ipk
root@wk:/vol1/1000/imagebuilder/openwrt-imagebuilder-24.10.2-x86-64.Linux-x86_64# tree extra-packages -L 1
extra-packages
├── AdGuardHome_v0.107.62_x86_64.run
├── homeproxy_25.172.44115.45ab98e_x86_64_all_sdk_24.10.run
├── luci-app-filetransfer.run
├── luci-app-quickstart_0.9.7-1_x86_64.run
├── luci-app-store_x86-64_0.1.29-5.run
├── luci-theme-argon_2.4.2.run
├── nikki_v1.23.2_x86_64.run
├── openclash-x86-64-v0.46.110.run
├── passwall_x86_64_25.7.6-1.run
├── ssrp_x86_64-190-r78.run
构建之前 安装必备工具
sudo apt update -y
sudo apt install gawk -y
🚀 构建命令 build.sh
#!/bin/sh
# 先执行 prepare-packages.sh 此脚本用于拷贝所有自定义ipk到packages目录
sh prepare-packages.sh
# 以下是仓库内的包名 你可以在openwrt官网仓库查询插件名称
# https://downloads.openwrt.org/releases/24.10.2/packages/x86_64/luci/
# https://mirrors.aliyun.com/openwrt/releases/24.10.2/packages/x86_64/luci/
BASE_PACKAGES=""
BASE_PACKAGES="$BASE_PACKAGES curl"
BASE_PACKAGES="$BASE_PACKAGES -dnsmasq"
# 此处为什么勾选完整版dnsmasq-full 因为openclash需要该依赖 由于dnsmasq和dnsmasq-full 在安装上互斥 因此只能保留一个 减号代表去除
BASE_PACKAGES="$BASE_PACKAGES dnsmasq-full"
BASE_PACKAGES="$BASE_PACKAGES luci"
BASE_PACKAGES="$BASE_PACKAGES bash"
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-ttyd-zh-cn"
BASE_PACKAGES="$BASE_PACKAGES openssh-sftp-server"
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-package-manager-zh-cn"
BASE_PACKAGES="$BASE_PACKAGES luci-compat"
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-firewall-zh-cn"
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-base-zh-cn"
# 如果勾选了docker 务必保证软件包大小ROOTFS_PARTSIZE至少大于512 目前1024
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-dockerman-zh-cn"
# 文件管理器
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-filemanager-zh-cn"
# openlist用来平替alist 但阿里镜像仓库暂时没有 若勾选此项需在repositories.conf中启用官方源
# 其实可以弯道实现安装openlist 因为istore商店里有该插件 你可以勾选下列的luci-app-store
#BASE_PACKAGES="$BASE_PACKAGES luci-i18n-openlist-zh-cn"
#打印机相关
BASE_PACKAGES="$BASE_PACKAGES luci-i18n-p910nd-zh-cn"
#BASE_PACKAGES="$BASE_PACKAGES luci-i18n-openvpn-zh-cn"
# 下面是自定义的包 你可以用#注释掉不需要的包 也可以添加更多的包
# 使用条件:在extra-packages下放置了相关run或者ipk
CUSTOM_PACKAGES=""
# 第三方插件 文件传输 luci-app-filetransfer
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-lib-fs"
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-lua-runtime"
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-filetransfer"
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-i18n-filetransfer-zh-cn"
# 第三方插件 argon主题 luci-theme-argon 紫色主题 3个ipk
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-theme-argon"
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-i18n-argon-config-zh-cn"
CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-argon-config"
# 第三方插件 istore 应用商店
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-store"
# 第三方插件 首页和网络向导
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-quickstart"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-i18n-quickstart-zh-cn"
# 第三方插件 luci-app-adguardhome 去广告
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-adguardhome"
# 第三方插件 openclash 内核放在files/etc/openclash/core/clash_meta 若不勾选则不集成
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-openclash"
# 第三方插件 luci-app-passwall 包含内部组件
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-passwall"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-i18n-passwall-zh-cn"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES geoview"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES xray-core"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES sing-box"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES hysteria"
# 第三方插件 luci-app-ssr-plus 尤其注意要包含 shadowsocks-libev-ss-server
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-ssr-plus"
# 第三方插件 luci-app-homeproxy
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-i18n-homeproxy-zh-cn"
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-app-homeproxy"
# 第三方插件 luci-app-nikki
#CUSTOM_PACKAGES="$CUSTOM_PACKAGES luci-i18n-nikki-zh-cn"
# ✅ 校验 CUSTOM_PACKAGES 中的包是否都存在于 packages_names.txt
package_file="packages_names.txt"
for pkg in $CUSTOM_PACKAGES; do
if ! grep -qx "$pkg" "$package_file"; then
echo "❌ 错误:包 $pkg 不存在于 $package_file 中 请检查自定义包名是否正确!"
exit 1
fi
done
# 拼接
PACKAGES="$BASE_PACKAGES $CUSTOM_PACKAGES"
# 若构建openclash 则添加内核
if echo "$PACKAGES" | grep -q "luci-app-openclash"; then
echo "✅ [构建逻辑] 已选择 luci-app-openclash,添加 openclash core"
mkdir -p files/etc/openclash/core
if [ -f extra-packages/temp-unpack/clash_meta ]; then
cp extra-packages/temp-unpack/clash_meta files/etc/openclash/core/clash_meta
else
echo "⚠️ [警告] 缺少 clash_meta 内核,跳过复制,你应该确保extra-packages目录下有相关run文件"
fi
else
echo "⚪️ [构建逻辑] 未选择 luci-app-openclash"
[ -d files/etc/openclash ] && rm -rf files/etc/openclash
fi
# 若构建luci-app-adguardhome 则添加内核
if echo "$PACKAGES" | grep -q "luci-app-adguardhome"; then
echo "✅ [构建逻辑] 已选择 luci-app-adguardhome,添加 AdGuardHome core"
if [ -f extra-packages/temp-unpack/AdGuardHome/AdGuardHome ]; then
cp extra-packages/temp-unpack/AdGuardHome/AdGuardHome files/usr/bin/AdGuardHome
else
echo "⚠️ [警告] 缺少 AdGuardHome内核,跳过复制,你应该确保extra-packages目录下有相关run文件"
fi
else
echo "⚪️ [构建逻辑] 未选择 luci-app-adguardhome"
[ -f files/usr/bin/AdGuardHome ] && rm -f files/usr/bin/AdGuardHome
fi
# 开始构建 软件包大小1024代表1GB
# 可选参数FILES=files 代表files目录中若有文件 则覆盖openwrt的根目录 原样注入
# 例如files/etc对应覆盖openwrt系统/etc目录中的文件
# 例如files/mnt对应覆盖openwrt系统/mnt目录中的文件
OUTPUT_DIR=$(pwd)/output
mkdir -p $OUTPUT_DIR
make image PROFILE=generic PACKAGES="$PACKAGES" FILES=files ROOTFS_PARTSIZE=1024 BIN_DIR=$OUTPUT_DIR
ls -lah $OUTPUT_DIR
评论区