远程开发的方式有多种,比较方便的就是sftp。但是当22端口不可用时,sftp便不再可行了。这个时候,一种方便的方式就是mount远程目录到本地了。
本文基于CentOS 7 和macOS进行操作,具体版本如下:
服务器版本
#cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
系统版本
macOS Big Sur 版本 11.6 (20G165)
服务器安装配置nfs服务
安装及启动
- 安装nfs服务
yum install -y nfs-utils rpcbind
- 启动nfs服务(也可以配置完再启动)
systemctl start nfs
systemctl start rpcbind
- 配置随系统自动启动(也可以不配置)
systemctl enable nfs
systemclt enable rpcbind
配置可被挂载的目录
- 配置文件位置
/etc/exports
- 内容格式
可被挂载的目录
可访问的ip或者ip段
(选项
)
例子
/home/nemo 10.10.0.18(rw,all_squash,anonuid=9527,anongid=9527,sync,insecure)
解释:/home/nemo
是我想共享的目录,可以被10.10.0.18
挂载,挂载选项是:rw,all_squash,anonuid=9527,anongid=9527,sync,insecure,no_subtree
。具体含义见附录一。ip也是支持多格式的,见附录二。
重启服务,以生效配置
- 重启
nfs
服务即可,命令如下:
systemctl restart nfs
用户端(macOS)的配置
有两种方式,一种是简单粗暴的直接挂载。还有一种是用到再挂载,不用自动取消挂载。
第一种方式,直接挂载
命令如下:
sudo mount -o vers=4 -t nfs SERVER:/EXPORT/DIR /LOCAL/DIR
例如:
sudo mount -o vers=4 -t nfs 192.168.1.2:/share ~/1.2
解释:把192.168.1.2
上的/share
文件夹映射到本地的~/1.2
目录
第二种方式,自动挂载
需要用到automount
,索性macOS自带。操作步骤如下:
- 配置需要把挂载的目录放到哪里,修改配置文件:
/etc/auto_master
,在文件后边追加如下内容:
/Users/nemo auto_test
解释:/Users/nemo
是我希望挂载的目录存放的位置,auto_test
是挂载配置文件名,和/etc/auto_master
做相对路径计算。当然也可以写绝对路径,但是在执行df -h
的时候就没那么好看了。。。原文:
A map name beginning with / is the pathname of a file containing the map, otherwise the name represents a map to be found as a file in /etc or to be read from Directory Service (and thus from whatever sources Directory Service uses, such as NIS or LDAP servers).
- 创建挂载的配置文件
/etc/auto_test
,内容如下:
1.2 -rw,vers=4,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/share
解释:
1.2
即相对于/etc/auto_master
中指定的根目录计算的,绝对路径为:/Users/nemo/1.2
。-rw,vers=4,bg,soft,rsize=32768,wsize=32768
为选项,具体含义见附录三。192.168.1.2
为远程服务器,/share
为远程服务器上的绝对路径。
最终本地执行ls /Users/nemo/1.2
的效果等同于在服务器上执行ls /share
。
- 清空
automount
的缓存,使刚创建的配置生效:
sudo automount -vc
通过df -H -T nfs
即可查看到刚挂载上的nfs
文件夹了,例如:
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
192.168.1.2:/share 537G 72G 465G 14% 130762 262012710 0% /Users/nemo/1.2
附录一
rw 可读可写 ro 只读(还与文件系统的rwx有关) sync 数据同步写入到内存与硬盘中 async 数据先暂存于内存当中,不会直接写入硬盘 wdelay 当有写操作,就会检查是否有相关的写操作,并在一起执行(默认设置) no_wdelay 当有写操作就立即执行,通常要与sync配合使用 root_squash 当客户端登陆NFS的身份为root用户时,将客户端的root用户及所属组都映射为匿名用户或用户组(默认设置) no_root_squash 使客户端可以使用root身份及权限来操作共享的目录 all_squash 无论客户端登陆NFS的身份为何,都将映射为匿名用户 no_all_squash 无论客户端登陆NFS的身份为何,都将映射为root用户(默认设置) anonuid 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户 anongid 将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户 secure 使客户端只能从小于1024的tcp/ip端口连接服务端(默认设置) insecure 允许客户端从大于1024的tcp/ip端口连接服务端 subtree 当共享的目录是一个子目录,服务端会检查其父目录的权限(默认设置) no_subtree 当共享的目录是一个子目录,服务端不检查其父目录的权限
附录二
192.168.1.2 指定特定的的IP可以共享nfs目录 * 指定所有网段及ip都可以共享nfs目录 192.168.1.* 指定子网中的特定主机可以共享nfs目录 192.168.1.0/24 指定子网中的所有主机都可以共享nfs目录 example.com 指定域名的主机可以共享nfs目录
附录三
见:https://linux.die.net/man/5/nfs
参考
- (Linux)远程挂载网络磁盘详解—nfs共享
- MacOS自动挂载nfs服务器共享目录
man automount
man auto_master
man mount
- Establishing predefined NFS mounts
《“使用nfs挂载远程目录到本地进行开发的攻略 基于CentOS7、macOS”》 有 1 条评论
实测,自动挂载没啥意义,macOS会在连接不可用时提示挂载不可用。 当连接可用时,自动恢复挂载的可用性。基本就是无感的状态。