NAS本质是远程块/文件服务而非“联网硬盘”,其访问需经网络协议栈、服务端I/O调度与文件系统三层抽象,延迟达毫秒级,性能受协议、缓存及挂载选项影响远大于本地磁盘。

NAS 存储不是“插在网上的硬盘”,而是远程块/文件服务
很多人以为把硬盘接进 NAS 就等于“本地磁盘挂网上”,其实完全不是一回事。Linux 下访问 NAS(如通过 NFS 或 CIFS/SMB)时,数据要经过网络协议栈、内核文件系统层、服务器端的存储逻辑,中间至少多出 3 层抽象:网络传输、服务端 I/O 调度、服务端文件系统(如 XFS 或 ZFS)。而本地磁盘是直接走 /dev/sdX 设备节点,由内核块层直连驱动,延迟通常在微秒级;NAS 访问则动辄毫秒起步,尤其小文件随机读写时,一次 stat() 或 open() 可能触发多次往返。
- 本地磁盘:
dd if=/dev/zero of=/mnt/local/test bs=4k count=1000测的是纯设备写入能力 - NAS 挂载点:同样命令测的是“网络+服务端缓存+磁盘”整条链路,结果不可直接对标
- 常见错觉:看到
df -h显示容量一样,就认为行为一致 —— 实际上noatime、sync、cache等挂载选项对 NAS 的影响远比本地磁盘更敏感
协议类型决定你拿到的是“块”还是“文件”,不是硬盘型号说了算
一块西数红盘(NAS 专用盘)插在 Linux 主机上本地使用,它是块设备;同一块盘装进群晖 NAS,再用 SMB 共享出来,你在客户端看到的就是文件接口 —— 这和硬盘本身无关,只取决于服务端用什么协议暴露它。
-
iSCSI提供块级访问:Linux 客户端可iscsiadm登录后得到/dev/sdb,能自己格式化、建 LVM、跑数据库,但配置复杂,家用少见 -
NFS和CIFS/SMB是文件级:你挂载的是目录,所有ls/cp/mv都走服务端文件系统逻辑,不支持fdisk或mkfs - 关键区别:
chmod在 NFS 上可能失效(服务端不启用no_root_squash时 root 权限被降级),而在本地磁盘上永远生效
性能瓶颈不在硬盘,而在协议栈和缓存策略
你换上两块 NVMe SSD 做 RAID 0 放进 NAS,但 Windows 用资源管理器拖文件仍卡顿?大概率不是硬盘慢,而是 SMB 协议默认启用 sync writes,每写 4KB 就强制刷盘,把高吞吐变成高延迟。而本地磁盘默认走 Page Cache,大量写操作先落内存,异步刷回。
- 本地磁盘优化重点:调整
io scheduler(如none对 NVMe)、挂载加noatime,commit=60 - NAS 客户端优化重点:SMB 挂载加
cache=strict,hard,rsize=1048576,wsize=1048576;NFS 加soft,nolock,proto=tcp,timeo=14(根据实际网络质量调) - 容易踩的坑:
sync挂载选项对 NAS 是灾难——它让每次write()都等服务端落盘完成,IOPS 直接砍掉 90%
故障表现完全不同:本地磁盘挂了报 I/O error,NAS 挂了往往静默超时
本地磁盘掉线,dmesg 立刻刷 ataX.Y: failed command: WRITE FPDMA QUEUED;而 NAS 断网或服务崩溃,Linux 客户端可能只是 ls 卡住几十秒,最后报 Stale file handle 或干脆假死 —— 因为内核还在重试,没及时放弃。










