跳转到内容

NAS 与网络共享 ​

家里或办公室有一台 NAS、一块接在路由器上的硬盘,或者另一台开了共享的电脑,都属于这一类:通过网络访问的存储。

访达里连上去很简单,麻烦的是之后——断开、重连、权限不对、莫名生成一堆隐藏文件。这一篇讲怎么连、怎么排查,以及一个容易搞错的前提。

开始之前 ​

需要局域网里有一台可访问的共享存储。命令行部分需要能在终端执行命令。挂载操作可随时卸载,不会改变系统配置。

先说清楚:NAS 不等于备份 ​

NAS 常见的 RAID 配置能在一块盘坏掉时继续工作,这只防硬盘故障这一种风险。

它防不住:误删除(会立刻同步到所有盘)、NAS 本身故障或被偷、火灾水灾、勒索软件加密网络共享。

所以「东西都放 NAS 上了」不等于做了备份。NAS 可以是备份策略里的「本地备份」那一环,但异地那一环仍然要另外安排。

用哪个协议 ​

SMB。这是现在的通用选择:macOS、Windows、Linux、NAS 系统都支持,性能和功能都在持续维护。

AFP 是 Apple 早年的协议,现在属于遗留方案。老 NAS 可能还提供,但没有理由主动选它——新设备的 AFP 支持只会越来越弱。

NFS 在 Unix 环境里常见,权限模型和 macOS 的用户体系对不上时会很折腾。除非有明确理由,否则用 SMB。

在访达里连接 ​

按 Command-K(「前往 → 连接服务器」),输入:

smb://192.168.1.100

也可以用主机名,例如 smb://mynas.local。.local 后缀走的是 Bonjour 局域网名称解析,不需要配置 DNS。

直接连到某个共享目录:

smb://192.168.1.100/media

输入账号密码时,勾选「在我的钥匙串中记住此密码」,以后就不用重复输入——凭据存在钥匙串里,见凭据管理。

连上后共享会出现在访达边栏,并挂载在 /Volumes/ 下。

命令行挂载 ​

需要写进脚本时用 mount_smbfs:

sh
mkdir -p ~/mnt/nas
mount_smbfs //用户名@192.168.1.100/media ~/mnt/nas

第一条命令先建好挂载点——mount_smbfs 不会自动创建目录,目录不存在时直接报错。第二条里 //用户名@主机/共享名 是 SMB 的地址写法,命令会提示输入密码。

卸载:

sh
umount ~/mnt/nas

提示设备忙时,说明还有程序在使用这个目录。用 lsof ~/mnt/nas 找出是谁(见命令行网络诊断里 lsof 的用法),不要一上来就强制卸载。

不要把密码写进命令 ​

mount_smbfs 的地址里可以带密码,网上很多脚本就是这么写的。不要这样做——密码会留在 shell 历史和进程列表里。

正确做法是先在访达里连接一次并勾选保存到钥匙串,之后 mount_smbfs 会自动使用钥匙串中的凭据,不再提示输入。

查看连接状态 ​

sh
smbutil statshares -a

smbutil 是 SMB 的管理工具,statshares 显示共享的属性,-a 表示所有已挂载的共享。

输出里值得关注的是协议版本和加密相关的项目。走的是 SMB 3 且启用了加密,说明传输内容在局域网里不是明文。老设备可能只支持更低的版本——这时候要意识到,同一个局域网里的其他设备理论上能看到传输内容。

网络卷上的常见麻烦 ​

到处都是 .DS_Store ​

访达在浏览过的每个目录里写一个 .DS_Store 文件记录视图设置。在共享目录上,这会让其他人(尤其是 Windows 用户)看到一堆莫名其妙的文件。

Apple 提供了一个设置来禁止在网络卷上写这类文件:

sh
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true

defaults 读写 macOS 的偏好设置,write 表示写入,-bool true 指定值的类型和内容。需要注销后重新登录才生效。

代价是网络目录的视图设置(排序方式、图标大小)不再被记住。撤销:

sh
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool false

注意这只影响网络卷,本地磁盘上的 .DS_Store 照旧。

睡眠唤醒后连接断开 ​

Mac 睡眠时网络连接会断,唤醒后挂载点可能变成失效状态——访达里还能看到,点进去却无响应。

处理方式是先卸载再重新连接,而不是反复点击。写成脚本的话,可以在使用前先检查挂载是否有效:

sh
if ! mount | grep -q "on /Users/你的用户名/mnt/nas"; then
  mount_smbfs //用户名@192.168.1.100/media ~/mnt/nas
fi

if ! 表示「如果条件不成立」,grep -q 只判断有没有匹配而不输出内容(-q 是安静模式)。整段的意思是:没挂载才挂载。

登录时自动连接 ​

访达连接一次之后,把挂载的卷拖进「系统设置 → 通用 → 登录项」的列表,下次登录会自动连接。

这个方式简单,但网络还没就绪时会失败。对可靠性有要求的场景,用 LaunchAgent 配合上面那段检查脚本更稳妥,见 launchd。

权限看起来不对 ​

网络共享上显示的所有者和权限,是由服务器一侧的账号映射决定的,不一定和本机用户对得上。

在网络卷上执行 chmod、chown 经常无效或结果奇怪——应该去服务器一侧(NAS 的管理界面)设置权限,而不是在 Mac 上改。这和权限与扩展属性讲的本地文件权限是两套体系。

把 NAS 当时间机器目标 ​

不少 NAS 支持作为时间机器的备份目标,需要在 NAS 一侧启用对应功能,之后在「系统设置 → 通用 → 时间机器」里就能选到它。

三点提醒:

  1. 首次备份走网络会很慢,几百 GB 可能要跑一两天,尽量用有线连接完成第一次。
  2. 务必勾选加密。备份数据要经过网络并存在另一台设备上。
  3. 它仍然属于本地那一份。NAS 和 Mac 通常在同一个房间,整体性事故里一起没。

检查结果 ​

sh
mount | grep smbfs

能看到已挂载的 SMB 共享。

sh
smbutil statshares -a

能看到连接属性,确认协议版本符合预期。

sh
ls /Volumes

访达连接的共享会出现在这里。

动手练习 ​

完整走一遍连接与排查:

  1. 在访达里用 Command-K 连接一个共享,勾选保存密码到钥匙串。
  2. 执行 mount | grep smbfs,找出它实际挂载在哪个路径。
  3. 执行 smbutil statshares -a,记下协议版本。
  4. 在访达里推出该共享,再用 mount_smbfs 从命令行挂载到 ~/mnt/nas,确认不再提示输入密码(钥匙串生效了)。
  5. 用 umount 卸载,确认 mount | grep smbfs 里它消失了。

成功标准是第 4 步:命令行挂载没有提示输入密码,也没有在任何脚本里出现明文密码。这是把网络存储写进自动化流程的前提——凭据由钥匙串负责,脚本里只有地址。

返回数据、备份与远程