我想在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测试了一下读写速度很快:
尝试sshfs和rclone失败
接下来自动挂载Ubuntu远程分区,我先尝试了sshfs和rclone,都无法自动挂载。由于macOS的System Integrity Protection (SIP)限制,无法在/sbin
下创建mount_sshfs
和mount_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选项都变化不大:
为了提高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支持多线程,且有本地缓存,读写速度非常快,
自动挂载Ubuntu远程分区
在经历了sshfs和rclone两个失败的尝试后,我使用了最简单的配置方法。macOS默认支持NFS分区自动挂载,在Ubuntu上安装NFS server:
sudo apt update
sudo apt install nfs-kernel-server
获取Ubuntu电脑的用户ID:
id yourname
会看到类似这样的输出,记下 uid
和 gid
的数字:
uid=1000(yourname) gid=1000(yourname) groups=1000(yourname),...
修改/etc/exports,在文件末尾添加以下行,以允许Mac电脑的网段 192.168.10.0/24
和192.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分区的读写速度,写入速度稍慢:
总结
通过配置,可以像操作本地文件一样,操作NAS和Ubuntu上的文件,可以用Audition等软件直接打开。将~/Network
目录拖到Finder侧边栏,访问更方便。