如何在 Linux 上部署 NFS 服务器
1. 准备工作
两台机器,一台作 NFS 服务器,一台作客户端。
他们的 ip 分别是
- NFS Server: 192.168.56.201
- NFS Client: 192.168.56.200
2. 安装依赖
分别在两台机器上安装如下包
$ yum install nfs-utils rpcbind
3. 部署 NFS
在 NFS 服务器上创建你要共享的目录,并给予 757 的权限(默认的权限,客户端只能读,不能写)
$ mkdir /var/lib/images
$ chmod 757 /var/lib/images
往 /etc/exports
文件中写入如下内容,代表开放 /var/lib/images 目录,并且允许 192.168.56.200 这个ip进行挂载,并且客户端可以对其有读写的权限。(如果你有需要,可以不要开放那么大的权限)
/var/lib/images 192.168.56.0/24(rw)
使用 exportfs -v
可以查看载入程序中的 export
信息
$ exportfs -v
可以发现我们刚刚修改完 /etc/exports
的内容并没有生效,这时候可以执行下这条命令刷新一下配置
$ exportfs -r
再次查看,就有了
exportfs -v
/var/lib/images
192.168.56.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
然后启动 nfs 服务(这个好像安装完 nfs-utils 就会自动启动)
systemctl start rpcbind
systemctl start nfs
并且设置开机自启
systemctl enable rpcbind
systemctl enable nfs
开启了 NFS 后,会开启非常多的端口
$ netstat -tulnp| grep -E '(rpc|nfs)'
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 6017/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 6074/rpc.mountd
tcp 0 0 0.0.0.0:53840 0.0.0.0:* LISTEN 6056/rpc.statd
tcp6 0 0 :::60780 :::* LISTEN 6056/rpc.statd
tcp6 0 0 :::111 :::* LISTEN 6017/rpcbind
tcp6 0 0 :::20048 :::* LISTEN 6074/rpc.mountd
udp 0 0 0.0.0.0:34887 0.0.0.0:* 6056/rpc.statd
udp 0 0 0.0.0.0:20048 0.0.0.0:* 6074/rpc.mountd
udp 0 0 0.0.0.0:111 0.0.0.0:* 6017/rpcbind
udp 0 0 0.0.0.0:680 0.0.0.0:* 6017/rpcbind
udp 0 0 127.0.0.1:720 0.0.0.0:* 6056/rpc.statd
udp6 0 0 :::20048 :::* 6074/rpc.mountd
udp6 0 0 :::111 :::* 6017/rpcbind
udp6 0 0 :::680 :::* 6017/rpcbind
udp6 0 0 :::45856 :::* 6056/rpc.statd
其中 111
是 rpcbind 开放的端口,2049 是 nfs 开放的
4. 连接 NFS
在客户端机器执行 showmount 命令,就可以查询 nfs 服务器上开放的 Export list
# 在客户端执行
showmount -e 192.168.56.201
Export list for 192.168.56.201:
/var/lib/images 192.168.56.0/24
# 在服务端执行 showmount -e
Export list for node1:
/var/lib/images 192.168.56.0/24
执行如下命令,就可以挂载 nfs 目录
$ mkdir /mnt/images
$ sudo mount -t nfs 192.168.56.201:/var/lib/images /mnt/images
在不指定本地路径的情况下,默认会挂载到 /mnt
目录下,比如上面这条命令就会挂载到 /mnt/nfs
为了避免你每次重启机器 都要手动执行这条挂载命令,你可以将他配置到 /etc/fstab
中
192.168.56.201:/var/lib/images /mnt/images nfs defaults 0 0
5. 验证效果
在客户端上创建一个 hello
文件,并写入内容
[root@master ~]# echo "hello, nfs" > /mnt/images/hello
[root@master ~]# ls -l /mnt/images/hello
-rw-r--r--. 1 nfsnobody nfsnobody 11 Apr 9 23:30 /mnt/images/hello
[root@master ~]#
登陆到 nfs 服务端上查看,是否能访问这个文件,而且内容正确
[root@node1 ~]# ls -l /var/lib/images/hello
-rw-r--r--. 1 nfsnobody nfsnobody 11 4月 9 23:30 /var/lib/images/hello
[root@node1 ~]#
[root@node1 ~]# cat /var/lib/images/hello
hello, nfs
5. 修改 nfsnobody
从上面的例子可以看到我们在 nfs 目录中创建的文件,属主都是 nfsnobody,按道理我客户端和服务端使用的都是 root 用户,id 都是 0,应该都显示为 root 才对。
为什么没有实现我们预想的效果呢?其实这是 nfs 为我们默默开启的保护机制,不保留 root 用户的权限。
如果你想开启呢,也很简单,只要你修改 /etc/exports
的配置成下面这样子就可以
/var/lib/images 192.168.56.0/24(rw,no_root_squash)
然后 exportfs -r
使配置立即生效。
那么我们加的这个配置是什么意思呢?实际上,他总共有三种选项供你选择
- root_squash,当NFS客户端以root用户身份访问时,映射为NFS服务器的nfsnobody用户。
- no_root_squash,当NFS客户端以root身份访问时,映射为NFS服务器的root用户,也就是要为超级用户保留权限。这个选项会留下严重的安全隐患,一般不建议采用。
- all_squash,无论NFS客户端以哪种用户身份访问,均映射为NFS服务器的nfsnobody用户。
其中默认值是root_squash,即当客户端以root用户的身份访问NFS共享时,在服务器端会自动被映射为匿名账号nfsnobody。
更具体的内容请前往 NFS服务的用户身份映射 进行学习。