我想在macOS下更方便地操作NAS硬盘和Ubuntu台式机的文件。其中NAS是机械硬盘RAID6,写入速度在600MB/s左右,读取速度在1000MB/s左右,提供了Samba服务。Ubuntu是NVMe SSD组建的RAID0,本地读取可以达到10GB/s左右,提供了ssh登录。

macOS和NAS、Ubuntu之间通过万兆网口连接,网络最快可以到1250MB/s。我用automount实现自动挂载,当访问目录时就会挂载,也尝试失败了sshfs和rclone自动挂载。

自动挂载NAS Samba分区

使用automount自动挂载Samba分区非常容易,创建挂载点:

sudo mkdir -p /System/Volumes/Data/Network/{Downloads,OpenData}

为什么放在/System/Volumes/Data/Network?因为从Catalina开始系统根卷只读,直接写 /Volumes有时会被系统抢占,把挂载点放在数据卷最省事,也符合Apple的官方做法。

接下来修改/etc/auto_master文件,在文件末尾添加一行:

/-      auto_smb    -nobrowse,nosuid

告诉autofs有个自定义映射表,在/etc目录下找auto_smb文件。

创建/etc/auto_smb文件,挂载NAS分区:

/System/Volumes/Data/Network/Downloads  -fstype=smbfs,soft,noowners,rw  ://nas_user:password@nas_ip_address/Downloads
/System/Volumes/Data/Network/OpenData  -fstype=smbfs,soft,noowners,rw  ://nas_user:password@nas_ip_address/OpenData

soft表示服务器不在线时很快返回错误,不会卡住应用。

配置完成后,让 automount 服务重新加载配置,

sudo automount -vc
ln -sf /System/Volumes/Data/Network ~/
open ~/Network/OpenData/

挂载之后,用Blackmagic Disk Speed Test测试了一下读写速度很快:

macOS访问NAS速度基本达标

尝试sshfs和rclone失败

接下来自动挂载Ubuntu远程分区,我先尝试了sshfs和rclone,都无法自动挂载。由于macOS的System Integrity Protection (SIP)限制,无法在/sbin下创建mount_sshfsmount_rclone文件。而automount需要这两个文件实现自动挂载,所以只能通过launchd或者crontab曲线救国,不如automount方便。

首先,安装社区版sshfs,用于挂载Ubuntu远程分区。

# 安装macfuse和sshfs
brew install --cask macfuse
brew install gromgit/fuse/sshfs-mac
brew link --overwrite sshfs-mac

创建挂载脚本sshfs_auto_mount.sh

#!/bin/bash

MOUNTPOINT="/System/Volumes/Data/Network/Ubuntu"
REMOTE="yourname@ubuntu_ip_address:/home/yourname"
IDENTITY="/Users/yourname/.ssh/id_rsa"

mkdir -p $MOUNTPOINT
chown $(whoami) $MOUNTPOINT

/usr/local/bin/sshfs \
  -o allow_other,reconnect,noowners,IdentityFile=$IDENTITY \
  "$REMOTE" "$MOUNTPOINT"

reconnect会在网络抖动后自动重连,这里通过密钥连接。

通过sudo bash ./sshfs_auto_mount.sh连接,也可以添加到launchd开机启动,但是不支持访问时自动挂载。用Blackmagic Disk Speed Test测试读写速度不达预期,应该是sshfs本身的单线程限制,修改加密协议和compression选项都变化不大:

sshfs读写速度慢

为了提高SSH访问速度,又尝试了rclone,

brew install rclone
rclone config

配置Ubuntu连接:

n) New remote
Enter name for new remote. ubuntu_host
Option Storage. SSH/SFTP (sftp)
Option host. ubuntu_ip_address
Option user. yourname
Option key_file. ~/.ssh/id_rsa
Configuration complete. y) Yes this is OK (default)

创建挂载脚本rclone_auto_mount.sh

#!/bin/bash

MOUNTPOINT=/System/Volumes/Data/Network/Ubuntu
REMOTE=ubuntu_host:/home/yourname
VOLNAME=UbuntuHome

mkdir -p $MOUNTPOINT
chown $(whoami) $MOUNTPOINT

/usr/local/bin/rclone mount \
	$REMOTE $MOUNTPOINT \
	--volname $VOLNAME \
	--vfs-cache-mode writes \
	--allow-other \
	--daemon

通过sudo bash ./rclone_auto_mount.sh连接,也可以添加到launchd开机启动,但是不支持访问时自动挂载。因为rclone支持多线程,且有本地缓存,读写速度非常快,

rclone读写速度快

自动挂载Ubuntu远程分区

在经历了sshfs和rclone两个失败的尝试后,我使用了最简单的配置方法。macOS默认支持NFS分区自动挂载,在Ubuntu上安装NFS server:

sudo apt update
sudo apt install nfs-kernel-server

获取Ubuntu电脑的用户ID:

id yourname

会看到类似这样的输出,记下 uidgid 的数字:

uid=1000(yourname) gid=1000(yourname) groups=1000(yourname),...

修改/etc/exports,在文件末尾添加以下行,以允许Mac电脑的网段 192.168.10.0/24192.168.11.0/24这两个网段的客户端访问:

/home/yourname 192.168.10.0/24(rw,sync,no_subtree_check,all_squash,anonuid=1000,anongid=1000) 192.168.11.0/24(rw,sync,no_subtree_check,all_squash,anonuid=1000,anongid=1000)

请将yourname, 192.168.10.0/24, 192.168.11.0/24, 1000 替换为你的真实信息。

保存文件后,运行命令使配置生效:

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

配置防火墙,允许指定的 IP 地址段访问 NFS 服务:

sudo ufw allow from 192.168.10.0/24 to any port 2049
sudo ufw allow from 192.168.11.0/24 to any port 2049
sudo ufw enable
sudo ufw status

配置macOS自动挂载NFS分区,修改/etc/auto_master文件,在末尾添加一行:

/-      auto_nfs    -nobrowse,nosuid

创建/etc/auto_nfs文件,挂载Ubuntu的NFS分区:

/System/Volumes/Data/Network/UbuntuHome   -fstype=nfs,vers=4,resvport,rw,bg,hard,intr,tcp         ubuntu_ip_address:/home/yourname

配置完成后,让 automount 服务重新加载配置,

sudo automount -vc
open ~/Network/UbuntuHome/

由于NFS默认设置成安全第一,服务器接收到数据后,立即将数据和相关的元数据写入到稳定的存储介质中。测试NFS分区的读写速度,写入速度稍慢:

NFS读写速度快

总结

通过配置,可以像操作本地文件一样,操作NAS和Ubuntu上的文件,可以用Audition等软件直接打开。将~/Network目录拖到Finder侧边栏,访问更方便。

参考资料