目录
一.NFS工作原理
1.NFS简介
NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中,从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS企业在企业中的应用场景,在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如产品的图片、附件、头像,然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。
NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高。
2.NFS挂载原理
NFS服务器挂载结构图
如图所示:
NFS服务器设置好了共享目录/home/public,其他有访问NFS服务器权限的客户端就可以将这目录挂载到自己本地的挂载点。A客户端将/home/public挂载到了自己本地的/home/data/mypublic,B客户端将/home/public挂载到了本地的/mnt/nfs上。
查看磁盘信息命令 df -h
3.什么是RPC
- RPC服务类似于NFS服务器端和NFS客户端中间的一个中介
- 因为NFS支持的功能相当多,而不同的功能会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定
- 因为端口不固定,这样一来就会造成NFS客户端与NFS服务器端的通信障碍,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据
- 要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端发出请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输、交互数据目的
4.NFS客户端和NFS服务器建立连接的过程
1.首先服务器启动RPC服务,开启111端口
2. 服务器启动NFS服务,向RPC注册端口信息
3. 客户端启动RPC(portmap服务),向服务端RPC(portmap服务)请求服务端的NFS端口
4. 服务端的RPC(portmap)服务反馈NFS端口信息给客户端
5. 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输
二.NFS安装部署
1.查看系统信息
uname -a 查看系统信息
要养成一个习惯,就是先查看系统版本和内核参数。同一个软件在不同版本,内核之间是有差异的,所以部署的方法也不一样,不要因为这个而造成不必要的错误
2.软件安装
要部署NFS服务,必须安装下面两个软件包:nfs-utils:NFS主程序,rpcbind:PRC主程序
###安装软件
[root@localhost ~]# yum -y install nfs-utils rpcbind
###nfsnobody 账户id为65534
[root@localhost ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
注意:在安装完该软件包后会自动创建nfsnobody用户
3.启动服务
启动NFS服务之前必须先启动RPC服务
3.1启动rpcbind服务
###启动rpcbind服务
[root@localhost ~]# systemctl start rpcbind
###设置开机自启
[root@localhost ~]# systemctl enable rpcbind
###查看服务状态
[root@localhost ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-07-07 02:43:40 EDT; 1min 14s ago
Process: 4671 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 4672 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─4672 /sbin/rpcbind -w
Jul 07 02:43:40 localhost.localdomain systemd[1]: Starting RPC bind service...
Jul 07 02:43:40 localhost.localdomain systemd[1]: Started RPC bind service.
###查看端口
[root@localhost ~]# netstat -lntup | grep rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4672/rpcbind
tcp6 0 0 :::111 :::* LISTEN 4672/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 4672/rpcbind
udp 0 0 0.0.0.0:607 0.0.0.0:* 4672/rpcbind
udp6 0 0 :::111 :::* 4672/rpcbind
udp6 0 0 :::607 :::* 4672/rpcbind
###查看端口映射情况
[root@localhost ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
3.2启动NFS服务
###启动nfs服务
[root@localhost ~]# systemctl start nfs
###设置开机自启
[root@localhost ~]# systemctl enable nfs
###查看服务状态
[root@localhost ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since Fri 2023-07-07 02:49:52 EDT; 5s ago
Process: 5076 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 5049 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 5047 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 5049 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
Jul 07 02:49:52 localhost.localdomain systemd[1]: Starting NFS server and services...
Jul 07 02:49:52 localhost.localdomain systemd[1]: Started NFS server and services.
###查看注册端口信息
[root@localhost ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 10809 status
100024 1 tcp 19282 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 27260 nlockmgr
100021 3 udp 27260 nlockmgr
100021 4 udp 27260 nlockmgr
100021 1 tcp 13722 nlockmgr
100021 3 tcp 13722 nlockmgr
4.配置NFS的配置文件/etc/exports
###编辑配置
[root@localhost ~]# vim /etc/exports
###文件内容
### share /data
/data 10.10.100.0/24(rw,sync)
nfs配置文件的格式:
NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)或者
NFS共享的目录 NFS客户端地址(参1,参2,……)
上述各列参数的含义:
NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
NFS配置参数权限
参数名称 | 参数用途 |
---|---|
rw | 表示可读可写权限 |
ro | 表示只读权限 |
sync | 请求或写入数据时,数据同步写入到NFS Server的硬盘才会返回,优点:数据安全不会丢失;缺点:性能比比启用该参数要差 |
async | 写入数据时会先写入内存缓冲区,直到硬盘有空挡才会写入硬盘,这样可以提升写入效率。风险:若是服务器宕机或不正常关机,会损失缓冲区中为写入硬盘的数据 |
all_squash | 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份 |
anonuid | anonuid就是匿名的uid和gid。说明客户端以什么权限来访问服务端,在默认情况下是nfsnobody,uid65534 |
anongid | 同anonuid一样,就是把uid换成gid |
5.创建共享目录
###创建目录
[root@localhost ~]# mkdir /data
[root@localhost ~]# ll -d /data/
drwxr-xr-x. 2 root root 6 Jul 7 16:14 /data/
6.更改共享目录权限
###修改权限
[root@localhost ~]# chown -R nfsnobody:nfsnobody /data
[root@localhost ~]# ll -d /data/
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Jul 7 16:14 /data/
7.重新加载NFS服务
###重新加载服务
[root@localhost ~]# systemctl restart nfs
8.检查服务器是否能够挂载
###showmount命令显示信息
[root@localhost ~]# showmount -e localhost
Export list for localhost:
/data 10.10.100.0/24
出现上面信息是,说明服务器可以挂载
测试的IP地址为NFS服务器的IP地址
9.NFS客户端配置
9.1 安装客户端软件
###安装软件
[root@localhost ~]# yum -y install nfs-utils rpcbind
安装nfs-utils软件的目的是为了使用showmount等功能,所以客户端最好也装上,但是不启动NFS服务
9.2 启动rpcbind服务
[root@localhost ~]# systemctl start rpcbind
9.3 检查能否访问服务器
[root@localhost ~]# showmount -e 10.10.100.222
Export list for 10.10.100.222:
/data 10.10.100.0/24
10.挂载NFS共享目录
###挂载NFS目录
[root@localhost mnt]# mount 10.10.100.222:/data /mnt
###查看磁盘挂载情况
[root@localhost mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 9.0M 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 22G 29G 44% /
/dev/sda1 1014M 155M 860M 16% /boot
/dev/mapper/centos-home 42G 33M 42G 1% /home
tmpfs 1.6G 0 1.6G 0% /run/user/0
10.10.100.222:/data 44G 8.9G 36G 21% /mnt
11.测试读写数据
客户端创建文件
服务器上查看
12.实现开机挂载
方法1
放入/etc/rc.local中,以实现开机自动挂载
[root@localhost ~]# chmod +x /etc/rc.local
[root@localhost ~]# echo "#mount by tdm" >> /etc/rc.local
[root@localhost ~]# echo "/bin/mount -t nfs 10.10.100.222:/data /mnt" >> /etc/rc.local
方法2
为什么fstab无法实现nfs挂载?
- 开机启动流程所致
- 加载防火墙在前
- 加载网卡
放入fstab中,使用延迟服务
[root@localhost ~]# vim /etc/fstab
[root@localhost ~]# echo " 10.10.100.222:/data /mnt nfs defaults 0 0 " >> /etc/fstab
[root@localhost ~]# systemctl start remote-fs.target
参考:https://www.cnblogs.com/me80/p/7464125.html