nfs是unix 和 linux 中常见的网络文件服务,通过 nfs 可以实现集中化的存储管理。
nfs 的配置与一般采用账号密钥式认证的服务不同,因而有不同的配置方式。并且由于系统内核对存储和网络启动顺序的问题,在永久挂载上要采用 autofs 而不是一般的 fstab 设置。
永久链接:http://blog.ryjer.com/posts/a1ba025983.html
1. nfs 服务
nfs 是 Network File System 的简称,翻译为中文就是是 网络文件系统。
从它的名字就可以看出,这是一种 文件系统。应当可以像使用类似ext、xfs、btrfs等文件系统一样使用它,而且其存在于网络上。
其他可以参考维基百科:网络文件系统 - 维基百科
2. nfs 与 rpcbind
一个有意思的事情是,你在配置 nfs 的时候可能没有为 nfs 开放防火墙固定端口,而是开启动态服务端口。这是因为nfs 本身并没有固定端口(虽然nfs想要有默认端口,但很可能已经被其他服务占用了),因此在设计时其会申请随机端口。
那么问题来了,客户端怎么得到 nfs 的随机端口号呢?
答案也很有意思,其借助 rpcbind 服务间接告知客户端nfs服务端口。nfs服务启动时,会向本机的 rpcbind 服务注册 nfs 本次的服务端口号。nfs 客户端在访问nfs 服务时,首先询问 nfs 服务器上的 rpcbind服务:nfs服务的端口是多少?然后rpcbind 告诉nfs客户端对应的nfs服务端口号:nfs 的服务端口号是 xxx。之后,nfs客户端就会去访问被告知的nfs端口,rpcbind不再参与之后的过程。
因此,配置nfs服务首先要安装 rpcbind服务
3. 配置 rpcbind 服务
rocky8 或者 centos8 可以使用以下命令安装 rpcbind,但通常该服务会在系统安装后自动安装,并配置了自动随系统启动
1 | dnf install rpcbind -y |
打开该服务并设置开机启动
1 | systemctl start rpcbind |
然后需要打开 rpcbind 的服务端口。虽然 rpcbind 默认会在 rocky8 中安装启动,但并不会打开防火墙
rpcbind的端口号为 111,建议使用以下方式配置防火墙
1 | firewall-cmd --permanent --add-service=rpc-bind |
4. 配置 nfs 服务
安装nfs软件包
在rocky8 和 centos8中,nfs 服务位于 nfs-utils 软件包中,因此先安装该软件包。
1 | dnf install nfs-utils -y |
打开nfs 服务并设置开机启动。这里需要注意,nfs服务启动时会向 rpcbind 注册端口号,因此需要 rpcbind 先于 nfs 启动
1 | systemctl start nfs-server |
打开 nfs 服务防火墙
1 | firewall-cmd --permanent --add-service=nfs |
还有 mountd
1 | firewall-cmd --permanent --add-service=mountd |
到这里,可以使用如下 rpcinfo 命令差异nfs 服务是否已经注册到了 rpcbind 中
1 | rpcinfo -p localhost | grep nfs |
1 | 100003 3 tcp 2049 nfs |
配置 nfs
安装完毕后,nfs 的配置文件 /etc/exports
会自动创建好。
nfs 与一般的账号密钥式认证不同,其在服务端指定客户ip段,只为特定的目标IP进行服务。客户端无需特殊配置
nfs配置文件格式很简单,每一行配置一个共享目录。每行第一列是共享的目录,第二列及之后列是允许访问的ip和权限。注意ip和权限之间没有空格
1 | # 单客户 ip段 |
括号内权限具体含义如下:
1 | rw 读写 |
首先,创建 nfs 共享目录。(提示:注意共享目录的权限)
1 | mkdir -p /var/nfs/nfs01 /var/nfs/nfs02 |
然后,配置共享目录到配置文件 /etc/exports
内
1 | vim /etc/exports |
使用 exportfs
刷新nfs 服务配置,这样不用重启 nfs 服务即可刷新服务配置,从而保证客户端上 nfs 服务的连续可用
1 | exportfs -arv |
常用选项
1 | -a 全部挂载或者全部卸载 |
测试——本机使用 showmount
查看本机可挂载目录
1 | showmount -e localhost |
如果显示了上面两个配置目录,说明配置成功
6. 配置 nfs 客户端
安装客户端软件包
客户端也需要安装 nfs 套件,通常系统会自带rpcbind并配置开机启动
1 | dnf install nfs-utils rpcbind |
nfs 客户端需要启动rpcbind服务,但不需要 nfs 服务。只需要nfs-utils
套件中的客户端
1 | systemctl start rpcbind |
挂载 nfs 目录到本地
首先,在客户端上使用 showmount
查看 nfs 服务目录(假定 nfs 服务器的IP地址是 192.168.1.100)
1 | showmount -e 192.168.1.100 |
1 | Export list for rocky: |
看来可用挂载了,首先创建挂载目录
1 | mkdir -p /mnt/nfs |
接下来使用 mount 命令临时挂载,我们挂载nfs01
目录到本地 /mnt/nfs
(注意关机重启后该挂载会失效)
1 | mount -t nfs 192.168.1.100:/var/nfs/nfs01 /mnt/nfs |
如果你的ip没有对应目录的使用权限,会报出如下错误
1 | mount.nfs: access denied by server while mounting 192.168.1.100:/var/nfs/nfs01 |
然后使用 df -h
查看系统挂载,应该会多出如下一项(主要看 Filesystem 和 Mounted on)
1 | Filesystem Size Used Avail Use% Mounted on |
这就表明挂载成功可以使用了,但这只是临时挂载。下次开机后这个挂载就消失了,需要重新手动挂载。这对全年运行的linux服务器来说没什么问题,但对其他经常关机的用户来说不是很友好
自带挂载
要想让客户机自带挂载,有几种不同的方案
fstab 方案(不推荐)
通常,linux 或 Unix 主机想要让系统开机挂载外挂硬件时,会在配置文件 /etc/fstab
中添加一个开机挂载项。像上面那么目录、其挂载项如下。fstab 文件的具体配置及含义请查看相关资料
1 | 192.168.1.100:/var/nfs/nfs01 /mnt/nfs nfs defaults 0 1 |
但这对 nfs 会有一个麻烦的文件。fstab 原来是为 本地存储设备设计的,因此在系统启动时会将 fstab 中的存储设备挂载后再启动网络。但是 nfs 是网络文件系统,必须等待内核将 网络模块加载完毕后才能启动。这是相互矛盾的,甚至可能会挂载失败(而且系统不会重试)
autofs 方案(推荐)
autofs 是一个在后台运行的守护进程,如果它检测到用户正在访问一个尚未挂载的文件系统,如果存在,autofs 会自动将其挂载;如果它检测到某个已经挂载的文件系统在一段时间内没有被使用,那么 autofs 会自动将其卸载。也就是说,autofs 会按需自动挂载卸载目录,从而避免上面 开机mount导致的失败问题。
首先,安装 autofs
1 | dnf install autofs |
然后启动 autofs 服务(debian 和 ubuntu会在安装后自动启动并配置开机启动)
1 | systemctl start autofs |
其配置逻辑有点特殊,是一种二级配置。首先是主配置文件 /etc/auto.master
,该配置文件中的一条配置定义一个主挂载目录,该主配置文件下的具体可挂载目录由该记录中指定的另一个配置文件(也就是二级配置文件)决定。
一个二级配置文件中记录 主挂载目录 下的真正的 挂载目录、目录配置和挂载源 ,每条记录对应一个二级子目录
/etc/auto.master
主配置文件内容如下
1 | # |
要是把 nfs 目录挂载到 /mnt/nfs
,主配置文件需要添加如下一条。其下子目录由 /etc/auto.conf/rocky.nfs
配置文件提供
1 | /mnt/nfs /etc/auto.conf/auto.nfs –timeout=60 |
二级配置文件需要我们自己创建,具体放到哪里随意,只要你在 /etc/auto.master
表明具体路径即可。–timeout=60
表示若超过60秒没有访问,自动卸载对应目录。
autofs安装时提供了二级配置文件的模板,对应的模板文件是 /etc/auto.misc
,你可以复制它作为你的配置文件,该模板的内容如下
1 | # |
其中从第9行到第15行即为我们需要的配置,其格式如下。其中挂载源支持设备、ftp、nfs、iSCSI等绝大部分可被挂载的存储
1 | 子目录 配置1,配置2,配置3... 挂载源 |
如果要把上面的 192.168.1.100:/var/nfs/nfs01
以读写权限挂在为 /mnt/nfs
路径下的 test
子目录(即 /mnt/nfs/test),需要添加如下一条配置
1 | test -fstype=nfs,rw 192.168.1.100:/var/nfs/nfs01 |
对用的配置文件如下
1 | # |
然后,重新启动 autofs 服务
1 | systemctl restart autofs |
进入主挂载目录 /mnt/nfs
1 | cd /mnt/nfs |
由于是自动挂载,你必须指定对应的子路径才能激活挂载。在激活之前不会挂载,因而你使用 ls
命令不会得到任何结果
但是可以进入 test
1 | cd /mnt/nfs/test |
这条命令会激活 autofs 挂载 test
子目录 到 /mnt/nfs
下,然后进入对应目录
之后,再在 /mnt/nfs
目录下使用 ls
命令就会显示 test
子目录,因为autofs 刚刚挂载。(注意不要超过 60秒,不然又会卸载)
参考文章
集群搭建——NFS_sinat_40292249的博客-CSDN博客_nfs集群搭建
NFS详细介绍_z609158391的博客-CSDN博客_nfs
linux下NFS服务器的搭建与配置 - 青衫lys - 博客园 (cnblogs.com)
NFS服务器搭建与配置_曹世宏的博客-CSDN博客_nfs配置