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 主机现状确认(已完成安装、网卡直通)
- 登录 ESXi Web 管理后台:
管理 → 硬件 → PCI设备,确认 5 个 I226(igc)网卡识别正常。- 保留 1 张网卡作为 ESXi 管理口,不做直通;剩余 4 张 I226 已经设置为 PCI 直通,确认 ESXi 主机已经重启,直通生效;4 口 POE 来自这 4 张直通网卡。
- 新建 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 连通性。
- 打开 StarWind V2V Converter,选择
Convert local file。 - Source file:选中下载并解压好的
openwrt‑25.12.5‑x86‑64‑generic‑ext4‑combined‑efi.img。 - Target format 选择:
VMware ESXi Server image (vmdk)。 - 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 磁盘
- ESXi 网页后台,选中【创建的虚拟机】→【右键】→【编辑设置】编辑 OpenWrt 虚拟机硬件。
- 添加硬盘 → 现有硬盘,选中刚刚上传完成的
openwrt‑2512.vmdk(这个应该上传后自动就添加了) - 点击【添加的硬盘】→【将磁盘大小从原始几百 MB 修改为
50 GB】→【保存】 - 添加 PCI 直通设备,把 4 个已经设置直通的 I226 网卡全部添加给虚拟机。
- 虚拟机选项确认:固件 EFI;关闭安全引导 Secure Boot。
- 保存虚拟机配置,开启虚拟机。
- 打开虚拟机控制台观察启动输出;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' |
5.2连接网络
旁路由模式:OpenWrt(当前管理地址):192.168.50.253
# 编辑网络配置文件 |
一个典型的桥接配置示例如下:
config interface 'loopback' |
修改完成后,执行 /etc/init.d/network restart 重启网络服务使配置生效。
5.3修改软件源
修改软件源之前,最好先备份好原来的。
# 备份命令 |
输入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 -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 |
设置时区为上海:网页登录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
下载SystemRescue
将 SystemRescue ISO 上传至 ESXi 存储;虚拟机光驱挂载该 ISO 镜像;调整虚拟机启动顺序优先从 CD‑ROM 启动。
启动进入 SystemRescue 系统,打开终端执行:
#查看磁盘,虚拟机内系统盘识别为/dev/sda |
- 关闭虚拟机,移除光驱 ISO 镜像,恢复虚拟机硬盘优先启动;开机进入 OpenWrt。
- XTerminal SSH 登录 OpenWrt,校验磁盘容量:
df -h |
/挂载点总容量接近 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 |
利用vim新建expand-root.sh
vi expand-root.sh
接着在弹出的vim文本编辑器中将上面复制的脚本粘贴进去并保存退出,然后接着运行以下命令运行脚本。
赋予执行权限:chmod +x expand-root.sh
实操代码:
# 2. 安装扩容必需的底层工具 (25.12专属组合) |
运行完上面的命令后,路由器会自动重启。第一次重启是让 parted在后台帮你把分区扩大到最大可用空间;第二次重启则是让系统自动调用 resize2fs把Overlay文件系统填满新扩充的空间。全程傻瓜化,无需人工干预。
5.9在线扩容
在线扩容⚠️重要警告:sda2 是正在挂载的根分区,在线直接 parted 修改分区有概率系统损坏、变砖。
1.查看磁盘信息:lsblk
root@OpenWrt:~# lsblk |
- 将2号分区扩展到磁盘全部末尾的完整扩容命令:
# 1. 将2号分区扩展到磁盘全部末尾,注意这里的/dev/sda |
实践操作代码:
root@OpenWrt:~# parted -s /dev/sda resizepart 2 100% |
内核不支持 ext4 在线扩容(正在挂载的根分区无法在线 resize2fs)。 你已经把分区表 /dev/sda2 物理分区扩大了,但文件系统不能在线扩容。
在线扩容失败
六、实操:安装docker
apk add dockerd docker luci-app-dockerman \ |
导出系统配置备份
sysupgrade -b /tmp/backup.tar.gz |
把/tmp/backup.tar.gz下载到本地保存,用于故障恢复。
七、网络配置(N5105‑G47 5 口 I226,4 口 POE)
- 浏览器访问
http://192.168.1.1进入 LuCI;系统‑系统‑语言与界面切换简体中文。 - 网络 → 接口 → 设备,编辑
br‑lan桥接,将 4 个 POE 直通 I226 物理网卡加入 br‑lan 桥。
4 个 POE 口全部作为 LAN,直连 AP、监控摄像头,直接 POE 供电。
- WAN 接口绑定剩余一张 I226 网口,按需配置 PPPoE 拨号 / DHCP 获取上网。
- 需要修改 LAN 网段,SSH 编辑
/etc/config/network修改 lan 段 IP,保存生效。
验证网卡速率:
ethtool ethX,确认协商速率为2500baseT/Full即跑满 2.5G。
八、OpenWrt‑25.12 优缺点(针对 ESXi 虚拟机 N5105‑G47)
✅优点
- apk 包管理器依赖处理优于旧 opkg;内置
owut在线升级,升级固件可保留配置与已装软件包。 kmod‑igc驱动完善,ESXi PCI 直通 I226 网卡转发性能优秀。- 默认 nftables 防火墙,多 WAN、CAKE QoS 性能提升。
- ext4‑combined‑efi 镜像原生支持 50G 大磁盘,适合跑 Docker 容器、AdGuardHome、Samba 共享。
⚠️缺点 & 踩坑
- 旧
.ipk第三方插件不兼容,需要适配 apk;老旧代理脚本需要手动安装iptables‑legacy兼容包。 - ext4 镜像不要系统内在线扩容,极易改变 PARTUUID,虚拟机启动卡住
waiting for root device,优先 SystemRescue 离线扩容。 - 网上大量教程基于 opkg,25.12 全部使用 apk 命令,注意区分。
- I226 直通虚拟机必须 EFI 固件,传统 BIOS 会出现网卡识别异常。
九、系统升级
- 推荐 owut 在线编译升级(保留配置、已安装 apk 包)
bash
owut |
- sysupgrade 手动升级
bash
sysupgrade -v xxx.img.gz |
十、常见故障排查
- 虚拟机启动卡住
waiting for root device
诱因:在线扩容修改 PARTUUID。解决方案:挂载 SystemRescue ISO 启动,挂载 EFI 分区修改
grub.cfg,将root=PARTUUID=xxx改为root=/dev/sda2。
- I226 网卡识别异常,协商速率只有 1G
ESXi 确认网卡已经 PCI 直通,虚拟机重启;确认 OpenWrt 安装
kmod‑igc;网线必须支持 2.5G 速率。
- StarWind V2V Converter 无法上传 ESXi
ESXi 开启 SSH,放行 22 端口;XTerminal 验证 root 账号 SSH 登录;Windows 与 ESXi 网络互通。
- 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
# 创建持久化目录,存放容器配置数据 |
11.2 docker‑compose.yml 编写
新建docker‑compose.yml配置文件
bash
nano /mnt/docker/docker-compose.yml |
粘贴下面完整内容:
yaml
version: "3" |
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目录 |
看到两个容器状态Up代表启动成功。
11.4 访问 Web 管理界面
Lucky 访问地址:
http://192.168.1.1:16601,首次登录设置管理员账号密码;实现 DDNS、域名解析、反向代理、端口转发。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
#查看容器日志,排查启动失败 |
11.6 OpenWrt 25.12 注意事项
- OpenWrt 重启之后 dockerd 服务会自动开机启动,Lucky、1Panel 容器会自动恢复运行;
- 若修改 OpenWrt LAN 网段,访问地址跟随 LAN IP 变化;
- 1Panel 运行在路由器环境,不建议在里面部署高暴露公网业务,适合内网管理容器、管理 NAS、简单网站;
- 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 文件系统,扩容非常简单。官方提供了一个近乎自动的方法,可以安全无损地使用整块硬盘的空间。
重新安装并扩容最推荐在 “写盘后、第一次启动前” 完成,步骤如下:
💻 第一步:清除硬盘并写入镜像
清除旧分区表
使用dd命令清空目标硬盘(例如/dev/sdb)的开头,这是避免分区表冲突的关键一步:# 请务必确认 /dev/sdb 是您的目标硬盘!!!
dd if=/dev/zero of=/dev/sdb bs=1M count=8写入新镜像
将您下载的.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检查分区表并卸载硬盘
运行fdisk -l /dev/sdb查看分区。您会看到sdb1(boot)、sdb2(root) 和一个空的sdb128等分区。完成后安全弹出硬盘。
⚙️ 第二步:一键扩容
将写好系统的硬盘接到 OpenWrt 设备上,启动并立即通过 SSH 连接执行以下命令:
## 这里面包含有扩容工具 |
使用
resizepart命令扩容
这个命令是用来调整分区的大小的。它直接修改硬盘上的分区表,告诉系统这个分区现在可以使用整个硬盘的空间了。resizepart 2
2是系统根分区的编号。- 执行后,
sdb2分区将自动扩展,用满硬盘所有剩余空间。这一步是 OpenWrt 开发者专门为 squashfs 镜像设计的快捷方式,非常安全。
重启系统使分区生效
reboot
💡 备选方案:首次启动后脚本扩容
如果错过了写盘后的时机,可以试试 expand-root.sh 这个官方脚本。这个脚本的核心理念是离线操作,比手动操作更可靠。
OpenWrt 官方为你准备好了一键扩容脚本,它会自动创建启动任务来安全地调整你的分区大小:
# 下载官方扩容脚本 |
运行完上面的命令后,路由器会自动重启。第一次重启是让 parted在后台帮你把分区扩大到最大可用空间;第二次重启则是让系统自动调用 resize2fs把Overlay文件系统填满新扩充的空间。全程傻瓜化,无需人工干预。
# 1. 更新软件源 |
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列出所有sda、sdb、nvme0n1等。你需要根据容量大小,判断哪个是你的目标硬盘(比如/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 -20ls -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-ext4dmesg | 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打开一个新文件
# 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查看硬盘uuid:
blkid /dev/sdc1来获取分区的UUID,例如55657278-345f-4cf4-8d3c-34d8a83d06b2。使用UUID挂载更稳定,能避免设备编号变化导致的挂载失败问题。添加挂载配置:
vi /etc/config/fstabconfig '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共存。
从官方源下载opkgwget -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 版本。
安装 opkg:apk 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命令汇总 |
- 核心是安装
dockerd(Docker 守护进程) 和docker-compose。apk 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 然后回车格式化新分区为 ext4:
mkfs.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/dockerd在start_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-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 |
打开终端,使用普通用户(非 root)执行以下命令:
sudo apt update |
拉取源码并更新feeds
#创建新文件夹 |
若希望使用官方源码,可替换为:
git clone https://github.com/openwrt/openwrt.git
ostoreOS分区扩容
root@iStoreOS:~# parted # 输入 parted |
root@iStoreOS:~# parted /dev/sda unit s print free |
singbox安装
opkg update && opkg install sing-box_1.13.11_openwrt_x86_64.ipk |
安装zoneinfo
apk add zoneinfo-core zoneinfo-asia |