NFS
网络文件系统(Network File System)是一种分布式文件系统,通过网络共享远程目录。使用NFS可以在系统上挂载远程目录,并像对待本地文件一样使用远程计算机上的文件。默认情况下,NFS协议未加密,并且与Samba不同,它不提供用户身份验证。客户端的IP地址或主机名限制了对服务器的访问。
NFS在文件传送或信息传送过程中依赖于RPC协议,RPC远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制,NFS本身是没有提供信息传输的协议和功能的。
NFS、RPC介绍
NFS是一个文件系统,负责管理分享的目录;rpc负责文件的传递;nfs启动时至少有rpc.nfsd和rpc.mountd 2个daemon;rpc.nfsd主要是管理客户机登陆nfs服务器时,判断客户机是否能登陆,和客户机ID信息;rpc.mountd主要是管理nfs的文件系统。当客户机顺利登陆nfs服务器时,会去读/etc/exports文件中的配置,然后去对比客户机的权限;
协议使用端口
操作系统信息
[root@nfs-server ~]# cat /etc/os-release
PRETTY_NAME="UOS Server 20"
NAME="UOS Server 20"
VERSION_ID="20"
VERSION="20"
ID=uos
HOME_URL="https://www.chinauos.com/"
BUG_REPORT_URL="https://bbs.chinauos.com/"
VERSION_CODENAME=fuyu
PLATFORM_ID="platform:uel20"
[root@nfs-server ~]# uosinfo
#################################################
Release: UOS Server release 20 (fuyu)
Kernel : 5.10.0-74.uel20.x86_64
Build : UOS Server 20 (1070e) 20240423 amd64
#################################################
nfs-server 部署
安装 nfs
[root@nfs-server ~]# dnf install rpcbind nfs-utils
查看 nfs 版本
[root@nfs-server ~]# rpm -qa | grep nfs-utils
nfs-utils-help-2.5.1-8.up3.uel20.05.x86_64
nfs-utils-idmap-2.5.1-8.up3.uel20.05.x86_64
nfs-utils-2.5.1-8.up3.uel20.05.x86_64
开启 nfs 服务
[root@nfs-server ~]# systemctl start rpcbind.service
[root@nfs-server ~]# systemctl status nfs
查看 nfs 支持的版本信息
[root@nfs-server ~]# cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
创建 nfs 共享目录
mkdir -p /nfs/{public,app}
NFS共享目录配置
vim /etc/exports
/nfs/public 192.168.0.0/255.255.0.0(ro,sync,all_squash)
/nfs/app 192.168.0.0/255.255.0.0(rw,sync,all_squash)
/etc/exports 参数说明
rw:可读写
ro: 只读
no_root_squash:对root用户不压制,如果客户端以root用户写入,在服务端都映射为服务端的root用户
root_squash:默认情况使用的是相反参数root_squash,如果客户端是用户root操作,会被压制成nobody用户
all_squash: 不管客户端的使用nfs的用户是谁,都会压制成nobody用户
insecure: 允许从客户端过来的非授权访问
sync: 数据同步写入到内存和硬盘
async: 数据先写入内存,不直接写入到硬盘
anonuid: 指定uid的值,此uid必须存在于/etc/passwd中
anongid: 指定gid的值
nfs 共享目录
[root@nfs-server nfs]# exportfs -v
/nfs/public 192.168.0.0/255.255.0.0(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,all_squash)
/nfs/app 192.168.0.0/255.255.0.0(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
[root@nfs-server nfs]# exportfs -rv
exporting 192.168.0.0/255.255.0.0:/nfs/app
exporting 192.168.0.0/255.255.0.0:/nfs/public
exportfs 参数
设置文件夹的权限
[root@nfs-server /]# chown -R nobody:nobody /nfs/{public,app}
重启服务
[root@nfs-server /]# systemctl restart rpcbind.service
[root@nfs-server /]# systemctl restart nfs
防火墙配置
[root@nfs-server /]# firewall-cmd --add-service={nfs,mountd,rpc-bind} --permanent
[root@nfs-server /]# firewall-cmd --reload
Linux 客户端
安装nfs客户端
[root@nfs-server ~]# dnf install nfs-utils -y
Ubuntu系统下软件包名称为"nfs-common"
apt install nfs-common -y
重启rpcbind服务
[root@localhost /]# systemctl restart rpcbind.service
showmount 测试
使用showmount命令测试NFS服务器的输出目录状态,showmount命令的基本格式为:
showmount [选项] NFS服务器名称或地址
[root@localhost ~]# showmount -e 192.168.190.82
Export list for 192.168.190.82:
/nfs/app 192.168.0.0/255.255.0.0
/nfs/public 192.168.0.0/255.255.0.0
mount 挂载
mount 服务器名或IP地址:输出目录 本地挂载目录
创建挂载目录
mkdir -p /data/{app,public}
chmod -R 777 /data/{app,public}
挂载目录
读写目录
[root@localhost /]# mount -t nfs 192.168.190.82:/nfs/app /data/app
只读目录
[root@localhost /]# mount -t nfs 192.168.190.82:/nfs/public /data/public
挂载目录写入文件测试
umount 卸载
[root@localhost /]# umount /data/public/
设置开机挂载
编辑/etc/fstab文件
vim /etc/fstab
192.168.190.82:/nfs/app /data/app nfs vers=4,nolock,proto=tcp,_netdev 0 0
检查fstab文件
mount -a
fstab 参数介绍
参数 | 说明 |
---|---|
192.168.190.82:/nfs/app | nfs 共享目录 |
/data/app | 挂载目录 |
nfs | 挂载类型 |
vers=4 | 挂载NFSv4文件系统 |
nolock | 禁用nfs locking,不启用lock,默认选项包括文件锁 |
noacl | 设置是否在挂载时使用NFSACL协议 |
proto=tcp | 在不稳定的复杂网络环境中建议使用tcp参数,在稳定的网络下可以使用udp参数。NFSv3/NFSv4支持tcp/udp,NFSv2只支持udp。 |
rsize=1048576 | 定义数据块的大小,用于客户端与文件系统之间读取数据。建议值:1048576。 |
wsize=1048576 | 定义数据块的大小,用于客户端与文件系统之间写入数据。建议值:1048576。 |
hard | 在文件存储NAS暂时不可用的情况下,使用文件系统上某个文件的本地应用程序时会停止并等待至该文件系统恢复在线状态。建议启用该参数。 |
timeo=600 | 指定时长,单位为0.1秒,即NFS客户端在重试向文件系统发送请求之前等待响应的时间。建议值:600(60秒)。 |
retrans=2 | NFS客户端重试请求的次数。建议值:2。 |
_netdev | 防止客户端在网络就绪之前开始挂载文件系统。 |
noresvport | 在网络重连时使用新的TCP端口,保障在网络发生故障恢复时不会中断连接。建议启用该参数。 |
0 | 非零值表示文件系统应由dump备份。对于NAS,此值为0。 |
0 | 该值表示fsck在启动时检查文件系统的顺序。对于NAS文件系统,此值应为0,表示fsck 不应在启动时运行。 |
Windows 客户端
安装 NFS 客户端
windows mount 帮助
挂载
mount \\192.168.190.82\nfs\app x:
卸载
umount x:
查看nfs目录
NFS 服务器 uid/gid 映射
在集群环境中,每台主机相同用户账号,但是分配的uid/gid是不同的。当多主机后端的存储为同一个共享存储,这时就会遇到一个问题,NFS协议是通过uid来控制文件读写权限的,主机中用户写入的文件uid与其他主机不同,就无法被其他主机读取或修改,出现权限错误的问题。
创建用户
useradd -u 1234 -s /sbin/nologin -M nfsuser
修改用户id和组id
usermod -u 1234 nfsuser
groupmod -g 1234 nfsuser
创建 nfs 共享目录
mkdir /data/nfs
chown -R nfsuser:nfsuser /data/nfs
编辑 nfs 配置文件
[root@nfs-server /]# vi /etc/exports
/data/nfs 192.168.0.0/255.225.0.0(rw,sync,all_squash,anonuid=1234,anongid=1234)