NFS配置及远程挂载
NFS简介
NFS 是 Network File System 的简写,即网络文件系统。NFS 最早是由 Sun Microsystems 公司开发,并于 1984 年推出。NFS 是一种可分散式的网络文件系统,可以通过网络(一个局域网)使不同的机器、不同的操作系统,能够共享目录和文件,使客户端能通过网络访问并分享文件到位于服务端的磁盘中。NFS 的客户端(一般为应用服务器,例如 web)可以通过挂载(mount)的方式将 NFS 服务器共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS 服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的 NFS 服务器的目录。
NFS网络文件系统很像 Windows 系统的网络共享、安全功能、网络驱动器映射,这也和 linux 的 samba 服务类似,只不过一般情况下,Windows 网络共享服务或 samba 服务用户办公局域网共享,而互联网中小型网站集群架构后端常用 NFS 进行数据共享,若是大型网站,那么有可能还会用到更复杂的分布式文件系统 Moosefs(mfs)、GlusterFS。NFS 在文件传送或信息传送过程中依赖于 RPC 协议。RPC 负责负责信息的传输。
一、环境和需求
环境:CentOS Linux release 7.9.2009 (Core)
,安装过程中 software selection 选择 Minimal install;
软件版本:nfs-utils-1.3.0-0.54.el7.x86_64
共三台主机,挂载点在 /home/administrator/apps/data
;
- 主机名:NFS server,IP:10.3.63.28
- 主机名:NFS app client,IP:10.3.63.29
- 主机名:NFS nginx client,IP:10.3.60.10
需求:解决多台服务器之间数据盘的内容相互共享
二、服务器校准时间
-
登陆到服务器后,用命令查看当前时区:
[root@localhost ~]# date -R Tue, 27 Sep 2022 10:06:07 +0800
如果显示是
+0800
,就是北京时间; -
更改时区的办法。
如果不是北京时间,则用以下方法修改为北京时区:(如果不是root用户,则加上sudo)
先把时区文件备份,命令执行如下:[root@localhost ~]# mv /etc/localtime /etc/localtime.old
将正确的时区文件链接过来:
[root@localhost ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
如果
ntp
服务并未安装,则先安装后再执行上述命令:[root@localhost ~]# yum install -y ntp
-
开启 ntp 同步命令:
[root@localhost ~]# systemctl enable ntpd [root@localhost ~]# systemctl start ntpd
-
允许同步硬件时间:
在/etc/sysconfig/ntpd
最后一行加SYNC_HWCLOCK=yes
三、服务器的NFS服务端配置
-
检查 nfs 软件是否安装
[root@localhost ~]# sudo rpm -qa | grep nfs-utils [root@localhost ~]# sudo rpm -qa | grep rpcbind
安装 nfs 组件,已安装的跳过;服务端和客户端需要的环境一样
[root@localhost ~]# sudo yum -y install nfs-utils [root@localhost ~]# sudo yum -y install rpcbind
-
修改NFS的配置文件
根据需要修改NFS的配置文件/etc/exports
(默认是空文件)[root@localhost ~]# sudo vim /etc/exports /home/nfs 10.3.63.29(rw,sync,no_root_squash,no_all_squash) 10.3.60.10(rw,sync,no_root_squash,no_all_squash)
-
配置端口
默认设置中nfs
端口是2049
,portmapper
的端口是111
,mountd
端口是20048
,status 和 nlockmgr 是随机端口。如需进行防火墙开放端口的设置,需修改为固定端口,示例如下,否则跳过:
修改/etc/sysconfig/nfs
文件[root@localhost ~]# sudo vim /etc/sysconfig/nfs # 增加端口配置如下一行,对应 rpc.statd 服务,显示 status STATD_PORT=2048
因
nfslock
服务会自动开启rpc.statd
,无需做设置;在rpcinfo -p
映射中,rpc.statd
对应status
,后续再次修改端口后重启服务使配置生效的[root@localhost ~]# sudo systemctl restart nfs-lock
修改
/etc/modprobe.d/lockd.conf
文件。Network Lock Manager (NLM)
,对应是nlockmgr
[root@localhost ~]# sudo vim /etc/modprobe.d/lockd.conf # 增加端口配置如下两行 options lockd nlm_tcpport=2050 options lockd nlm_udpport=2050
-
开启 NFS 服务,设置服务开机自启动,按顺序先
rpcbind
后nfs
[root@localhost ~]# sudo systemctl start rpcbind.service [root@localhost ~]# sudo systemctl start nfs.service [root@localhost ~]# sudo systemctl enable rpcbind.service [root@localhost ~]# sudo systemctl enable nfs.service
或
[root@localhost ~]# sudo systemctl start rpcbind nfs-server [root@localhost ~]# sudo systemctl enable rpcbind nfs-server
查看共享是否成功
[root@localhost ~]# showmount -e localhost
或用
exportfs -arv
命令,重新使配置文件生效,并显示生效内容[root@localhost ~]# sudo exportfs -arv
查看服务对应端口的命令
[root@localhost ~]# rpcinfo -p
-
防火墙设置
查看防火墙是否在运行[root@localhost ~]# sudo firewall-cmd --state
显示 running 则加上放行规则,否则跳过
[root@localhost ~]# sudo firewall-cmd --permanent --add-port=111/tcp [root@localhost ~]# sudo firewall-cmd --permanent --add-port=111/udp [root@localhost ~]# sudo firewall-cmd --permanent --add-port=2048-2050/tcp [root@localhost ~]# sudo firewall-cmd --permanent --add-port=2048-2050/udp [root@localhost ~]# sudo firewall-cmd --permanent --add-port=20048/tcp [root@localhost ~]# sudo firewall-cmd --permanent --add-port=20048/udp [root@localhost ~]# sudo firewall-cmd --add-service={rpc-bind,mountd,nfs,nlockmgr,portmapper} --permanent [root@localhost ~]# sudo firewall-cmd --reload
四、服务器的 NFS 客户端配置
-
创建挂载目录
[root@localhost ~]# sudo mkdir -p /data/nfs/28
-
客户端远程目录的挂载,将挂载配置写入
/etc/fstab
文件[root@localhost ~]# sudo vim /etc/fstab 10.3.63.28:/data/nfs /data/nfs/28 nfs defaults 0 0
-
在客户端分别执行,让修改
/etc/fstab
后的挂载生效sudo mount -a
五、其他补充说明(安装过程或完成后检测用到的命令、知识点)
-
查 NFS 服务是否在运行
[root@localhost ~]# sudo systemctl status rpcbind [root@localhost ~]# sudo systemctl status nfs
-
查看 NFS 版本
服务器端使用:nfsstat -s
客户端使用:nfsstat -c
-
NFS 的常用目录
文件目录 | 用途 |
---|---|
/etc/exports | NFS服务的主要配置文件,系统并没有默认值,是空文件,如这个文件不存在,需要自己创建 |
/usr/sbin/exportfs | NFS服务的管理命令 |
/usr/sbin/showmount | 客户端的查看命令 |
/var/lib/nfs/etab | 记录NFS分享出来的目录的完整权限设定值,即服务器配置的参数(包含默认的参数) |
/var/lib/nfs/xtab | 记录曾经登录过的客户端信息 |
NFS的配置文件:
/etc/exports
:NFS配置文件/var/lib/nfs/*tab
:NFS 服务器日志放置路径;- etab 记录共享出来的目录完整权限设置值;
- xtab 记录曾经连接到此 NFS 主机的相关客户端数据
NFS 的两个命令:
/usr/sbin/exportfs
:维护 NFS 共享资源;重新共享 /etc/exports 变更目录或将 NFS server 共享目录卸载或重新共享/usr/sbin/showmount
:在客户端查看 NFS 服务器共享出来的目录资源
- NFS 的主要配置文件
/etc/exports
的内容格式
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
a. 输出目录:
输出目录是指NFS系统中需要共享给客户机使用的目录;
b. 客户端:
客户端是指网络中可以访问这个NFS输出目录的计算机
客户端常用的指定方式
指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主机:nfs.erbantou.com
指定域中的所有主机:*.erbantou.com
所有主机:*
c. 选项:
选项用来设置输出目录的访问权限、用户映射等。
NFS主要有3类选项:
访问权限选项
设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与all_squash取反(默认设置);
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash:与rootsquash取反;
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
例如
/ user01(rw) user02(rw,no_root_squash)
表示共享服务器上的根目录(/)只有 user01 和 user02 两台主机可以访问,且有读写权限;
- user01 主机用 root 用户身份访问时,将客户机的 root 用户映射成服务器上的匿名用户(root_squash,该参数为缺省参数),相当于在服务器使用nobody用户访问目录;
- user02 主机用 root 用户身份访问该共享目录时,不映射 root 用户(no_root_squash),即相当于在服务器上用root身份访问该目录。在配置文件中,使用了 no_root_squash ,所以 root 用户不受约束,在 user02 机器上到挂载点下,到共享目录下,就可以像在本地磁盘使用 root 用户一样,是不受限制的(通常情况下,不限制 root 用户的比较多,要注意安全问题)
/root/share/ 192.168.1.2(rw,insecure,sync,all_squash)
表示共享服务器上的 /root/share/
目录只有 192.168.1.2
主机可以访问,且有读写权限;此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用 nobody 用户访问该目录(若客户机要在该共享目录上保存文件(即写操作),则服务器上的 nobody 用户对该目录必须有写的权限)
/home/ivan/ *.erbantou.com (rw,insecure,sync,all_squash)
表示共享 /home/ivan/
目录,*.erbantou.com
域中所有的主机都可以访问该目录,且有读写权限
/home/share/ .erbantou.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4)
表示共享目录 /home/share/
,*.erbantou.com
域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的 uid 为 zh3、gid 为 wa4 的用户
exportfs
命令详解-
exportfs 命令和 nfs-utils 这个包一起安装的
-
例子:
- 假设在第一次配置 NFS 的共享目录,之后需要新增、更改某些机器或共享的目录;
- 首先需要更改配置文件,然后重启 NFS 服务,但如果远程客户端正在使用 NFS 服务,正在挂载着,如果你需要先停止 NFS 服务,那远程的客户端就会挂起,就会很大的影响,造成服务异常,进程异常,有很大可能导致系统坏掉
-
NFS 服务不能随便重启,要重启,就需要先去服务器上,把挂载的目录卸载下来
- 在卸载目录的时候,若是在当前目录下去卸载会提示 umount.nfs4: /mnt: device is busy
- 方法一:退出该目录后,再去卸载
- 方法二:在目录下卸载的时候,加 -l 选项,表示 lazy 懒惰的意思
- 在卸载目录后,在重启 NFS 服务
- 在卸载目录的时候,若是在当前目录下去卸载会提示 umount.nfs4: /mnt: device is busy
-
若是挂载了很多台机器,那么每台机器都需要去卸载,就会很麻烦,降低了工作效率
- 方法:使用
exportfs
命令,重新加载下
- 方法:使用
-
exportfs
命令-a
全部挂载或者全部卸载,全部挂载或卸载/etc/exports
中的内容-r
重新挂载,重新读取/etc/exports
中的信息 ,并同步更新/etc/exports
、/var/lib/nfs/xtab
-u
卸载某一个目录,和-a
一起使用,是卸载所有/etc/exports
文件中的目录-v
显示共享目录,在export
的时候,将详细的信息输出到屏幕上。
-
例一、在 NFS 服务端上修改 /etc/exports
,增加某个共享目录后
/share 192.168.10.0/24(rw,sync,root_squash)
用 exportfs 不用重启 NFS 服务,使改动立刻生效
sudo exportfs -arv
其他例子
exportfs -au #卸载所有共享目录
exportfs -rv #重新共享所有目录并输出详细信息
showmount
命令用于查询 NFS 服务器
Usage: showmount [-adehv]
[--all] [--directories] [--exports]
[--no-headers] [--help] [--version] [host]
-a或--all
以 host:dir 这样的格式来显示客户主机名和挂载点目录。
-d或--directories
仅显示被客户挂载的目录名。
-e或--exports
显示NFS服务器的输出清单。
-h或--help
显示帮助信息。
-v或--version
显示版本信息。
--no-headers
禁止输出描述头部信息。
显示NFS客户端信息
# showmount
显示指定NFS服务器连接NFS客户端的信息
# showmount 10.3.63.28 #此ip为nfs服务器的
显示输出目录列表
# showmount -e
显示指定NFS服务器输出目录列表(也称为共享目录列表)
# showmount -e 10.3.63.28
显示被挂载的共享目录
# showmount -d
显示客户端信息和共享目录
# showmount -a
显示指定NFS服务器的客户端信息和共享目录
# showmount -a 10.3.63.28
- 关于权限的分析
1. 客户端连接时候,对普通用户的检查
a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;
b. 如果 NFS server 上面有同名用户,那么此时客户端登录账户的身份转换为 NFS server 上面的同名用户;
c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成 nfsnobody;
2. 客户端连接的时候,对 root 的检查
a. 如果设置 no_root_squash,那么此时 root 用户的身份被压缩为 NFS server上面的 root;
b. 如果设置了 all_squash、anonuid、anongid,此时 root 身份被压缩为指定用户;
c. 如果没有明确指定,此时 root 用户被压缩为 nfsnobody;
d. 如果同时指定 no_root_squash 与 all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid 将被压缩到所指定的用户与组;
多个 NFS 客户端访问服务器的读写文件时必须要有的权限
a、NFS 服务器 /etc/exports 设置需要开放可写入的权限,即服务端的共享权限
b、NFS 服务器实际要共享的 NFS 目录权限具有可写入 w
的权限,即服务端本地目录的安全权限
c、每台服务器都对应存在和 NFS 默认配置 UID 的相同 UID 的账户 nfsnodoby(确保所有所有客户端的访问权限统一,否则每台机器都需要同时建立相同 UID 用户,并覆盖 NFS 的默认用户配置)
只有满足上述三个条件,多个 NFS 客户端才能具有查看、修改、删除其他任意 NFS 客户端上传文件的权限,这在大规模的集群环境中最为集群共享存储时尤为重要
- 客户端手动挂载
挂载命令 | 挂载的格式类型 | NFS服务器提供的共享目录 | NFS客户端的挂载点 |
---|---|---|---|
mount | -t nfs | 10.3.63.28:/data | /mnt (该目录必须存在) |
创建挂载点
sudo mkdir /data/nfs
挂载 NFS,默认情况下只有 root 可以去挂载,普通用户可以执行 sudo
sudo mount -t nfs 10.3.63.28:/data/nfs /data/nfs/28
挂载成功后,可用如下命令查看
sudo df -Th
如需卸载 NFS,命令如下
sudo umount /data/nfs
或
sudo umount 10.3.63.28:/data/nfs
评论区