如果你手里正好有一台飞牛NAS,打算把存储空间分给家里的电脑、电视、开发板用,大概率会在SMB和iSCSI两个名字面前犹豫一下。这两个词看着都像“把网络存储挂到本地”,但实际用起来完全是两种思路。我折腾飞牛存储有段时间了,踩过一些坑,也总结了一些经验,这篇就围绕SMB挂载和iSCSI挂载这两种连接方式,把原理、配置、适用场景一次性说清楚,帮你选对方向,少走弯路。
先说结论:如果你主要是多设备共享文件、看视频、办公文档,选SMB;如果你需要给某台机器提供一块“看起来像本地硬盘”的远程存储,用来跑数据库、虚拟机或者做磁盘扩展,选iSCSI。但为什么这么选、具体怎么配、遇到问题怎么排,才是这篇真正要讲透的内容。
1. 两种挂载方式的核心差异与设计思路
1.1 文件级共享与块级映射的本质区别
很多人在刚开始接触挂载时,会把SMB和iSCSI混为一谈,觉得“反正都是通过网络用飞牛的硬盘空间”。其实它们的底层逻辑完全不同。SMB是一个文件级协议,客户端通过它访问的是飞牛上已经格式化好的共享文件夹,看到的是目录、文件名、权限这些东西。飞牛的存储系统负责管理文件怎么落盘,客户端只负责读写文件内容。它的工作方式有点像你去图书馆借书,书怎么放在仓库里你不用管,你只需要通过柜台把书借出来看。
iSCSI是块级协议,它做的事情是把飞牛上的一块磁盘空间(或者一个文件镜像)模拟成一块“远程硬盘”,通过网络直接把这个裸设备交给客户端。客户端系统里会多出一块未初始化的磁盘,接下来要自己分区、格式化、建文件系统。这个过程就像你直接租了一整块地皮,土地平整、盖房、布线全部自己来,地皮本身不关心你拿来种什么。
这种本质差异决定了它们后续的诸多表现。文件级协议的优点是灵活、多客户端友好、权限管理细,缺点是性能损耗相对高,尤其是随机小文件读写时,协议转换和文件系统开销很明显。块级协议绕过了服务端的文件系统,数据路径更短,单机性能上限更高,但多客户端共享同一块盘几乎不可能(除非上集群文件系统),因为它呈现给客户端的是一个完整的块设备,客户端格式化后不会知道其他客户端做了什么。
1.2 为什么拿飞牛存储作为讨论对象
飞牛OS(fnOS)是当下挺火的一个NAS操作系统,界面做得比较清爽,底层是Linux,内置了SMB服务和iSCSI Target功能。选择它来讨论非常合适:一方面它面向的群体很广,从刚入门的小白到爱折腾的开发玩家都有;另一方面,它提供的两种服务都是最主流、兼容性最好的实现——SMB用的是成熟的开源Samba,iSCSI Target用的是Linux内核自带的LIO/TCM,这意味着通用性很强,你在飞牛上学到的配置方法,换到其他NAS或自己组装的Linux服务器上也一样适用。
飞牛系统里创建SMB共享和iSCSI Target都不需要命令行操作,只要在Web管理界面里点点点就行,这对新手非常友好。但它背后涉及的概念(文件级 vs 块级、端口、协议版本、CHAP认证、LUN等)并不因为界面友好而减少。所以我的文章会以飞牛的具体操作为例,把每个环节背后的原理同步讲清楚,这样哪怕你以后换平台,也能举一反三。
1.3 两条技术路线的适用场景取舍
从我的实际使用经验来看,选SMB还是iSCSI,本质上是在回答三个问题:需要多人同时访问吗?需要服务端提供文件系统管理能力吗?对单点性能的敏感度有多高?
- 多人协作/多设备访问:SMB胜出。Windows、macOS、Linux、电视盒子、手机App都能连,Windows资源管理器里直接输IP就能看到共享文件夹。
- 需要服务端统一管理快照、回收站、用户权限:SMB胜出。这些功能在飞牛里都是围绕共享文件夹设计的,iSCSI的裸块设备基本只能依赖你自己在客户端上做维护。
- 单机需要大容量“本地磁盘”且性能敏感:iSCSI胜出。尤其是数据库文件、虚拟机磁盘镜像,块级协议延迟更低、吞吐更稳定。
- 多台设备共享同一存储池做数据库集群:这种需求超出了SMB和iSCSI的范畴,应该去看分布式文件系统或SAN架构,而不是纠结挂载协议本身。
我见过不少人直接拿SMB给虚拟机放虚拟磁盘镜像,结果跑IO密集的业务时延迟忽高忽低;也见过有人用iSCSI给全家电视共享电影,结果每台设备都得先格式化一块盘,根本没法用。工具本身没有优劣,用错了场景才是问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析:协议参数、权限模型与性能因素
2.1 SMB挂载的关键参数与权限机制
SMB的全称是Server Message Block,最早的版本可以追溯到上世纪80年代。日常使用中我们最需要关注的是协议的版本差异:SMB 1.0非常古老,存在严重的安全漏洞,早就应该被禁用;SMB 2.0/2.1随Windows Vista/7推出,性能提升明显;SMB 3.0及以后版本支持加密、多通道、故障转移等企业级特性。飞牛默认开启的SMB 3.0,但如果你家里还有Windows 7甚至XP的老设备,连接时可能出现协商失败,这时候就得单独给老设备开低版本兼容,代价是安全性下降,我不太建议在关键数据场景下这么做。
挂载SMB时,几个核心参数值得关注。默认TCP端口是445,如果跨网段访问要确保路由器和防火墙放行这个端口。账号体系上,飞牛的用户账号就是SMB账号,你可以给不同用户分配不同共享文件夹的读写权限。Linux下使用mount命令挂载SMB时,有四个参数我很常用:
bash复制mount -t cifs //192.168.1.100/共享名 /mnt/fn_share \
-o username=fn_user,password=你的密码,vers=3.0,uid=1000,gid=1000,iocharset=utf8,_netdev
- vers=3.0:强制使用SMB 3.0协议,避免内核自动协商时降级到老版本。
- uid/gid:指定挂载后文件在本机显示的所有者,如果不设,默认可能是root,普通用户写不了文件。这也是很多人在Linux上挂载SMB后发现“只能看不能写”的主要原因。
- iocharset=utf8:保证中文文件名显示不乱码。
- _netdev:告诉系统在网络就绪后再挂载,否则开机时网络还没起来,挂载会失败,导致开机过程卡顿甚至无法进入系统。
Windows端挂载SMB更简单,直接Win+R输入\\192.168.1.100回车,或者在“此电脑”里右键“映射网络驱动器”。Windows默认会自动协商到最高版本,遇到连接慢的情况,多半是系统在尝试其他端口(比如445不通时会尝试139),可以检查一下网卡是否启用了不必要的节能模式。
2.2 iSCSI挂载的核心概念与配置参数
iSCSI的术语比SMB更多,第一次接触容易懵。这里用最通俗的方式梳理一遍:一台iSCSI服务器(飞牛)叫做Target,它导出一个LUN(逻辑单元号),就是那块远程磁盘;发起连接的客户端叫做Initiator,就是想要这块磁盘的机器。两个角色之间通过默认端口3260通信。
IQN(iSCSI Qualified Name)是每台设备唯一的标识,格式类似iqn.2024-01.com.example:target1。它的作用相当于设备的身份证号,尤其在CHAP认证时,服务器和客户端都会核对彼此的IQN。CHAP认证机制类似“用户名+密码”的双向验证,配置时既可以在飞牛端设置账号密码,也可以设置目标端对发起端的反向认证,用来防止未经授权的机器连接你的存储。虽然家庭环境可能觉得多此一举,但我强烈建议至少开启单向CHAP,因为你无法保证局域网里不会有陌生设备扫描端口。
在飞牛上创建iSCSI Target时,需要选择一块存储空间或一个文件作为后端。这里有个关键区别:如果你把整个独立磁盘/阵列划给iSCSI,性能最好,但灵活性低,飞牛自己的文件系统就无法直接管理这块空间;如果你用一个文件镜像作为LUN,管理方便,但会有一点性能损耗。我倾向于在飞牛的机械盘阵列里划一个文件镜像来做iSCSI,理由是后续迁移和备份更方便——直接拷贝这个镜像文件就能搬走,如果是裸分区反而不好处理。
客户端拿到iSCSI磁盘后,初始状态是“脱机”的。Windows里需要先打开磁盘管理,看到新磁盘后右键“联机”,再初始化(MBR或GPT)、创建卷、格式化。Linux下则要先分区(fdisk/parted)、格式化(mkfs.ext4/xfs),再mount。这个动作很多人会漏掉,导致连接成功却看不到盘符,误以为没挂上。
2.3 网络、磁盘阵列与性能因素的平衡
挂载方式选好了,网络和存储后端同样决定实际体验。很多人在千兆局域网里测速发现跑不满,第一反应怀疑协议不行,其实问题往往出在线缆、交换机网口速率或是文件碎片上。
先说网络。无论SMB还是iSCSI,千兆网络的理论吞吐大约是125MB/s,扣除协议开销后,SMB单线程大文件传输一般90-110MB/s,iSCSI可以略高但差距不大。如果你用的是机械硬盘阵列,读写速度很可能还没到100MB/s,这时瓶颈在磁盘,升级协议意义不大。如果你的客户端是SSD且飞牛端是NVMe SSD组成的阵列,千兆网就会成为瓶颈,这时候可以考虑万兆网卡或链路聚合。还有一个小优化是开启巨帧(Jumbo Frame,MTU 9000),对iSCSI这种块级协议收益更明显,但需要全程所有网络设备(交换机、网卡、驱动)都支持,少一个环节就会引发分片或丢包,反而更慢。
再说磁盘阵列。SMB走的是飞牛文件系统,你可以开快照、开回收站,数据冗余由RAID或飞牛的存储池机制保证。iSCSI直接映射块设备,如果后端没有冗余,一旦物理盘损坏,整块映射盘数据都完蛋。所以用iSCSI时,飞牛后端最好建立在RAID1/RAID5/RAIDZ这类有冗余的存储池上。另外,机械盘不建议同时跑大量随机小IO(比如数据库),无论什么协议都会卡;这种情况应该考虑SSD。
3. 实操过程与核心环节实现
3.1 飞牛端开启SMB服务并创建共享目录
飞牛的Web界面默认就带文件共享模块。进入控制面板,找到“文件共享”或“SMB”设置项,打开SMB服务开关,建议勾选“启用SMB 3.0协议”,这是当前兼容性和安全性最均衡的选项。如果你的局域网里全是近几年买的设备,直接SMB 3.0即可;如果还有Windows 7、老电视盒子等设备,才需要额外勾选SMB 1.0/2.0兼容。
接着创建共享文件夹。在“存储空间”里选一个目录,命名为movie或data等,设置允许访问的用户。飞牛会为每个用户分配独立的账号,建议不要使用guest匿名登录,因为你一旦开放匿名,所有设备不需要账号就能写入,后面出了问题根本没法追溯是谁干的。配置完成后,飞牛的SMB服务就会自动把这个共享目录广播出去,客户端可以发现它。
3.2 Windows和Linux挂载SMB的完整步骤
Windows挂载网络驱动器的路径是固定的:打开“此电脑”→右键“映射网络驱动器”→选择盘符→输入\\飞牛IP\共享名→勾选“使用其他凭据连接”→输入飞牛用户密码。完成后就能在资源管理器里直接拖文件了。我建议勾选“登录时重新连接”,这样每次开机都会自动映射,省去手动连的麻烦。如果网络路径打不开,先试试能否ping通飞牛IP,再看Windows防火墙是否拦截了“文件和打印机共享”。
Linux这边我用的是Ubuntu/Debian系,先安装cifs-utils:
bash复制sudo apt install cifs-utils
mkdir -p /mnt/fn_share
sudo mount -t cifs //192.168.1.100/movie /mnt/fn_share \
-o username=fn_user,password=密码,vers=3.0,uid=1000,gid=1000,iocharset=utf8,_netdev
为了安全,我不建议把密码直接写在命令行里,而是写到凭证文件:
bash复制sudo nano /etc/cifs-creds
# 内容格式:
# username=fn_user
# password=密码
sudo chmod 600 /etc/cifs-creds
sudo mount -t cifs //192.168.1.100/movie /mnt/fn_share \
-o credentials=/etc/cifs-creds,vers=3.0,uid=1000,gid=1000,iocharset=utf8,_netdev
要实现开机自动挂载,把mount命令写入/etc/fstab。需要注意,网络文件系统一定要加_netdev参数,否则开机时网络管理器还没初始化,fstab会等待超时,导致系统开机变慢甚至卡住。
3.3 飞牛端创建iSCSI Target的配置流程
进入飞牛Web管理界面,找到“存储管理”或“块设备/ISCSI”模块,点击“创建iSCSI Target”。填写Target名称(例如iqn.2024-01.com.example:fn-iscsi),选择LUN创建方式并划分空间。飞牛支持从已有存储池创建“文件LUN”或“块LUN”,文件LUN会生成一个大文件存放数据,块LUN则直接映射裸设备。
首次配置时,我建议启用CHAP认证,设置用户名和至少12位的密码。别嫌麻烦,这个认证能有效避免局域网内其他设备连上来乱写。创建完成后记下以下信息:飞牛IP、Target IQN、LUN编号、CHAP用户名/密码。这些信息在客户端配置时一个都不能少。
还有一个细节:iSCSI Target创建后,默认允许任意Initiator连接,建议在飞牛里把允许的Initiator加入白名单,只填你希望的客户端IQN。这个IQN可以在客户端工具里查看到,Windows的“iSCSI发起程序”界面直接显示,Linux下执行cat /etc/iscsi/initiatorname.iscsi就能看到。
3.4 Windows和Linux挂载iSCSI的完整步骤
Windows配置iSCSI非常简单:打开“控制面板”→“管理工具”→“iSCSI发起程序”(或直接在搜索框输入“iSCSI”)。第一次打开会提示启动服务,确认即可。在“目标”选项卡里填入飞牛IP,点击“快速连接”,然后选择“高级”填写CHAP用户名和密码,认证通过后状态变为“已连接”。接下来到“磁盘管理”里找新出现的磁盘,右键联机、初始化、新建简单卷,完成格式化后就会出现一个盘符。
Linux下使用open-iscsi工具:
bash复制sudo apt install open-iscsi
sudo systemctl enable --now iscsid
# 发现目标
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100
# 连接目标
sudo iscsiadm -m node -T iqn.2024-01.com.example:fn-iscsi -p 192.168.1.100 -l
如果启用了CHAP,还需要编辑节点配置文件:
bash复制sudo vim /etc/iscsi/nodes/iqn.../默认节点文件
# 添加或修改:
# node.session.auth.authmethod = CHAP
# node.session.auth.username = 用户名
# node.session.auth.password = 密码
连接成功后,fdisk -l能看到新磁盘,分区、格式化、挂载:
bash复制sudo fdisk /dev/sdb # 创建分区
sudo mkfs.ext4 /dev/sdb1
sudo mkdir /mnt/iscsi_disk
sudo mount /dev/sdb1 /mnt/iscsi_disk
开机自动挂载同样可以写入fstab,但iSCSI有一点和SMB不同:它需要先登录目标再挂载文件系统。所以我会先用systemd服务或iscsiadm -m node -t设置自动登录,再在fstab里加_netdev参数。顺序错了会出现“设备不存在”的报错。
4. 常见问题与排查技巧实录
4.1 连不上、看不到共享与磁盘的排查路径
我在实际使用中遇到过几次“怎么都连不上”的情况,总结下来大概率是下面几个原因。防火墙是第一嫌疑,Windows系统防火墙或第三方安全软件拦截了445或3260端口;飞牛系统如果开了防火墙,也需要放行对应端口。第二个原因是跨网段问题,比如飞牛在192.168.1.x,而电脑在192.168.50.x,路由器如果没有配置跨网段路由或交换机隔离了VLAN,两边根本不通。第三个原因是服务端没有把共享或Target真正开启,飞牛界面显示“已启用”不代表服务进程正常,可以在飞牛终端里执行systemctl status smbd或systemctl status target确认。
还有一个Windows特有的坑:SMB访问时一直转圈然后报错“找不到网络路径”。这通常是Windows在尝试SMB直通以外的协议(如NetBIOS over TCP/IP的139端口),而路由器封了相关端口。解决办法是在“启用或关闭Windows功能”里勾选“SMB 1.0/CIFS文件共享支持”来兼容老协议,或者确保445端口在路由器上是放行的。
4.2 iSCSI连接成功但磁盘不可用的处理技巧
iSCSI连接状态显示“已连接”,但资源管理器里看不到新盘符,这种情况对新手特别多。关键在Windows的“磁盘管理”里把新磁盘状态从“脱机”改成“联机”,然后初始化、格式化。Linux下则是lsblk能看到设备,但没有分区表,需要手动fdisk和mkfs。如果你的客户端是虚拟机或云主机,还要确认虚拟化平台是否允许挂载额外的SCSI磁盘。
另一个容易误导的问题是:使用文件镜像作为LUN时,如果飞牛存储空间满了,iSCSI盘会进入只读或报IO错误。文件镜像虽然方便,但它的容量在上限内是动态增长的,并不是创建时一次占满。所以你要定时关注飞牛存储池的剩余空间,建议给iSCSI LUN所在存储池预留20%以上的余量,否则一旦打满,客户端上的文件系统可能损坏。
4.3 性能问题:速度达不到预期的几个常见原因
用飞牛挂载后,如果测速只有二三十MB/s,先别急着怪协议。我用一个排查清单来定位:
- 确认客户端和飞牛都连在同一个千兆交换机上,不要走无线。Wi-Fi即使信号满格,实际吞吐也可能只有几十MB/s,尤其隔了一堵墙。
- 检查网线和接口协商速率。飞牛网卡的灯亮橙色不一定代表百兆,也可能代表千兆;直接在管理界面里看网口协商速度最靠谱。
- 确认机械硬盘没有在同时做RAID重建、文件校验等后台任务,这会大幅拖慢共享速度。
- 尝试大文件传输和小文件传输分开测。SMB在传输大量4KB小文件时慢是正常的,因为每个文件都有协议开销;如果都是几千个照片缩略图,iSCSI也不见得会快。
- 开启巨帧前先在飞牛和客户端分别测试ping大包:
ping -M do -s 8972 192.168.1.100,如果全程能通,再尝试把MTU设为9000。任何设备不支持就回退到1500。
4.4 问题速查表:常用故障一览
| 症状 | 可能原因 | 排查/解决办法 |
|---|---|---|
| Windows无法访问SMB共享 | 防火墙拦截445/139端口 | 放行“文件和打印机共享”,测试445端口连通性 |
| Windows 7等老设备连不上SMB | 协议版本协商失败 | 飞牛端开启SMB 1.0兼容,但注意安全风险 |
| Linux挂载SMB后无法写入 | uid/gid权限不对 | 在挂载参数中指定登录用户的uid/gid |
| 中文文件名乱码 | 字符集未指定 | 添加iocharset=utf8参数 |
| iSCSI已连接但无盘符 | 磁盘未联机/未初始化 | Windows磁盘管理联机并初始化,Linux fdisk分区 |
| iSCSI连接认证失败 | CHAP用户名/密码不一致 | 检查节点配置中的认证信息,重新登录 |
| 挂载后无法开机自动挂载 | fstab缺少_netdev,iSCSI尚未登录 | 添加参数,设置iscsi自动登录 |
4.5 我踩过的两个坑
第一个坑是SMB挂载的fstab里忘了加uid/gid,结果docker容器以非root身份运行,写入挂载目录时一直报Permission denied。当时以为是飞牛权限配置问题,折腾半天才发现是Linux客户端挂载参数里uid是0,容器内用户不是root,当然写不进去。
第二个坑是给虚拟机直通了一个iSCSI LUN,后来某次飞牛系统维护重启,虚拟机没设置开机自动重连iSCSI,恢复后虚拟机的文件系统直接进入只读状态。还好当时跑的是测试环境,数据损失不大。从那之后,所有生产级别的iSCSI客户端我都设置了自动登录和开机重连,并保证飞牛存储池至少有快照备份。
5. 最终建议:如何选择适合你的连接方式
5.1 选SMB的典型场景
如果你的飞牛主要用途是充当家庭媒体中心、文件服务器、多人办公共享盘,SMB几乎是最优解。它不需要客户端做任何格式化操作,连上就能看到文件夹;权限管理能力强,可以给每个家庭成员单独账号;对多设备并发读取非常友好,电视、手机、电脑可以同时播放视频。SMB也是我推荐的“默认选项”,因为大多数需求并不需要块级协议。
5.2 选iSCSI的典型场景
当你面对的是“一台机器需要一块可靠、低延迟的远程磁盘”时,iSCSI明显更合适。典型场景包括:Windows下的SQL Server/MySQL数据库文件放在iSCSI盘上,利用克隆和快照做备份;VMware或KVM虚拟机把虚拟磁盘镜像直接放在iSCSI LUN上,方便迁移;开发板或瘦客户端无本地磁盘,需要PXE引导并从iSCSI启动系统。这些场景都有一个共同点:同一块盘只归属一个客户端,不需要多设备乱写。
5.3 决策清单:动手前的自查
我建议在真正配置之前,花一分钟过一下这个清单:
- 需要多个设备同时读写同一份数据吗?是→SMB;否→继续看。
- 对性能有高要求且单机独占?是→iSCSI。
- 服务端需要快照、回收站、用户配额?是→SMB。
- 能接受在客户端手动分区和格式化吗?能→iSCSI;不太想折腾→SMB。
- 以后可能需要随时扩容、迁移?SMB的共享文件夹迁移更简单,直接复制目录;iSCSI则需要处理镜像文件或重新映射。
只要按这个思路走,基本不会选错。
我个人在实际操作中养成的习惯是“混合使用”:飞牛上同时开着SMB和iSCSI两个服务,日常文件、视频、App备份走SMB,虚拟机和数据库镜像单独划一块iSCSI。这种搭配既兼顾了易用性,又保证了关键应用的性能。最后再分享一个经验:无论你选了哪种方式,在第一次大范围写入数据前,先在共享目录或iSCSI卷里放置测试文件,连续跑几次读写,确认速度稳定、没有断连,再正式迁数据。网络存储最怕的就是“能连但是不稳定”,提前测过,后面能省很多麻烦。
