N5105‑G47 (I226 5 网口 4 口 POE) ESXi8.0 虚拟机部署 OpenWrt‑25.12 完整实录

硬件环境:N5105‑G47,5×I226 2.5G 网口,4 口支持 POE 供电;ESXi 8.0 已经部署完成,网卡直通已经配置完毕;OpenWrt‑25.12.5 x86‑64 ext4‑combined‑efi;虚拟机硬盘分配50G;SSH 工具使用 XTerminal‑5.6.6‑win‑x64‑portable;Windows 工具 StarWind V2V Converter 直接把 img 转换上传 vmdk 到 ESXi 数据存储。

一、前置准备 & 全部软件下载地址

OpenWrt 镜像务必选择ext4‑combined‑efi,不要 squashfs,适配 50G 大磁盘扩容。

软件 / 固件 说明 下载地址
OpenWrt‑25.12.5 x86‑64 ext4‑combined‑efi.img.gz 系统镜像,UEFI 启动,支持大磁盘 中科大镜像
官方下载
官方下载服务器根目录
StarWind V2V Converter img → vmdk,直接上传到 ESXi 数据存储 官方免费版
XTerminal‑5.6.6‑win‑x64‑portable Windows 便携 SSH 客户端,无需安装 自行获取便携版
  • StarWind V2V Converter:免费版填写邮箱即可下载,无需付费许可,软件可直接读取.img.gz压缩包,不需要手动解压镜像
  • XTerminal 为便携版,解压即可运行,用来 SSH 连接 ESXi 以及 OpenWrt。

二、ESXi8.0 主机现状确认(已完成安装、网卡直通)

  1. 登录 ESXi Web 管理后台:管理 → 硬件 → PCI设备,确认 5 个 I226(igc)网卡识别正常。
    • 保留 1 张网卡作为 ESXi 管理口,不做直通;剩余 4 张 I226 已经设置为 PCI 直通,确认 ESXi 主机已经重启,直通生效;4 口 POE 来自这 4 张直通网卡。
  2. 新建 OpenWrt 虚拟机,暂时不添加磁盘
    • 客户机操作系统:Linux‑其他Linux(64位)
    • 固件类型:EFI(UEFI),禁止传统 BIOS
    • CPU:N5105 建议分配 4 核;内存≥4G,推荐 6G‑8G
    • 删除虚拟机默认自带虚拟网卡,后续只使用 PCI 直通网卡
    • 删除虚拟机默认创建的硬盘,磁盘使用 StarWind 转换上传的 vmdk 磁盘
    • 删除虚拟机SCSI 控制器 0
    • 删除虚拟机 CD/DVD 驱动器 1

⚠️踩坑提醒:I226 使用 ESXi 自带 igc 驱动,不要刷第三方网卡驱动;虚拟机固件必须 EFI,关闭安全启动 Secure Boot,OpenWrt 不支持安全引导。

三、StarWind V2V Converter:img 转 vmdk 并直接上传 ESXi 存储

Windows 运行 StarWind V2V Converter,不在本地保存 vmdk,转换完成直接推送上传至 ESXi 数据存储,省去手动上传 vmdk 步骤。

