外观
块存储:iSCSI 与 NVMe/TCP
完成后,OMV 把一块磁盘、一个镜像文件或一个 ZFS 卷当成裸盘通过网络交给另一台机器。那台机器看到的是一块本地硬盘,自己分区、格式化、挂载。
适合谁与不适合谁
| 目的 | 选什么 |
|---|---|
| 在 Windows、Linux 客户机上要一块「本地盘」(游戏库、程序目录、虚拟化平台的存储) | 块存储:iSCSI 或 NVMe/TCP |
| 多台电脑同时读写同一批文件 | 不要用块存储,用 SMB 或 NFS |
| 只想在客户机上多一块盘 | 块存储可以,但要想清楚备份 |
块存储与文件共享的根本区别:OMV 看不到目标里的文件,只提供一堆块;文件系统在客户端那边。所以:
- OMV 的共享文件夹、权限、回收站、SMB 审计对它都没有作用。
- 同一个目标不要同时挂到两台机器上,除非客户端用的是集群文件系统,否则必然损坏数据。
- OMV 上的文件级备份工具读不到里面的文件。
这两个插件没有或只有很弱的认证,数据可能被抹掉
- 影响范围:目标的后备存储(backing store)填成了某块数据盘,客户端一格式化,这块盘的数据就没了;删除 tgt 的镜像会连同镜像文件一起删除;iSCSI 目标的发起端地址(Initiator address)留空表示任何地址都能连;NVMe/TCP 只靠主机 NQN 白名单,NQN 不是秘密,插件界面里也没有 TLS 或认证设置。
- 前置条件:只在可信的内网或专用网口、VLAN 上使用,不要映射到公网。先在测试用的小镜像上练习;后备设备用
存储器 → 磁盘(Storage → Disks)按型号和序列号核对。NVMe/TCP 插件标注为实验性。 - 怎么回退:先在客户端断开连接,再在 OMV 里禁用目标,最后才删除。镜像文件和后备盘上的数据没有回退,靠客户端侧的备份。
插件信息
| 项 | iSCSI | NVMe/TCP |
|---|---|---|
| 包名 | openmediavault-tgt | openmediavault-nvmetcp |
| 来源 | omv-extras | omv-extras |
| OMV 8 状态 | 截至 2026-10-22 的 omv-extras synchrony 软件源为 8.0.1 | 8.0.1,README 标注为实验性(experimental) |
| 菜单位置 | 服务 → Tgt(Services → Tgt):设置、目标、镜像 | 服务 → NVMe/TCP(Services → NVMe/TCP):Settings、Ports、Subsystems、Associations |
| 依赖 | tgt、openmediavault-sharerootfs | 内核自带的 nvmet、nvmetcli、openmediavault-sharerootfs |
两个插件都依赖 sharerootfs,不要卸载它,见 sharerootfs。先装 omv-extras。
安装
系统 → 插件(System → Plugins)搜索 tgt 或 nvmetcp,安装需要的那个,硬刷新浏览器。
iSCSI(tgt)
配置
服务 → Tgt → 设置:勾选启用(Enable),保存、应用。服务 → Tgt → 镜像(Images):如果后备存储用镜像文件,创建一个。路径(Path)用文件夹浏览器在根文件系统下选择,大小(Size)以 GB 为单位。镜像是用dd以跳过的方式创建的稀疏文件,不会立刻占满空间,但写满之后会占满,要留够空间,放在数据盘上而不是系统盘。服务 → Tgt → 目标(Targets)→ 创建:
| 字段 | 说明 |
|---|---|
| 启用(Enable) | 默认不勾 |
| 名称(Name) | 只允许小写字母、数字、- 和 .。IQN 由插件生成,形如 iqn.年-月.<域名反写>:<名称> |
| 后备存储(Backing store) | 镜像文件路径或块设备路径,多个用逗号分隔 |
| 发起端地址(Initiator address) | 允许连接的客户端,主机名或 IP,多个用空格分隔。留空表示任何地址都能访问,务必填写 |
| 扩展选项(Extra options) | 原样写入目标配置,CHAP 等认证只能在这里按 tgt 语法写,插件界面没有专门的认证字段 |
- 保存,点黄色提示条上的应用。
客户端连接
在客户端电脑上操作。Windows 用自带的 iSCSI 发起程序;Linux 安装 open-iscsi 后:
sh
iscsiadm -m discovery -t sendtargets -p <OMV 的 IP>
iscsiadm -m node -T <目标的 IQN> -p <OMV 的 IP> --login连接成功后客户端出现一块新盘,由客户端自己分区、格式化。
NVMe/TCP(实验性)
服务 → NVMe/TCP → Settings:Enable,保持 Auto-associate ports and subsystems(默认开)。- Ports → 添加:Address 填专用网口的 IP(
0.0.0.0表示监听所有地址,暴露面更大,不推荐),TCP port 填4420,Address family 选 IPv4。填的地址不属于本机时,插件会退回到监听该地址族的全部地址,所以要核对填对了。 - Subsystems → 创建:勾选 Enable,填 NQN(必须唯一,客户端依赖它,创建后别改),Allow any host 关闭,在 Hosts 里填客户端的主机 NQN(客户端上看
/etc/nvme/hostnqn)。再添加命名空间(Namespace),Backing path 填/dev/sdX、/dev/mapper/<卷组>-<逻辑卷>或/dev/zvol/<池>/<卷>等块设备。 - 保存,点黄色提示条上的应用。
命名空间固定以读写方式导出,内核的 nvmet 没有单个命名空间的只读开关;想限制访问,只能靠主机白名单。
在 Linux 客户端电脑上连接:
sh
modprobe nvme-tcp
nvme discover -t tcp -a <OMV 的 IP> -s 4420
nvme connect -t tcp -a <OMV 的 IP> -s 4420 -n <子系统 NQN>
lsblk设备出现为 /dev/nvme0n1 之类。长期使用建议把 NQN 稳定下来,每个子系统用不同的序列号,并用专用网卡或 VLAN 传输。Windows 客户端要求 4K 块大小和单个命名空间,具体以插件 README 为准。
检查结果
- 客户端连上后能看到新盘,格式化、写入、读取、断开再重连都正常。
- 在 OMV 的 shell(root)只读查看服务端状态:
sh
tgtadm --lld iscsi --mode target --op show
nvmetcli ls- 反向验证:从一台没有被列入白名单的机器尝试连接,应该失败。能连上就说明暴露了。
- 重启 OMV,目标和端口自动恢复。
备份与维护
- 备份:OMV 读不到里面的文件,所以主要在客户端侧备份文件;要备份镜像文件本身,必须先让客户端断开,否则拿到的是不一致的镜像。见 备份策略。
- 后备设备用 ZFS 卷或 LVM 逻辑卷最方便扩容和快照,见 ZFS 插件、LVM 插件。
- iSCSI 镜像扩容:镜像页有增长(Grow)按钮,输入新的大小(GB);之后还要在客户端扩展分区和文件系统。
- 更新:NVMe/TCP 迭代很快,更新前读 changelog。
- 卸载:先在客户端断开所有连接,再卸载插件。
常见问题
客户端发现不了目标。 确认服务已启用并应用、目标已启用、发起端地址包含客户端 IP、防火墙放行 iSCSI 的 3260 或 NVMe/TCP 的 4420 端口。
NVMe/TCP 报 Host not allowed。 把客户端的主机 NQN 加到子系统,或临时打开 Allow any host(只在受控网络)。
服务端起不来。 NVMe/TCP 查看 journalctl -u nvmet,确认内核有 nvmet 和 nvmet-tcp。
多台机器要共享同一份数据。 改用 SMB 或 NFS。
参考资料
- 插件源码:openmediavault-tgt、openmediavault-nvmetcp(含 README 中的客户端示例)
- tgt 项目:github.com/fujita/tgt
- 客户端工具:nvme-cli、open-iscsi