nfs服务器

nfs服务器

文章目录

NFS 服务

NFS(Network File System,网络文件系统)是一种实现不同计算机之间文件共享的经典技术。它允许网络中的客户端计算机像访问本地文件一样,透明地访问远程服务器上的文件资源,极大地简化了跨设备的数据共享与管理流程。作为一种成熟的网络文件共享技术,凭借其简洁、高效、跨平台等优势,在各类网络环境中得到了广泛应用。尽管存在一些局限性,但通过版本迭代和与其他技术的结合,NFS 仍然在网络存储领域发挥着重要作用。

核心架构

  • NFS 服务器:负责存储文件资源,并通过 NFS 协议将这些资源共享给授权的客户端。服务器上运行着 NFS 守护进程,用于监听客户端的请求、处理文件访问操作以及维护共享目录的权限控制。

  • NFS 客户端:通过 NFS 协议访问服务器上的共享文件。客户端需要挂载(Mount)服务器的共享目录到本地文件系统,之后就可以像操作本地文件一样对远程文件进行读写、创建、删除等操作。

工作原理

  1. 注册阶段:NFS服务端启动服务时,向RPC服务注册服务端口。
  2. 建立连接阶段:客户端向RPC服务器查询NFS服务器服务端口,然后再向NFS 服务器的服务端口发起挂载请求。
  3. 挂载阶段:服务器验证客户端的身份和权限,如果通过验证,则允许客户端将共享目录挂载到本地指定的挂载点。
  4. 文件访问阶段:挂载成功后,客户端对远程文件的操作(如读取、写入)会通过 RPC 协议转换为对服务器的远程过程调用。服务器接收到请求后,执行相应的文件操作,并将结果返回给客户端。
  5. 权限控制: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
相关推荐
摩尔元数1 小时前
2025,服务器通信MES厂商谁主沉浮?
运维·服务器
翼龙云_cloud1 小时前
阿里云渠道商:自建或RDS怎么迁移到阿里云PolarDB?
运维·服务器·阿里云·云计算
q***92512 小时前
PHP搭建开发环境(Windows系统)
开发语言·windows·php
q***76662 小时前
RustDesk搭建公网中继服务器远控内网机器(完整版)
运维·服务器
WXDcsdn2 小时前
联想台式机更换硬盘(Win10转Win7)后鼠标和键盘无法使用
运维·windows·it运维
讨厌下雨的天空3 小时前
Linux信号
linux·运维·c++
weixin_446260853 小时前
n8n 工作流集合:解锁自动化新体验!
运维·自动化
淼_@淼3 小时前
pytest简介
运维·服务器·pytest
赖small强3 小时前
【Linux C/C++开发】第26章:系统级综合项目理论
linux·c语言·c++