概述
NFS 全拼 Network File System, 由 Sun Microsystems 于 1984 年开发,旨在允许不同机器间通过网络共享文件。它是一个基于客户端-服务器架构的分布式文件系统协议,允许多个客户端系统像访问本地存储一样访问远程服务器上的文件。
NFS 使得用户可以通过网络访问远程计算机上的文件,并对文件进行读取、写入、删除等操作,这些操作像本地文件系统一样透明,用户无需关心文件实际存储的位置。
相关概念
NFS 关键概念
- 服务器和客户端:
- 服务器:存储文件并将文件系统通过网络共享给客户端。
- 客户端:通过网络挂载服务器提供的文件系统,并进行文件操作。
- 挂载(Mounting):
- 客户端使用 NFS 挂载(mount)服务器上共享的文件系统。挂载后,远程文件系统可以像本地文件系统一样进行访问。
- RPC(Remote Procedure Call):
- NFS 基于 RPC(远程过程调用)协议进行通信。通过 RPC,客户端发送请求,服务器响应请求并返回相应的数据。
- 文件句柄:
- NFS 使用文件句柄来唯一标识远程文件。客户端在访问文件时,文件句柄将传递给服务器以确定目标文件。
- Stateless(无状态)协议:
- 早期版本的 NFS 是无状态的,这意味着服务器不保存任何有关客户端的信息。每个请求都独立处理,且服务器不跟踪会话状态。
- 无状态的设计提高了系统的容错性,但也限制了某些功能。现代的 NFS 引入了一些状态管理来增强功能。
- 版本:
- NFS 经过多次版本迭代,最常用的版本有 NFSv3 和 NFSv4。
- NFSv3:最广泛使用的版本,支持较大的文件系统,并增加了多种优化。
- NFSv4:引入了状态管理、增强的安全性以及简化了防火墙穿越。
- 文件锁定:
- NFS 支持文件锁定机制,使得客户端可以在多人同时操作同一文件时避免冲突。NFSv4 将锁定功能内置,而 NFSv3 需要外部锁定协议(如 NLM)。
- 安全性:
- 传统的 NFS 依赖于基于 IP 地址的信任机制。现代的 NFSv4 支持通过 Kerberos 进行强身份认证。
- 性能和缓存:
- 为了减少网络通信带来的延迟,NFS 客户端通常使用缓存机制。客户端可以缓存文件的部分内容和属性,并在适当的时候将缓存的数据写回服务器。
部署安装
我们以 centos 为例来进行NFS 的部署和安装:
安装 nfs 服务(服务器端和客户端都需要安装)
1
yum install -y nfs-utils
安装完毕后,我们可以查看下这个包提供的文件信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98/etc/exports.d
/etc/gssproxy/24-nfs-server.conf
/etc/modprobe.d/lockd.conf
/etc/nfs.conf
/etc/nfsmount.conf
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/osd_login
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/usr/lib/systemd/scripts/nfs-utils_env.sh
/usr/lib/systemd/system-generators/nfs-server-generator
/usr/lib/systemd/system-generators/rpc-pipefs-generator
/usr/lib/systemd/system/auth-rpcgss-module.service
/usr/lib/systemd/system/nfs-blkmap.service
/usr/lib/systemd/system/nfs-client.target
/usr/lib/systemd/system/nfs-config.service
/usr/lib/systemd/system/nfs-idmap.service
/usr/lib/systemd/system/nfs-idmapd.service
/usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/nfs-mountd.service
/usr/lib/systemd/system/nfs-secure.service
/usr/lib/systemd/system/nfs-server.service
/usr/lib/systemd/system/nfs-utils.service
/usr/lib/systemd/system/nfs.service
/usr/lib/systemd/system/nfslock.service
/usr/lib/systemd/system/proc-fs-nfsd.mount
/usr/lib/systemd/system/rpc-gssd.service
/usr/lib/systemd/system/rpc-statd-notify.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/rpc_pipefs.target
/usr/lib/systemd/system/rpcgssd.service
/usr/lib/systemd/system/rpcidmapd.service
/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount
/usr/sbin/blkmapd
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsdcltrack
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd
/usr/share/doc/nfs-utils-1.3.0
/usr/share/doc/nfs-utils-1.3.0/ChangeLog
/usr/share/doc/nfs-utils-1.3.0/KNOWNBUGS
/usr/share/doc/nfs-utils-1.3.0/NEW
/usr/share/doc/nfs-utils-1.3.0/README
/usr/share/doc/nfs-utils-1.3.0/THANKS
/usr/share/doc/nfs-utils-1.3.0/TODO
/usr/share/man/man5/exports.5.gz
/usr/share/man/man5/nfs.5.gz
/usr/share/man/man5/nfs.conf.5.gz
/usr/share/man/man5/nfsmount.conf.5.gz
/usr/share/man/man7/nfs.systemd.7.gz
/usr/share/man/man7/nfsd.7.gz
/usr/share/man/man8/blkmapd.8.gz
/usr/share/man/man8/exportfs.8.gz
/usr/share/man/man8/gssd.8.gz
/usr/share/man/man8/idmapd.8.gz
/usr/share/man/man8/mount.nfs.8.gz
/usr/share/man/man8/mountd.8.gz
/usr/share/man/man8/mountstats.8.gz
/usr/share/man/man8/nfsd.8.gz
/usr/share/man/man8/nfsdcltrack.8.gz
/usr/share/man/man8/nfsidmap.8.gz
/usr/share/man/man8/nfsiostat.8.gz
/usr/share/man/man8/nfsstat.8.gz
/usr/share/man/man8/rpc.gssd.8.gz
/usr/share/man/man8/rpc.idmapd.8.gz
/usr/share/man/man8/rpc.mountd.8.gz
/usr/share/man/man8/rpc.nfsd.8.gz
/usr/share/man/man8/rpc.sm-notify.8.gz
/usr/share/man/man8/rpc.statd.8.gz
/usr/share/man/man8/rpcdebug.8.gz
/usr/share/man/man8/showmount.8.gz
/usr/share/man/man8/sm-notify.8.gz
/usr/share/man/man8/statd.8.gz
/usr/share/man/man8/umount.nfs.8.gz
/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab其中包含了一些 nfs 相关的服务,服务的详细介绍如下:
服务名称 功能描述 详细说明 nfs-blkmap.service
支持块映射功能 用于支持在 NFS 文件系统上的块映射,适合复杂的存储需求,普通 NFS 共享中很少使用。 nfs-idmapd.service
提供用户和组的 ID 映射功能 NFSv4 所需,负责将用户名和组名映射为 UID 和 GID,用于身份验证。 nfs-lock.service
提供文件锁定功能 支持 NFSv3 和之前版本的文件锁定,防止多个客户端同时写入导致的数据损坏。 nfs-mountd.service
处理客户端挂载请求 NFSv3 所需的挂载守护进程,用于管理客户端挂载请求并验证权限。 nfs-secure.service
提供安全的 RPC 服务 提供基于 Kerberos 认证的安全 RPC 连接,适合需要身份验证的 NFS 环境。 nfs.service
NFS 客户端和服务器主服务 核心服务,通过 nfs-utils
包提供基本的 NFS 客户端和服务器功能。nfs-config.service
加载和应用 NFS 配置 启动 NFS 服务时自动加载配置文件,确保系统配置是最新的。 nfs-idmap.service
NFSv4 的用户 ID 映射 与 nfs-idmapd
类似,NFSv4 环境中用于将用户和组 ID 映射,以匹配权限。nfs-rquotad.service
远程磁盘配额管理 允许设置和查询 NFS 共享中的磁盘配额,适合需要磁盘配额管理的场景。 nfs-server.service
NFS 服务器主服务 负责处理服务器端的 NFS 共享请求,是 NFS 服务的核心。 nfs-utils.service
管理 NFS 的核心工具包 nfs-utils
提供 NFS 的工具和守护进程,包括nfsd
和rpcbind
。我们这里只模拟下简单的挂载,所以启动 nfs-server 服务并设置开机自启动(服务器端操作)
1
2systemctl start nfs-server
systemctl enable nfs-server配置共享目录 (服务器端操作)
- 创建共享目录,例如目录为/mnt/nfs_share:
1
mkdir /mnt/nfs_share
- 设置权限,允许其他用户访问:
1
chmod -R 777 /mnt/nfs_share
- 编辑 /etc/exports 文件以配置共享路径及其权限。在文件末尾添加以下内容:
1
/mnt/nfs_share *(rw,sync,no_root_squash)
1
2
3
4
5这里的配置选项含义如下:
• * 表示允许所有 IP 访问。如果需要限制特定 IP,可以替换为特定的 IP 地址或子网。
• rw 表示读写权限。
• sync 确保数据同步写入。
• no_root_squash 允许客户端以 root 身份访问。
应用 NFS 配置 (服务器端操作)
1
exportfs -r
应用完成后,可以查看:
1
2[root@node2 mnt]# exportfs -s
/mnt/nfs_share *(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)配置防火墙,确保防火墙允许 NFS 服务的流量通过。可以使用以下命令打开相应的端口(服务器端操作,测试环境可以直接关闭):
1
2
3
4firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload客户端进行挂载
1
2mkdir /mnt/test
mount -t nfs serverip:/mnt/nfs_share /mnt/test挂载完成后,通过 df 查看:
1
2
3
4
5[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 1.1T 257G 787G 25% /
tmpfs 126G 2.3M 126G 1% /tmp
node2:/mnt/nfs_share 1.1T 103G 941G 10% /mnt/test至此,nfs 部署和挂载就完成了
测试
我们可以在客户端的挂载目录上,进行文件读写,比如创建文件,写入以及读取等
1 | [root@node1 ~]# cd /mnt/test/ |
在服务器端的 /mnt/nfs_share目录下可以看到同样的文件信息