nfs服务器
文章目录
NFS 服务
NFS(Network File System,网络文件系统)是一种实现不同计算机之间文件共享的经典技术。它允许网络中的客户端计算机像访问本地文件一样,透明地访问远程服务器上的文件资源,极大地简化了跨设备的数据共享与管理流程。作为一种成熟的网络文件共享技术,凭借其简洁、高效、跨平台等优势,在各类网络环境中得到了广泛应用。尽管存在一些局限性,但通过版本迭代和与其他技术的结合,NFS 仍然在网络存储领域发挥着重要作用。
核心架构
-
NFS 服务器:负责存储文件资源,并通过 NFS 协议将这些资源共享给授权的客户端。服务器上运行着 NFS 守护进程,用于监听客户端的请求、处理文件访问操作以及维护共享目录的权限控制。
-
NFS 客户端:通过 NFS 协议访问服务器上的共享文件。客户端需要挂载(Mount)服务器的共享目录到本地文件系统,之后就可以像操作本地文件一样对远程文件进行读写、创建、删除等操作。
工作原理
- 注册阶段:NFS服务端启动服务时,向RPC服务注册服务端口。
- 建立连接阶段:客户端向RPC服务器查询NFS服务器服务端口,然后再向NFS 服务器的服务端口发起挂载请求。
- 挂载阶段:服务器验证客户端的身份和权限,如果通过验证,则允许客户端将共享目录挂载到本地指定的挂载点。
- 文件访问阶段:挂载成功后,客户端对远程文件的操作(如读取、写入)会通过 RPC 协议转换为对服务器的远程过程调用。服务器接收到请求后,执行相应的文件操作,并将结果返回给客户端。
- 权限控制:NFS 通过文件系统的权限机制(如 UNIX 的用户 ID 和组 ID)来控制客户端对文件的访问。服务器会根据客户端的身份以及共享目录的权限设置,决定是否允许客户端的操作。
优势
-
透明性:客户端访问远程文件的方式与访问本地文件几乎一致,用户无需关注文件的实际存储位置,降低了使用复杂度。
-
跨平台性:NFS 支持多种操作系统,如 UNIX、Linux、macOS 等,能够实现不同操作系统之间的文件共享。
-
高效性:通过优化的数据传输机制和缓存策略,NFS 能够提供较高的文件访问性能,满足多数网络环境下的文件共享需求。
-
易于管理:NFS 的配置相对简单,管理员可以通过修改配置文件轻松设置共享目录、访问权限等,便于集中管理网络中的文件资源。
共享目录
NFS服务器主要配置文件是**/etc/exports**,目录**/etc/exports.d中任何以.exports**结尾且不以点(.)开头的文件也会生效。 所有这些文件都使用相同的语法
server端
bash
[root@server ~ 09:00:12]# yum install -y nfs-utils
[root@server ~ 09:30:17]# mkdir -p /shares/webapp
[root@server ~ 09:32:12]# ll -d /shares/webapp
drwxr-xr-x 2 root root 6 Nov 21 09:32 /shares/webapp
[root@server ~ 09:32:52]# chown demo01 /shares/webapp
[root@server ~ 09:33:11]# ll -d /shares/webapp
drwxr-xr-x 2 demo01 root 6 Nov 21 09:32 /shares/webapp
[root@server ~ 09:33:13]# cat /etc/exports
[root@server ~ 09:34:34]# vim /etc/exports
/shares/webapp 10.1.8.0/24(rw)
[root@server ~ 09:39:06]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: inactive (dead)
[root@server ~ 09:40:02]# systemctl enable nfs-server.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@server ~ 09:40:33]# 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 2025-11-21 09:40:33 CST; 1s ago
Process: 11434 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 11437 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─11437 /sbin/rpcbind -w
Nov 21 09:40:33 server.demo.cloud systemd[1]: Starting RPC bind service...
Nov 21 09:40:33 server.demo.cloud systemd[1]: Started RPC bind service.
[root@server ~ 09:40:34]# ss -lnt4
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 64 *:33932 *:*
LISTEN 0 128 *:57004 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:20048 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 64 *:2049 *:*
[root@server ~ 09:40:48]# ss -lpt4
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 64 *:33932 *:*
LISTEN 0 128 *:57004 *:* users:(("rpc.statd",pid=11432,fd=9))
LISTEN 0 128 *:sunrpc *:* users:(("rpcbind",pid=11437,fd=8))
LISTEN 0 128 *:mountd *:* users:(("rpc.mountd",pid=11445,fd=8))
LISTEN 0 128 *:ssh *:* users:(("sshd",pid=923,fd=3))
LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",pid=1064,fd=13))
LISTEN 0 64 *:nfs *:*
[root@server ~ 09:41:02]# exportfs
/shares/webapp 10.1.8.0/24
[root@server ~ 09:42:50]# exportfs -v
/shares/webapp 10.1.8.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@server ~ 09:43:10]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@server ~ 09:45:17]# echo hello world from nfs > /shares/webapp/index.html
[root@server ~ 09:43:53]# curl http://10.1.8.11
hello world from nfs
[root@server ~ 10:22:56]# vim /etc/exports
/shares/webapp 10.1.8.0/24(rw,no_root_squash)
[root@server ~ 10:24:21]# exportfs -r
/shares/webapp 10.1.8.0/24(rw,no_root_squash)
client端
bash
[root@client ~ 09:58:2]# yum install -y nfs-utils
[root@client ~ 09:58:9]# showmount -e server
[root@client ~ 09:58:20]# yum install -y nginx
[root@client ~ 09:58:29]# mount -t nfs 10.1.8.10:/shares/webapp /usr/share/nginx/html
[root@client ~ 09:58:35]# systemctl enable nginx.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@client ~ 10:00:12]# df /usr/share/nginx/html/
Filesystem 1K-blocks Used Available Use% Mounted on
10.1.8.10:/shares/webapp 52403200 1648256 50754944 4% /usr/share/nginx/html
#在/etc/exports里添加no_root_squash后才可以修改文件
[root@client ~ 10:16:21]# cd /usr/share/nginx/html/
[root@client html 10:21:05]# echo hello world > web1.html
[root@client html 10:24:55]# useradd tom
[root@client html 10:26:05]# su tom
[tom@client html 10:26:09]$ echo hello world > web1.html
bash: web1.html: Permission denied
#持久化挂载在/etc/fstab最后一行添加
#10.1.8.10:/shares/webapp /usr/share/nginx/html nfs defaults 0 0
yum故障分析
bash
[root@client ~ 09:56:35]# cd /etc/yum.repos.d/
[root@client yum.repos.d 09:57:00]# mv old/* .
[root@client yum.repos.d 09:57:08]# mv dvd.repo old
bash
[root@client ~ 09:56:35]# cd /etc/yum.repos.d/
[root@client yum.repos.d 09:57:00]# mv old/* .
[root@client yum.repos.d 09:57:08]# mv dvd.repo old