如何在 Linux 上部署 NFS 服务器

作者: 王炳明 分类: Linux 教程 发布时间: 2021-04-07 23:06 热度:1,090

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服务的用户身份映射 进行学习。

文章有帮助,请作者喝杯咖啡?

发表评论