Windows 主机与 ESXi 处于同一局域网;ESXi 需要提前开启 SSH 服务(网页后台:主机 → 操作 → 服务 → 启用 SSH)。可以先用 XTerminal 测试 ESXi 的 root 账号 SSH 连通性。

  1. 打开 StarWind V2V Converter,选择 Convert local file
  2. Source file:选中下载并解压好的 openwrt‑25.12.5‑x86‑64‑generic‑ext4‑combined‑efi.img
  3. Target format 选择:VMware ESXi Server image (vmdk)
  4. Target location 选择:Upload directly to ESXi server
    • ESXi host name/IP:填写 ESXi 管理 IP(192.168.50.235)
    • User name:root
    • Password:ESXi root 密码
    • Datastore:选择你的 ESXi 数据存储
    • ESX growable image:√(对应 Thin provision 精简置备
    • File name:【…】选择目录,下面改下vmdk的名字:openwrt.vmdk→【OK】
    • 选好以后是这个样子的:[datastore1] OpenWrt/openwrt.vmdk→【convert】
    • Finish

四、ESXi 虚拟机挂载上传好的 vmdk 磁盘

  1. ESXi 网页后台,选中【创建的虚拟机】→【右键】→【编辑设置】编辑 OpenWrt 虚拟机硬件。
  2. 添加硬盘 → 现有硬盘,选中刚刚上传完成的openwrt‑2512.vmdk这个应该上传后自动就添加了
  3. 点击【添加的硬盘】→【将磁盘大小从原始几百 MB 修改为 50 GB】→【保存】
  4. 添加 PCI 直通设备,把 4 个已经设置直通的 I226 网卡全部添加给虚拟机。
  5. 虚拟机选项确认:固件 EFI;关闭安全引导 Secure Boot
  6. 保存虚拟机配置,开启虚拟机。
  7. 打开虚拟机控制台观察启动输出;OpenWrt‑25.12 默认 LAN 地址 192.168.1.1

⚠️此时 vmdk 磁盘虽然是 50G,但是 OpenWrt 内部分区仍然是镜像原始大小,需要做根分区扩容。

五、OpenWrt‑25.12 SSH 登录、磁盘扩容(ext4‑efi 镜像)

5.1修改初始网址

在esxi中启动openwrt虚拟机,单击下面已经启动的openwrt虚拟机进入控制台,
输入:vi /etc/config/network将光标移动到list ipaddr '192.168.50.253/24',单击i键进入修改状态,将lan所在的192.168.1.1/24改成你需要的网址(192.168.50.253), 然后按shift+:,在光标闪烁的前面出现时输入x退出。修改成功。

config interface 'loopback'
option device 'lo'
option proto 'static'
list ipaddr '127.0.0.1/8'

config globals 'globals'
option dhcp_default_duid '0004e8eaf9eb4535401e8acd355f732ed8bb'
option ula_prefix 'fdf4:bd57:3977::/48'

config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'

config interface 'lan'
option device 'br-lan'
option proto 'static'
list ipaddr '192.168.50.253/24'
option ip6assign '60'

5.2连接网络

旁路由模式:OpenWrt(当前管理地址):192.168.50.253

# 编辑网络配置文件
vi /etc/config/network

一个典型的桥接配置示例如下:

config interface 'loopback'
option device 'lo'
option proto 'static'
list ipaddr '127.0.0.1/8'

config globals 'globals'
option dhcp_default_duid '0004e8eaf9eb4535401e8acd355f732ed8bb'
option ula_prefix 'fdf4:bd57:3977::/48'
option packet_steering '1'

config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'

config interface 'lan'
option device 'br-lan'
option proto 'static'
list ipaddr '192.168.50.253/24'
option ip6assign '60'
option gateway '192.168.50.1'
list dns '192.168.50.1'
option multipath 'off'

修改完成后,执行 /etc/init.d/network restart 重启网络服务使配置生效。

5.3修改软件源

修改软件源之前,最好先备份好原来的。

# 备份命令
cp /etc/apk/repositories.d/distfeeds.list /etc/apk/repositories.d/distfeeds.list.bak

输入vi /etc/apk/repositories.d/distfeeds.list将原来的软件源修改为以下源:
中科大源https://mirrors.ustc.edu.cn/openwrt
清华源https://mirrors.tuna.tsinghua.edu.cn/openwrt
腾讯云源http://mirrors.cloud.tencent.com/openwrt

# 原来的软件源
https://downloads.openwrt.org/releases/25.12.5/targets/x86/64/packages/packages.adb
https://downloads.openwrt.org/releases/25.12.5/packages/x86_64/base/packages.adb
https://downloads.openwrt.org/releases/25.12.5/targets/x86/64/kmods/6.12.94-1-a7bc15f451f9652701ba04af9cfb0b95/
https://downloads.openwrt.org/releases/25.12.5/packages/x86_64/luci/packages.adb
https://downloads.openwrt.org/releases/25.12.5/packages/x86_64/packages/packages.adb
https://downloads.openwrt.org/releases/25.12.5/packages/x86_64/routing/packages.adb
https://downloads.openwrt.org/releases/25.12.5/packages/x86_64/telephony/packages.adb
https://downloads.openwrt.org/releases/25.12.5/packages/x86_64/video/packages.adb
# 修改后的软件源,上面的源随便选一个
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/targets/x86/64/packages/packages.adb
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/packages/x86_64/base/packages.adb
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/targets/x86/64/kmods/6.12.94-1-a7bc15f451f9652701ba04af9cf
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/packages/x86_64/luci/packages.adb
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/packages/x86_64/packages/packages.adb
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/packages/x86_64/routing/packages.adb
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/packages/x86_64/telephony/packages.adb
https://mirrors.ustc.edu.cn/openwrt/releases/25.12.5/packages/x86_64/video/packages.adb

也可以使用以下命令一键修改:

sed -i 's|https\?://downloads.openwrt.org|https://mirrors.ustc.edu.cn/openwrt|g' /etc/apk/repositories.d/distfeeds.list

5.4更新软件源

apk update && apk upgrade

然后浏览器输入该网址登录,也可以使用XTerminal SSH 连接 192.168.50.253,默认密码为空。

5.5安装常用 apk 包

一键安装全套常用 apk 包(bash、SFTP、curl、OpenWrt 磁盘挂载管理、NTP 时间同步服务、Samba 网页配置界面、samba4 文件共享服务端、Samba 插件中文翻译、中文语言包(LuCI 基础界面中文)、防火墙页面中文、软件包页面中文、查看块设备磁盘列表、磁盘分区工具、块设备 / UUID 查询、ext 文件系统扩容、loop 回环设备管理、设置时区为上海)

apk update
apk add bash openssh-sftp-server curl block-mount chrony \
luci-app-samba4 samba4-server luci-i18n-samba4-zh-cn \
luci-i18n-base-zh-cn luci-i18n-firewall-zh-cn luci-i18n-package-manager-zh-cn \
lsblk parted blkid resize2fs losetup \
zoneinfo-core zoneinfo-asia

# 设置时区为上海,建立软链接
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#设置开机自启
/etc/init.d/sysntpd restart
rc-update add chrony default

设置时区为上海:网页登录openwrt→系统→常规设置→时区(选择Asia/Shanghai)→时间格式(24小时制)

5.6ssh登录问题

如果出现当前设备的 SFTP 文件工作区不可用 服务器未提供可用的 SFTP 子系统。这个问题,安装apk add openssh-sftp-server就好了。

⚠️ext4‑combined‑efi 镜像,不建议系统内直接在线 parted 扩容,会修改 PARTUUID,极易出现开机卡死waiting for root device。优先离线扩容。

5.7离线扩容(推荐,稳定性最高,虚拟机环境首选)SystemRescue Live‑ISO

  1. 下载SystemRescue

  2. 将 SystemRescue ISO 上传至 ESXi 存储;虚拟机光驱挂载该 ISO 镜像;调整虚拟机启动顺序优先从 CD‑ROM 启动。

  3. 启动进入 SystemRescue 系统,打开终端执行:

#查看磁盘,虚拟机内系统盘识别为/dev/sda
lsblk
#扩展sda2根分区占满全部磁盘
parted /dev/sda resizepart 2 100%
#文件系统校验与扩容
e2fsck -f /dev/sda2
resize2fs /dev/sda2
  1. 关闭虚拟机,移除光驱 ISO 镜像,恢复虚拟机硬盘优先启动;开机进入 OpenWrt。
  2. XTerminal SSH 登录 OpenWrt,校验磁盘容量:
df -h
lsblk

/挂载点总容量接近 50G,代表扩容成功。

5.8官方脚本扩容

下载官方脚本:下载时有可能会被Anubis 反爬虫保护页面拦截。此脚本在openwrt说明文档→
首页
文献资料用户指南高级配置扩展根分区和文件系统

wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=1"

当下载失败时:复制以下内容:

# Configure startup scripts
cat << "EOF" > /etc/uci-defaults/70-rootpt-resize
if [ ! -e /etc/rootpt-resize ] \
&& type parted > /dev/null \
&& lock -n /var/lock/root-resize
then
ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \
'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"
ROOT_DISK="/dev/$(basename "${ROOT_BLK%/*}")"
ROOT_PART="${ROOT_BLK##*[^0-9]}"
parted -f -s "${ROOT_DISK}" \
resizepart "${ROOT_PART}" 100%
mount_root done
touch /etc/rootpt-resize

if [ -e /boot/cmdline.txt ]
then
NEW_UUID=`blkid ${ROOT_DISK}p${ROOT_PART} | sed -n 's/.*PARTUUID="\([^"]*\)".*/\1/p'`
sed -i "s/PARTUUID=[^ ]*/PARTUUID=${NEW_UUID}/" /boot/cmdline.txt
fi

reboot
fi
exit 1
EOF
cat << "EOF" > /etc/uci-defaults/80-rootfs-resize
if [ ! -e /etc/rootfs-resize ] \
&& [ -e /etc/rootpt-resize ] \
&& type losetup > /dev/null \
&& type resize2fs > /dev/null \
&& lock -n /var/lock/root-resize
then
ROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \
'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"
ROOT_DEV="/dev/${ROOT_BLK##*/}"
LOOP_DEV="$(awk -e '$5=="/overlay"{print $9}' \
/proc/self/mountinfo)"
if [ -z "${LOOP_DEV}" ]
then
LOOP_DEV="$(losetup -f)"
losetup "${LOOP_DEV}" "${ROOT_DEV}"
fi
resize2fs -f "${LOOP_DEV}"
mount_root done
touch /etc/rootfs-resize
reboot
fi
exit 1
EOF
cat << "EOF" >> /etc/sysupgrade.conf
/etc/uci-defaults/70-rootpt-resize
/etc/uci-defaults/80-rootfs-resize
EOF

利用vim新建expand-root.sh

vi expand-root.sh

接着在弹出的vim文本编辑器中将上面复制的脚本粘贴进去并保存退出,然后接着运行以下命令运行脚本。

赋予执行权限chmod +x expand-root.sh

实操代码

# 2. 安装扩容必需的底层工具 (25.12专属组合)
apk add parted losetup resize2fs blkid
root@OpenWrt:~# . ./expand-root.sh # 这里没有返回
root@OpenWrt:~# sh /etc/uci-defaults/70-rootpt-resize

运行完上面的命令后,路由器会自动重启。第一次重启是让 parted在后台帮你把分区扩大到最大可用空间;第二次重启则是让系统自动调用 resize2fs把Overlay文件系统填满新扩充的空间。全程傻瓜化,无需人工干预。

5.9在线扩容

在线扩容⚠️重要警告:sda2 是正在挂载的根分区,在线直接 parted 修改分区有概率系统损坏、变砖

1.查看磁盘信息:lsblk

root@OpenWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 50G 0 disk # 这是 整块磁盘:`/dev/sda`
├─sda1 8:1 0 16M 0 part /boot
│ /boot
├─sda2 8:2 0 104M 0 part / # ⚠️根分区,现在只有104M,磁盘总共有50G空余
└─sda128 259:0 0 239K 0 part
root@OpenWrt:~#
  1. 将2号分区扩展到磁盘全部末尾的完整扩容命令:
# 1. 将2号分区扩展到磁盘全部末尾,注意这里的/dev/sda
parted -s /dev/sda resizepart 2 100% # 2 指的是sda2
# 2. 通知内核刷新分区表
partprobe /dev/sda
# 3. 扩容ext4文件系统
resize2fs /dev/sda2

实践操作代码:

root@OpenWrt:~# parted -s /dev/sda resizepart 2 100%
root@OpenWrt:~# partprobe /dev/sda
root@OpenWrt:~# resize2fs /dev/sda2
resize2fs 1.47.3 (8-Jul-2025)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 4
resize2fs: Invalid argument While checking for on-line resizing support
root@OpenWrt:~#

内核不支持 ext4 在线扩容(正在挂载的根分区无法在线 resize2fs)。 你已经把分区表 /dev/sda2 物理分区扩大了,但文件系统不能在线扩容

在线扩容失败

六、实操:安装docker

apk add dockerd docker luci-app-dockerman \
luci-i18n-dockerman-zh-cn docker-compose

导出系统配置备份

sysupgrade -b /tmp/backup.tar.gz

/tmp/backup.tar.gz下载到本地保存,用于故障恢复。

七、网络配置(N5105‑G47 5 口 I226,4 口 POE)

  1. 浏览器访问 http://192.168.1.1 进入 LuCI;系统‑系统‑语言与界面切换简体中文。
  2. 网络 → 接口 → 设备,编辑br‑lan桥接,将 4 个 POE 直通 I226 物理网卡加入 br‑lan 桥

4 个 POE 口全部作为 LAN,直连 AP、监控摄像头,直接 POE 供电。

  1. WAN 接口绑定剩余一张 I226 网口,按需配置 PPPoE 拨号 / DHCP 获取上网。
  2. 需要修改 LAN 网段,SSH 编辑/etc/config/network修改 lan 段 IP,保存生效。

验证网卡速率:ethtool ethX,确认协商速率为2500baseT/Full即跑满 2.5G。

八、OpenWrt‑25.12 优缺点(针对 ESXi 虚拟机 N5105‑G47)

✅优点

  1. apk 包管理器依赖处理优于旧 opkg;内置owut在线升级,升级固件可保留配置与已装软件包。
  2. kmod‑igc驱动完善,ESXi PCI 直通 I226 网卡转发性能优秀。
  3. 默认 nftables 防火墙,多 WAN、CAKE QoS 性能提升。
  4. ext4‑combined‑efi 镜像原生支持 50G 大磁盘,适合跑 Docker 容器、AdGuardHome、Samba 共享。

⚠️缺点 & 踩坑

  1. .ipk第三方插件不兼容,需要适配 apk;老旧代理脚本需要手动安装iptables‑legacy兼容包。
  2. ext4 镜像不要系统内在线扩容,极易改变 PARTUUID,虚拟机启动卡住waiting for root device,优先 SystemRescue 离线扩容。
  3. 网上大量教程基于 opkg,25.12 全部使用 apk 命令,注意区分。
  4. I226 直通虚拟机必须 EFI 固件,传统 BIOS 会出现网卡识别异常。

九、系统升级

  1. 推荐 owut 在线编译升级(保留配置、已安装 apk 包)

bash

owut
  1. sysupgrade 手动升级

bash

sysupgrade -v xxx.img.gz

十、常见故障排查

  1. 虚拟机启动卡住 waiting for root device

诱因:在线扩容修改 PARTUUID。解决方案:挂载 SystemRescue ISO 启动,挂载 EFI 分区修改grub.cfg,将root=PARTUUID=xxx改为root=/dev/sda2

  1. I226 网卡识别异常,协商速率只有 1G

ESXi 确认网卡已经 PCI 直通,虚拟机重启;确认 OpenWrt 安装kmod‑igc;网线必须支持 2.5G 速率。

  1. StarWind V2V Converter 无法上传 ESXi

ESXi 开启 SSH,放行 22 端口;XTerminal 验证 root 账号 SSH 登录;Windows 与 ESXi 网络互通。

  1. Docker 启动报错 mountpoint: not found

bash

apk add util-linux

十一、Docker 部署 Lucky 与 1Panel(OpenWrt‑25.12)

本章节基于已经部署完成的 Docker 环境,数据目录已经迁移到 50G 虚拟磁盘/mnt/docker;使用 docker‑compose 部署,配置持久化目录,容器数据不会随容器删除丢失。

⚠️注意:OpenWrt 为路由器系统,1Panel 尽量不要对外开放公网访问,仅内网 LAN 访问;Lucky 用于 DDNS、端口转发、反向代理。

11.1 准备持久化目录

XTerminal SSH 登录 OpenWrt 执行,创建存放 Lucky、1Panel 的数据目录:

bash

# 创建持久化目录,存放容器配置数据
mkdir -p /mnt/docker/lucky
mkdir -p /mnt/docker/1panel
chmod 777 /mnt/docker/lucky
chmod 777 /mnt/docker/1panel
cd /mnt/docker

11.2 docker‑compose.yml 编写

新建docker‑compose.yml配置文件

bash

nano /mnt/docker/docker-compose.yml

粘贴下面完整内容:

yaml

version: "3"
services:
lucky:
image: ghcr.io/gdy666/lucky:latest
container_name: lucky
restart: always
network_mode: host
volumes:
- /mnt/docker/lucky:/goodluck
environment:
- TZ=Asia/Shanghai

1panel:
image: 1panel/1panel:latest
container_name: 1panel
restart: always
privileged: true
network_mode: host
volumes:
- /mnt/docker/1panel:/opt/1panel
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai

nano 保存退出:Ctrl+O回车保存,Ctrl+X退出编辑器。

参数说明:

  • network_mode: host 使用主机网络模式,获取完整网络能力;Lucky DDNS、端口转发必须 host 网络;1Panel host 网络便于管理 OpenWrt 宿主机 docker。
  • privileged: true:1Panel 需要特权权限管理容器;
  • 挂载docker.sock,让 1Panel 可以管理 OpenWrt 宿主机上全部 docker 容器;
  • 数据全部挂载到/mnt/docker,50G 虚拟磁盘持久化存储,重装容器配置不会丢失。

11.3 启动容器

bash

#进入compose目录
cd /mnt/docker
#拉取镜像并后台启动
docker-compose up -d
#查看容器运行状态
docker-compose ps

看到两个容器状态Up代表启动成功。

11.4 访问 Web 管理界面

  1. Lucky 访问地址http://192.168.1.1:16601,首次登录设置管理员账号密码;实现 DDNS、域名解析、反向代理、端口转发。

  2. 1Panel 访问地址http://192.168.1.1:22222

    首次进入 1Panel,使用命令查看初始化账号密码:

    bash

    cat /mnt/docker/1panel/logs/panel.log | grep "init username\|init password"

    ⚠️安全提醒:1Panel 不要映射公网,仅内网访问;及时修改默认账号密码。

11.5 常用维护命令

bash

#查看容器日志,排查启动失败
docker-compose logs -f lucky
docker-compose logs -f 1panel

#更新镜像重启容器
cd /mnt/docker
docker-compose pull
docker-compose up -d

#停止容器
docker-compose stop
#删除容器(数据目录不会删除)
docker-compose down

11.6 OpenWrt 25.12 注意事项

  1. OpenWrt 重启之后 dockerd 服务会自动开机启动,Lucky、1Panel 容器会自动恢复运行;
  2. 若修改 OpenWrt LAN 网段,访问地址跟随 LAN IP 变化;
  3. 1Panel 运行在路由器环境,不建议在里面部署高暴露公网业务,适合内网管理容器、管理 NAS、简单网站;
  4. Lucky 使用 host 网络,不要在 luci‑dockerman 里面修改网络模式,会造成 DDNS、端口转发功能异常。

本文适用场景:N5105‑G47,ESXi8 已部署完成、网卡已经直通,4 口 POE 接 AP、监控,OpenWrt 虚拟机 50G 虚拟磁盘存放 docker 镜像、日志与各类应用数据。


扩展小提示:Hexo Next 博客可以在文章末尾添加标签卡片,方便后续查阅;所有操作均基于 OpenWrt‑25.12.5 x86‑64 ext4‑efi 镜像,squashfs 镜像不建议直接跑大量 docker 容器。

openwrt安装前的扩容工作

openwrt-25.12.1-x86-64-generic-squashfs-combined-efi.img 这个官方镜像默认创建的分区很小,但好消息是,对于 x86_64 设备和 squashfs 文件系统,扩容非常简单。官方提供了一个近乎自动的方法,可以安全无损地使用整块硬盘的空间。

重新安装并扩容最推荐在 “写盘后、第一次启动前” 完成,步骤如下:

💻 第一步:清除硬盘并写入镜像

  1. 清除旧分区表
    使用 dd 命令清空目标硬盘(例如 /dev/sdb)的开头,这是避免分区表冲突的关键一步:

    # 请务必确认 /dev/sdb 是您的目标硬盘!!!
    dd if=/dev/zero of=/dev/sdb bs=1M count=8
  2. 写入新镜像
    将您下载的 .img 镜像写入硬盘:

    dd if=/awrt/openwrt-25.12.1-x86-64-generic-squashfs-combined-efi.img of=/dev/sdb bs=4M && sync
    ###
    dd if=/tmp/openwrt-25.12.1-x86-64-generic-squashfs-combined-efi.img of=/dev/sdb bs=4M status=progress && sync
  3. 检查分区表并卸载硬盘
    运行 fdisk -l /dev/sdb 查看分区。您会看到 sdb1 (boot)、sdb2 (root) 和一个空的 sdb128 等分区。完成后安全弹出硬盘。

⚙️ 第二步:一键扩容

将写好系统的硬盘接到 OpenWrt 设备上,启动并立即通过 SSH 连接执行以下命令:

## 这里面包含有扩容工具
apk add parted losetup resize2fs blkid
  1. 使用 resizepart 命令扩容
    这个命令是用来调整分区的大小的。它直接修改硬盘上的分区表,告诉系统这个分区现在可以使用整个硬盘的空间了。

    resizepart 2
    • 2 是系统根分区的编号。
    • 执行后,sdb2 分区将自动扩展,用满硬盘所有剩余空间。这一步是 OpenWrt 开发者专门为 squashfs 镜像设计的快捷方式,非常安全。
  2. 重启系统使分区生效

    reboot

💡 备选方案:首次启动后脚本扩容

如果错过了写盘后的时机,可以试试 expand-root.sh 这个官方脚本。这个脚本的核心理念是离线操作,比手动操作更可靠

OpenWrt 官方为你准备好了一键扩容脚本,它会自动创建启动任务来安全地调整你的分区大小:

# 下载官方扩容脚本
wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=0"

# 赋予执行权限并运行
. ./expand-root.sh

# 执行第一次扩容(它会调整分区表然后重启)
sh /etc/uci-defaults/70-rootpt-resize

运行完上面的命令后,路由器会自动重启。第一次重启是让 parted在后台帮你把分区扩大到最大可用空间;第二次重启则是让系统自动调用 resize2fs把Overlay文件系统填满新扩充的空间。全程傻瓜化,无需人工干预。

# 1. 更新软件源
apk update

# 2. 安装扩容必需的底层工具 (25.12专属组合)
apk add parted losetup resize2fs blkid

# 3. 下载 OpenWrt 25.12 官方的一键扩容脚本
wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=0"

# 4. 赋予脚本执行权限
chmod +x expand-root.sh

# 5. 立即执行脚本进行初次扩容
./expand-root.sh

openwrt安装后的设置

  • [下载地址:](Index of /releases/25.12.1/targets/x86/64/) generic-targz-combined-efi.img.gz

  • 由于机器的现代x86_64架构,选择 64/ 是正确的。它是官方为最佳性能而设计的版本,能够充分利用CPU的多核处理能力和超过4GB的大内存。

    至于其他目录,你可以简单了解它们各自的适用场景:

    • generic/:即将被移除的32位版本,编译优化是基于Intel奔腾4处理器,性能远不如64位版,不建议使用。
    • legacy/:专为1996-2007年生产的超老硬件保留的,不支持多核和1GB以上内存,你的设备完全用不上。
    • geode/:基于AMD Geode处理器的嵌入式系统专用,用在普通PC上会启动失败
  • 通过StarWind V2V Converter转换后启动

  • **安装到硬盘:**将istoreos-24.10.6-2026041710-x86-64-squashfs-combined-efi.img通过ssh上传到启动好的openwrt的tmp文件夹。

    # 安装lsblk,用于查看硬盘
    apk update && apk add lsblk

    然后用lsblk列出所有 sdasdbnvme0n1 等。你需要根据容量大小,判断哪个是你的目标硬盘(比如 /dev/sda)。确定需要安装的硬盘以后执行下面的命令。

    dd if=/tmp/openwrt-25.12.1-x86-64-generic-squashfs-combined-efi.img of=/dev/sdb bs=4M status=progress && sync
    • if= 后面是你固件的实际路径和文件名,通常可以放在 /tmp/upload 目录下上传。
    • of= 后面是你目标硬盘的代号。
    • bs=4M 是写入块的大小,status=progress 可以显示进度,&& sync 会确保所有数据都已写入硬盘。
  • 进入openwrt主页vi /etc/config/network将lan所在的192.168.1.1/24改成你需要的网址,然后浏览器输入该网址登录。:

  • 设置中文:安装完成后,前往 System -> System。在 Language and Style 标签页下,将 Language 选项改为 简体中文 (Chinese Simplified)。点击页面底部的 Save & Apply 按钮,界面就会变成中文了。
    如果是ssh命令安装:apk update && apk add luci-i18n-base-zh-cn

  • 将其它eth的lan口绑定到lan口:登录LuCI网页后台,进入 网络 (Network) -> 接口 (Interfaces)**。点击 设备 (Devices) 标签页,在列表中找到并点击代表 LAN 口的 br-lan 设备旁边的 配置 (Configure) 按钮。

  • ssh登录问题:如果出现**当前设备的 SFTP 文件工作区不可用 服务器未提供可用的 SFTP 子系统。**这个问题安装下apk add openssh-sftp-server就好了。

  • 修改软件源vi /etc/apk/repositories.d/distfeeds.list
    中科大源https://mirrors.ustc.edu.cn/openwrt
    清华源https://mirrors.tuna.tsinghua.edu.cn/openwrt
    腾讯云源http://mirrors.cloud.tencent.com/openwrt
    使用 sed 命令一键替换(可选):替换前要备份。这个命令可以自动帮你完成替换,避免手动编辑出错的风险。

    # 备份命令
    cp /etc/apk/repositories.d/distfeeds.list /etc/apk/repositories.d/distfeeds.list.bak

    sed -i 's|https\?://downloads\.openwrt\.org|https://mirrors.ustc.edu.cn/openwrt
    |g' /etc/apk/repositories.d/distfeeds.list

    然后重新运行 apk update 即可。

挂载u盘

  • 安装:dmesg | grep -i usb | tail -20 ls -l /dev/sd*

    apk add lsblk  blkid kmod-fs-cifs cifsmount kmod-nls-utf8
    apk add kmod-usb-storage kmod-usb-storage-uas kmod-usb3 usbutils block-mount kmod-fs-ext4
    dmesg | grep -i usb | tail -20   # 查看usb接口
    ls -l /dev/sd* #查看u盘是否出现
    blkid /dev/sdb1 # 查看uuid

    如果以上安装好后能识别到U盘,用blkid /dev/sdb1查看uuid。编辑 /etc/config/fstab在最后添加如下内容:

    config mount
    option enabled '1'
    option uuid '082de2f6-c93f-f64d-b14e-8d74e728622c' # 替换为你的实际UUID
    option target '/b860'
    option fstype 'ext4' # 根据实际文件系统修改:ext4, ntfs-3g, vfat 等
    option options 'rw,exec'
    # 防止没有u盘,系统不能启动,# 如果你希望必须依赖 U 盘才启动某些服务,反倒不应该加 nofail
    option nofail '1'
    # # 重新加载 fstab 配置
    mount -a

挂载局域网硬盘

  • 安装必要组件apk add kmod-fs-cifs cifsmount

  • 编辑vi /etc/rc.local如下:
    uid=1000,gid=1000:指定挂载后文件所有者的 UID/GID,你可以根据需要修改(例如 nobody 的 UID 通常是 65534)

    sleep 10
    mount.cifs //192.168.50.236/adsm /adsm -o credentials=/b860/lucky/credentials,nofail,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,iocharset=utf8,vers=3.0
    #
    # 另一个容错版本
    mount.cifs //192.168.50.236/adsm /adsm -o credentials=/b860/lucky/credentials,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,iocharset=utf8,vers=3.0 || true

    exit 0
  • 验证挂载与权限

    df -h | grep /adsm
    ls -la /adsm
    # 尝试创建文件测试写入
    touch /adsm/test.txt
  • 自动重试脚本 :用 vi /opt/mount_nas.sh 打开一个新文件

    #!/bin/sh

    # NAS 配置信息
    NAS_IP="192.168.50.236"
    NAS_PATH="//${NAS_IP}/adsm"
    MOUNT_POINT="/adsm"
    MOUNT_OPTIONS="nofail,uid=1000,gid=1000,vers=3.0,username=用户名,password=密码,iocharset=utf8,file_mode=0777,dir_mode=0777"

    # 重试参数
    MAX_RETRIES=6 # 最大重试次数
    RETRY_INTERVAL=10 # 每次重试间隔(秒)

    # 记录开始时间
    echo "$(date): 开始检测 NAS 连通性..."

    for i in $(seq 1 $MAX_RETRIES); do
    # 1. 先 ping 检测网络是否可达
    if ping -c 1 -W 2 "$NAS_IP" > /dev/null 2>&1; then
    echo "$(date): NAS ($NAS_IP) 已连通。"

    # 2. 检查是否已经挂载
    if mountpoint -q "$MOUNT_POINT"; then
    echo "$(date): $MOUNT_POINT 已挂载,无需重复操作。"
    exit 0
    fi

    # 3. 尝试挂载
    echo "$(date): 尝试挂载 $NAS_PATH$MOUNT_POINT ..."
    mount.cifs "$NAS_PATH" "$MOUNT_POINT" -o "$MOUNT_OPTIONS"
    if [ $? -eq 0 ]; then
    echo "$(date): 挂载成功!"
    exit 0
    else
    echo "$(date): 挂载失败,请检查用户名/密码或共享路径。"
    exit 1
    fi
    else
    echo "$(date): 无法 ping 通 $NAS_IP(第 $i 次尝试),${RETRY_INTERVAL}秒后重试..."
    if [ $i -lt $MAX_RETRIES ]; then
    sleep $RETRY_INTERVAL
    else
    echo "$(date): 已达最大重试次数,放弃挂载。请检查 NAS 是否开机或 IP 是否正确。"
    exit 1
    fi
    fi
    done

    编辑 /etc/rc.local 文件:

    vi /etc/rc.local

    exit 0 这一行的上面,添加一行:

    /opt/mount_nas.sh &

    & 代表让脚本在后台运行,不会拖慢系统启动速度)

开启smb共享

  • 安装 Samba4 服务:在 OpenWrt 中,安装带网页界面的 luci-app-samba4 包是最方便的选择,它会自动安装samba4-server等核心依赖。

    # 刷新软件源
    apk update

    # 安装带中文界面的 Samba4 包
    apk add luci-app-samba4 luci-i18n-samba4-zh-cn

    安装完成后,需要重启一次路由器,让LuCI界面里出现“网络共享”菜单。

  • 创建 Samba 用户及密码:即使我们在网页界面允许了 root 用户,但 root 还没有设置自己的 Samba 专用密码。这一步需要在 SSH 中进行。

    # 为 root 用户设置 Samba 密码
    smbpasswd -a root
    # 检查文件权限,如果输出是类似 drwx------ 的样子,就意味着只有 root 用户才有权限,
    # Samba 来宾账户 (nobody) 就会无法访问。
    ls -ld /b860
    chmod 777 /b860
    # 修改文件夹里所有文件与文件夹的权限,确保读写权限
    chmod -R 777 /b860

    系统会提示你输入并确认密码,这个密码可以和你OpenWrt的登录密码不同,它是一个独立的安全凭证。

  • **修改文件 **:vi /etc/samba/smb.conf.template

    [global]
    workgroup = WORKGROUP
    security = user
    map to guest = Bad User
    #server min protocol = NT1
    #client min protocol = NT1

    [B860]
    path = /b860
    browseable = yes
    read only = no
    guest ok = yes
    guest account = nobody
    create mask = 0777
    directory mask = 0777
    # 将所有用户都当root看待。
    force user = root

格式化虚拟硬盘并挂载

OpenWrt 中文社区软件包仓库

  • 安装必要工具apk add fdisk e2fsprogs block-mount

  • 查看新硬盘的设备名称:使用 ``lsblk命令找到你刚添加的硬盘。可能被识别为/dev/sdc/dev/sdb/dev/sda`。

  • 分区与格式化:以新硬盘为 /dev/sda 为例,格式化。强烈建议格式化为 ext4 文件系统。请谨慎,以下命令会抹除新硬盘上的所有数据:mkfs.ext4 /dev/sda

  • 查看硬盘uuidblkid /dev/sdc1 来获取分区的UUID,例如 55657278-345f-4cf4-8d3c-34d8a83d06b2。使用UUID挂载更稳定,能避免设备编号变化导致的挂载失败问题。

  • 添加挂载配置vi /etc/config/fstab

    config 'mount'
    option enabled '1'
    option uuid '55657278-345f-4cf4-8d3c-34d8a83d06b2'
    option target '/mnt/sdc1'
    option fstype 'ext4'
    option options 'rw,exec,sync'
  • 如果确实需要 opkg,可以自行安装,使其与 apk 共存。
    从官方源下载 opkg

    wget -P /tmp https://downloads.openwrt.org/releases/24.10.0/packages/x86_64/base/opkg_2022-02-24-d038e5b6-1_x86_64.ipk

提示:如果上述链接失效,请访问 OpenWrt 24.10 软件包目录 查找最新的 opkg 版本。
安装 opkgapk add --allow-untrusted /tmp/opkg_*.ipk
使用 opkg 安装 luci-app-diskman

opkg install /path/to/luci-app-diskman_v0.2.11_all.ipk

编译并安装luci-app-diskman

  • 编译环境:debian-13.4.0-amd64-netinst

  • 下载对应你固件版本的 SDK,就可以轻松编译你想要的 luci-app-diskman 插件了。

    wget https://downloads.openwrt.org/releases/25.12.1/targets/x86/64/openwrt-sdk-25.12.1-x86-64_gcc-14.3.0_musl.Linux-x86_64.tar.zst
    tar -xvf openwrt-sdk-25.12.1-x86-64_gcc-14.3.0_musl.Linux-x86_64.tar.zst
    cd openwrt-sdk-25.12.1-x86-64_gcc-14.3.0_musl.Linux-x86_64
    # 安装依赖
    apt install build-essential flex gawk git gettext libncurses-dev libssl-dev python3-full python3-setuptools zlib1g-dev unzip subversion ccache libxml-parser-perl libjson-perl
    apt install rsync file
    # 克隆插件源码
    git clone https://github.com/lisaac/luci-app-diskman.git package/luci-app-diskman
    # 更新软件包索引
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    # 编译.apk 包:
    make package/luci-app-diskman/compile V=s

    如果仍然提示缺失某些工具,可以运行 make prereq 来专门检查并提示缺少哪些依赖:

    编译完成后,.apk 文件通常会存放在 bin/packages/x86_64/base/ 目录下。

  • 安装编译:编译出的 .apk 包没有官方签名,所以 apk 默认会拒绝安装。加上 --allow-untrusted 参数即可绕过签名检查:apk add --allow-untrusted /adsm/diskman/luci-app-diskman-0.2.13-r1.apk

  • 安装后验证:安装成功后,刷新 LuCI 界面,就能在 系统 → 磁盘管理 中找到 DiskMan 了。如果页面不显示,重启一下路由器或执行:/etc/init.d/rpcd restart

安装 Docker 与 Docker Compose

命令总结:

#安装docker命令汇总
apk add docker dockerd containerd
apk add docker-compose kmod-br-netfilter kmod-veth kmod-dm
  • 核心是安装 dockerd (Docker 守护进程) 和 docker-composeapk add dockerd docker-compose

要解决磁盘问题

16G磁盘(/dev/sdb)并没有被充分利用,系统目前只使用了其中的 /dev/sdb1 (16M boot) 和 /dev/sdb2 (104M rom),而 overlay 文件系统却绑定到了一个只有 98.1M 的 loop 设备(loop0),导致可用空间不足 5MB。

你需要把 overlay 扩展到磁盘的空闲空间上,才能安装 Docker 等大软件。

查看磁盘分区表,确认有空闲空间fdisk -l /dev/sdb

应该能看到 /dev/sdb 大小为 16G,但只有三个很小分区(sdb1, sdb2, sdb128),剩余大量未分配空间。我们需要创建一个新分区来存放 overlay。

  • 创建新分区(例如 /dev/sdb3

    # 进入 fdisk 交互模式
    fdisk /dev/sdb

    # 在 fdisk 内部依次输入:
    n # 新建分区
    p # 主分区
    3 # 分区编号(如果 3 已被占用,选其他编号,例如 3 应该是可用的)
    # 然后直接按两次回车,使用默认起始和结束扇区(占用所有剩余空间)
    w # 写入分区表并退出

    **Partition number (3-127, default 3): ** 直接回车 它会自动选择默认值 3

    First sector (246272-33554398, default 247808):*直接按回车键,使用默认值 247808 即可。
    Last sector, +/-sectors or +/-size{K,M,G,T,P}
    *直接按回车
    ,让它使用剩余的全部空间。
    最后输入 w 写入分区表。

    fdisk /dev/sdb
    n
    First sector (246272-33554398, default 247808): ← 直接回车
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (247808-33554398, default 33554398): ← 直接回车
    Created a new partition 3 of type 'Linux filesystem' and of size 15.9 GiB.
    Command (m for help): w ← 输入 w 然后回车
  • 格式化新分区为 ext4mkfs.ext4 /dev/sdb3

  • 将当前 overlay 内容迁移到新分区

    # 挂载新分区到一个临时目录
    mkdir -p /mnt/newroot
    mount /dev/sdb3 /mnt/newroot

    # 复制当前 overlay 的所有文件到新分区(保留权限)
    cp -a /overlay/* /mnt/newroot/

    # 卸载临时挂载
    umount /mnt/newroot
  • 修改系统配置,使新分区成为 overlay:编辑 /etc/config/fstab,获取uuidblkid /dev/sdb3
    注意:原来的那个 target '/overlay'enabled '0' 的项可以保留(不会被使用),或者你也可以把它删除。建议保留并保持 enabled '0',避免冲突。

    config 'mount'
    option enabled '1'
    option uuid '这里填/sdb3的UUID'
    option target '/overlay'
    option fstype 'ext4'
    option options 'rw,exec,noatime'

    重启后,再次运行 df -h,你应该会看到 /overlay 变为 /dev/sdb3,容量接近 16G,使用率很低。

再次安装

  • 安装apk add dockerd docker-compose

  • 安装完成后,启动并设置 Docker 开机自启,然后验证安装是否成功:

    /etc/init.d/dockerd start
    /etc/init.d/dockerd enable
    docker -v
    docker-compose --version
  • 配置 Docker 存储目录:为了不影响路由器有限的存储空间,建议将默认的 /opt/docker/ 数据目录迁移到你的挂载硬盘上。假设你希望 Docker 的数据目录为 /awrt/docker

  • 停止服务

    /etc/init.d/dockerd stop
    /etc/init.d/docker.socket stop # 如果 docker.socket 服务存在,也执行:
  • 迁移现有数据(如果之前已有一些镜像或容器)

    # 如果 /opt/docker 下已有内容,可以复制过去
    cp -a /opt/docker/. /awrt/docker/
  • 如果只安装1panel面板,修改vi /etc/docker/daemon.json

    {
    "data-root": "/awrt/docker",
    "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.1panel.dev",
    "https://docker.1ms.run",
    "https://docker.m.daocloud.io",
    "https://docker.xuanyuan.me",
    "https://atomhub.openatom.cn"
    ]
    }
    {
    "data-root": "/awrt/docker/",
    "log-level": "warn",
    "iptables": true,
    "ip6tables": false,
    "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io"
    ]
    }

    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "20m",
    "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
    }
  • 验证配置是否生效docker info | grep -A 5 "Docker Root Dir"返回配置目录

  • 验证镜像源是否生效docker info | grep -A 5 "Registry Mirrors"查看当前 Docker 已配置的镜像加速器(如果配置过)。

  • 修改 UCI 配置

    编辑 /etc/config/dockerd,找到 config globals 'globals' 部分,修改 data_root 行的值:

    option data_root '/awrt/docker'
    # 可以用 sed 命令快速修改:
    sed -i 's|option data_root .*|option data_root '\''/b860/docker'\''|' /etc/config/dockerd
    #将脚本中的DOCKER_CONF_DIR变量值从可能错误的/tmp/dockerd纠正为/awrt/docker
    sed -i 's/^DOCKER_CONF_DIR=.*/DOCKER_CONF_DIR="\/awrt\/docker"/' /etc/init.d/dockerd
  • 安装 LuCI 管理界面: luci-app-dockerman apk add luci-app-dockerman

  • 配置镜像源:通过 /etc/config/dockerd 修改

    OpenWrt 将 Docker 的配置整合到了其标准的 UCI dockerd 配置文件中,无需手动处理 daemon.json 定位到 config globals 'globals' 部分。如果看到 list registry_mirrors 行,请移除行首的 #。如果没有,请手动添加。

    config globals 'globals'
    # option alt_config_file '/etc/docker/daemon.json'
    option data_root '/awrt/docker/'
    option log_level 'warn'
    option iptables '1'
    # list dns '172.17.0.1'
    # list registry_mirrors 'https://<my-docker-mirror-host>'
    # list registry_mirrors 'https://hub.docker.com'
    list registry_mirrors 'https://docker.1ms.run'
    list registry_mirrors 'https://docker.m.daocloud.io'
    list registry_mirrors 'https://docker.xuanyuan.me'
    list registry_mirrors 'https://atomhub.openatom.cn'

收藏代码

  • 等待磁盘加载后启动docker :iv /etc/init.d/dockerdstart_service() {函数的第一行加上

    # 等待 /b860 挂载点出现(最多等 60 秒,每 2 秒检查一次)
    local waited=0
    while ! mountpoint -q /b860 && [ $waited -lt 60 ]; do
    sleep 5
    waited=$((waited + 2))
    done

    # 如果超时后仍未挂载,记录日志但继续启动(可选)
    if ! mountpoint -q /b860; then
    logger -t dockerd "警告: /b860 挂载不成功, Ddocker启动失败"
    fi

    重装Docker

    如果以上所有步骤都无法解决,日志又指向不明的“软件包损坏”,那么最后的手段是:备份配置、彻底卸载、重装Docker。这可以解决绝大部分因配置文件残留或软件包损坏导致的疑难杂症。

    重装命令如下:

    # 1. 停止并禁用 Docker 服务
    /etc/init.d/dockerd stop
    /etc/init.d/dockerd disable
    # 2. 要先删除界面
    apk del luci-app-dockerman

    # 3. 彻底移除 Docker 相关软件包
    apk del dockerd docker docker-compose

    # 4. 清理残留的配置文件和数据(请确保 /awrt/docker 路径正确)
    rm -rf /etc/docker /etc/config/dockerd /awrt/docker
    # 检查是否还有其他 Docker 相关的包(如 docker-cli、containerd 等)需要清理:
    apk list | grep docker

    # 5. 重新安装 Docker
    apk update
    apk add dockerd docker docker-compose

    # 6. 重新配置 Docker
    # 请参考历史对话,将 /awrt/docker 恢复为数据目录
  • 如果出现如下问题:

    30/30) Installing dockerd (27.3.1-r4)
    Installing file to etc/init.d/dockerd.apk-new
    Executing dockerd-27.3.1-r4.post-install
    * /etc/rc.common: line 231: mountpoint: not found
    * /etc/rc.common: line 231: mountpoint: not found
    安装 mountpoint 依赖
    apk add util-linux

更换主题

OpenWrt软件包各主题样式预览

搜索一下可用的主题:apk search luci-theme

luci-theme-openwrt (官方默认主题)
luci-theme-bootstrap (经典主题)
luci-theme-material (Material 风格)
luci-theme-argon (很受欢迎的现代主题)
  • 安装luci-theme-argon主题

    wget https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.4.3/luci-theme-argon-2.4.3-r20250722.apk
    # 也可以手动下载到 /awrt # --allow-untrusted 参数来强制安装这个我们信任的第三方主题包
    apk add --allow-untrusted ./luci-theme-argon-2.4.3-r20250722.apk
  • **激活 Argon 主题 **

    uci set luci.main.mediaurlbase='/luci-static/argon'
    uci commit luci
    /etc/init.d/uhttpd restart
  • 自定义 Argon 主题:如果希望进一步自定义 Argon 主题(比如更换登录背景、明暗模式等),可以尝试手动安装 luci-app-argon-config。不过由于它目前可能只提供 .ipk 格式,我们可以用 opkg 来安装(如果系统里有 opkg 的话)

  • 也可以用apk add luci-theme-material主题,在 语言和界面 标签页 → 主题 下拉选择 material

系统升级

  • 下载固件到 /awrt(不是 /tmp

    cd /awrt
    wget https://downloads.openwrt.org/releases/25.12.2/targets/x86/64/openwrt-25.12.2-x86-64-generic-squashfs-combined-efi.img.gz
    # 升级
    sysupgrade -v /awrt/openwrt-25.12.2-x86-64-generic-squashfs-combined-efi.img.gz

    -v 显示详细信息,系统会自动将镜像解压到 /tmp 但会尝试复用空间。如果仍然提示空间不足,可以添加 -f 强制跳过空间检查(风险较小,因为你的 overlay 实际足够大):

    sysupgrade -v -f /awrt/openwrt-25.12.2-x86-64-generic-squashfs-combined-efi.img.gz

编译openwrt

编译环境准备(Debian 13)

编译的时候一定要用普通用户 ,切换到 root 来把 bulid普通用户加入 sudo 权限:

# 从普通用户切换到root
su -
usermod -aG sudo bulid
# 重新登录或重启

打开终端,使用普通用户(非 root)执行以下命令:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential libncurses5-dev libncursesw5-dev zlib1g-dev gawk git gettext libssl-dev libelf-dev autoconf automake libtool autopoint ccache flex bison subversion git-core g++-multilib p7zip p7zip-full msmtp texinfo libglib2.0-dev xmlto qemu-utils upx libdwarf-dev libdw-dev libunwind-dev liblzma-dev cmake rsync wget python3-full

拉取源码并更新feeds

#创建新文件夹
mkdir -p /abian/openwrt
cd /abian
git clone https://github.com/coolsnowwolf/lede.git
cd lede
# 更新feeds
./scripts/feeds update -a
./scripts/feeds install -a

若希望使用官方源码,可替换为:git clone https://github.com/openwrt/openwrt.git


ostoreOS分区扩容

root@iStoreOS:~# parted    # 输入 parted
GNU Parted 3.6
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print # 输入 print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sda: 34.4GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
128 17.4kB 262kB 245kB bios_grub
1 262kB 134MB 134MB fat16 legacy_boot
2 134MB 403MB 268MB msftdata
3 403MB 2550MB 2147MB ext4 msftdata

(parted) resizepart # 输入 resizepart
Partition number? 3 # 输入 3
Warning: Partition /dev/sda3 is being used. Are you sure you want to continue?
Yes/No? yes # 输入 yes
End? [2550MB]? 31G # 输入 剩余磁盘的大小
(parted) quit # 输入 quit
Information: You may need to update /etc/fstab.
root@iStoreOS:~# resize2fs -p /dev/sda3 # 修改文件系统
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/sda3 is mounted on /overlay; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 4
The filesystem on /dev/sda3 is now 7469991 (4k) blocks long.
root@iStoreOS:~#
root@iStoreOS:~# parted /dev/sda unit s print free
Model: ATA VMware Virtual S (scsi)
Disk /dev/sda: 67108864s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
128 34s 511s 478s bios_grub
1 512s 262655s 262144s fat16 legacy_boot
2 262656s 786943s 524288s msftdata
3 786944s 60546875s 59759932s ext4 msftdata
60546876s 67108830s 6561955s Free Space

root@iStoreOS:~# parted
GNU Parted 3.6
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s # 使用扇区为单位,更精确
(parted) print free # 再次确认空闲空间
Model: ATA VMware Virtual S (scsi)
Disk /dev/sda: 67108864s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
128 34s 511s 478s bios_grub
1 512s 262655s 262144s fat16 legacy_boot
2 262656s 786943s 524288s msftdata
3 786944s 60546875s 59759932s ext4 msftdata
60546876s 67108830s 6561955s Free Space

(parted) resizepart 3 # 选择分区号 3
Warning: Partition /dev/sda3 is being used. Are you sure you want to continue?
Yes/No? yes
# 输入 -1s 表示使用磁盘最后一个扇区(全部空闲空间);
# 100% 将分区 3 扩展到磁盘尾部
End? [60546875s]? 100%
(parted) quit
Information: You may need to update /etc/fstab.
# resize2fs /dev/sda3 这个也可以
root@iStoreOS:~# resize2fs -p /dev/sda3
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/sda3 is mounted on /overlay; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 4
The filesystem on /dev/sda3 is now 8290235 (4k) blocks long.

root@iStoreOS:~#

singbox安装

opkg update && opkg install sing-box_1.13.11_openwrt_x86_64.ipk
Downloading https://istore.istoreos.com/repo/all/compat/Packages.gz
Updated list of available packages in /var/opkg-lists/istore_compat
Downloading https://istore.istoreos.com/repo/all/compat/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/targets/x86/64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_core
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/targets/x86/64/packages/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/base/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_base
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/base/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/targets/x86/64/kmods/6.6.127-1-50daf8372d971124fb3519e8d87e02ae/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_kmods
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/targets/x86/64/kmods/6.6.127-1-50daf8372d971124fb3519e8d87e02ae/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_luci
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/luci/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_packages
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/packages/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_routing
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/routing/Packages.sig
Signature check passed.
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_telephony
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/packages/x86_64/telephony/Packages.sig
Signature check passed.
Installing sing-box (1.13.11) to root...
Installing kmod-nfnetlink-queue (6.6.127-r1) to root...
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/targets/x86/64/kmods/6.6.127-1-50daf8372d971124fb3519e8d87e02ae/kmod-nfnetlink-queue_6.6.127-r1_x86_64.ipk
Installing kmod-nft-queue (6.6.127-r1) to root...
Downloading https://mirrors.cernet.edu.cn/openwrt/releases/24.10.6/targets/x86/64/kmods/6.6.127-1-50daf8372d971124fb3519e8d87e02ae/kmod-nft-queue_6.6.127-r1_x86_64.ipk
Configuring kmod-nfnetlink-queue.
Configuring kmod-nft-queue.
Configuring sing-box.
root@iStoreOS:~#

安装zoneinfo

apk add zoneinfo-core zoneinfo-asia
# 安装完成后,/usr/share/zoneinfo目录下会出现完整的时区数据文件。
# 创建localtime链接:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 重启时间服务:
/etc/init.d/sysntpd restart