NFS 简介

网络文件系统 (NFS) 允许服务器通过网络与远程系统共享目录层次结构(文件系统)。
NFS 服务器导出目录,NFS 客户端挂载导出的目录。
然后,服务器目录对客户端系统来说就好像它们是本地目录一样。
NFS 减少了存储需求并提高了数据一致性和可靠性,因为用户正在访问存储在中央服务器上的文件。

RedHat Linux 7 不支持 NFS 版本 2 (NFSv2)。
支持以下两个版本:
NFS 版本 3 (NFSv3)。
NFS 版本 4 (NFSv4)。

NFS 依赖于客户端和服务器之间的远程过程调用 (RPC)。
RPC 服务由 rpcbind 服务控制。
rpcbind 服务取代了 portmap,它在以前的 Linux 版本中用于将 RPC 程序号映射到 IP 地址端口号组合。
rpcbind 响应对 RPC 服务的请求并建立与请求的 RPC 服务的连接。
rpcbind 不与 NFSv4 一起使用,因为服务器侦听众所周知的 TCP 端口 2049.
挂载和锁定协议也已合并到 NFSv4 协议中,所以 NFSv4 也不与 lockd 和 rpc.statd 守护进程交互。

NFS 服务器和 RPC 进程

启动 nfs-server 服务会启动 NFS 服务器以及为共享 NFS 文件系统的请求提供服务所需的其他 RPC 进程。
启动服务时,我们可以使用短名称“nfs”而不是“nfs-server”。
例子:

# systemctl start nfs

这是实现 NFS 服务的用户级部分的 NFS 服务器进程。
主要功能由 nfsd 内核模块处理。
用户空间程序仅指定内核服务器侦听的套接字类型、支持的 NFS 版本以及使用的 nfsd 内核线程数。
使用 ps –e 命令显示正在运行的线程数。

# ps -ef | grep nfs
root      9093     2  0 11:21 ?        00:00:00 [nfsd4_callbacks]
root      9099     2  0 11:21 ?        00:00:00 [nfsd]
root      9100     2  0 11:21 ?        00:00:00 [nfsd]
root      9101     2  0 11:21 ?        00:00:00 [nfsd]
root      9102     2  0 11:21 ?        00:00:00 [nfsd]
root      9103     2  0 11:21 ?        00:00:00 [nfsd]
root      9104     2  0 11:21 ?        00:00:00 [nfsd]
root      9105     2  0 11:21 ?        00:00:00 [nfsd]
root      9106     2  0 11:21 ?        00:00:00 [nfsd]

要运行的 nfsd 线程数在 /proc/fs/nfsd/threads 文件中定义。
在此示例中,指定了 8 个 nfsd 线程:

# cat /proc/fs/nfsd/threads
8

启动 nfs-server 服务也会启动 RPC 进程。
我们可以使用 ps –e 命令来显示 RPC 进程的名称。

# ps -e | grep -i rpc
  177 ?        00:00:00 rpciod
 9080 ?        00:00:00 rpc.statd
 9081 ?        00:00:00 rpc.idmapd
 9082 ?        00:00:00 rpcbind
 9083 ?        00:00:00 rpc.mountd
 9084 ?        00:00:00 rpc.rquotad

rpc.statd 进程

此过程实现网络状态监视器 (NSM) RPC 协议,该协议会在 NFS 服务器重新启动时通知 NFS 客户端,而不会正常关闭。
这不适用于 NFSv4.

rpc.mountd 进程

这是 NFS 挂载守护进程,它实现了来自 NFSv3 客户端的挂载请求的服务器端。
它会检查请求的 NFS 共享当前是否由 NFS 服务器导出,以及是否允许客户端访问它。
对于 NFSv4,仅在 NFS 服务器上需要 rpc.mountd 守护程序来设置导出。

rpc.idmapd 进程

这提供了 NFSv4 客户端和服务器调用,它们映射在线 NFSv4 名称(它们是 user@domain 形式的字符串)和本地 UID 和 GID。
要使 idmapd 与 NFSv4 一起运行,必须配置 /etc/idmapd.conf。
与 NFSv4 一起使用时需要此服务,但当所有主机共享相同的 DNS 域名时不需要。

rpc.rquotad 进程

此过程为远程用户提供用户配额信息。
它由 nfs 服务自动启动,不需要用户配置。
结果由 quota 命令用于显示远程文件系统的用户配额,并由 edquota 命令用于在远程文件系统上设置配额。

lockd 进程

这是一个在客户端和服务器上运行的内核线程。
它实现了网络锁定管理器 (NLM) 协议,该协议允许 NFSv3 客户端锁定服务器上的文件。
每当运行 NFS 服务器和安装 NFS 文件系统时,它都会自动启动。

nfslock 进程

启动此服务会启动 RPC 进程,这些进程允许 NFS 客户端锁定服务器上的文件。

CentOS/RHEL 中 网络文件系统 NFS

在CentOS / RHEL中 启动 NFS 服务

rpcbind 服务必须在启动 nfs 之前启动。
以下命令检查 rpcbind 服务是否已启用并正在运行。

# systemctl status rpcbind

如果 rpcbind 服务正在运行,则可以启动 nfs 服务。
在 /etc/exports 中进行任何配置更改后重新启动 nfs 或者运行 exportfs -a 命令。

# systemctl start nfs

检查 nfslock 服务是否已启用并正在运行。
启动此服务会启动 RPC 进程,这些进程允许 NFS 客户端锁定服务器上的文件。

# systemctl status nfslock

使用 systemctl enable 命令在启动时自动启动服务。
启用 NFS 服务时使用 nfs-server 的全名。

# systemctl enable nfs-server

通过将它们放置在 /etc/sysconfig/nfs 中来指定配置选项和参数。
此文件包含一些注释,可指定选项是参数。
使用 showmount –e 命令显示导出的文件系统:

# showmount –e

CentOS / RHEL上 NFS 客户端配置

要将系统配置为 NFS 客户端,请安装 nfs-utils 包:

# yum install nfs-utils

使用 mount 命令在客户端挂载导出的文件系统(NFS 共享)。
命令的语法是:

# mount -t nfs -o options host:/remote/export /local/directory

以下是对参数的描述:

  • -t nfs :表示文件系统类型为 nfs。使用此选项,如果服务器支持,mount 将使用 NFSv4;否则,它使用 NFSv3.
  • -o 选项:以逗号分隔的挂载选项列表
  • host :/remote/export:导出文件系统的主机名,后跟冒号,后跟NFS共享的绝对路径名
  • /local/directory : 客户端系统上的挂载点

例如,要将主机abc导出的/home目录以只读权限(ro选项)挂载到本地挂载点/abc_home,并通过运行setuid程序(nosuid选项)防止远程用户获得更高权限:

# mount -t nfs -o ro,nosuid abc:/home /abc_home

要在引导时挂载 NFS 共享,请将条目添加到文件系统挂载表 /etc/fstab。
条目采用以下格式:

# vi /etc/fstab
server:/exported-filesystem    local_mount_point   nfs   options   0 0

例如,复制上一页的 mount 命令的 /etc/fstab 条目是:

# vi /etc/fstab
abc:/home    /abc_home    nfs    ro,nosuid    0 0

df 命令显示挂载的文件系统,包括 NFS 挂载的文件系统。
对于 NFS 挂载,“文件系统”列显示 server:/exported-filesystem 信息。
使用 -T 选项包含“类型”列:

# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
host03:/Dev    nfs4      976M  2.5M 907M  1%   /remote_dev

exportfs 实用程序

我们还可以使用 exportfs 从命令行配置 NFS 服务器。
此命令允许 root 用户有选择地导出或者取消导出目录,而无需更改 /etc/exports 且无需重新启动 NFS 服务。
命令的语法是:

# exportfs [options] [client:dir ...]

client 参数是 dir 导出到的客户端系统的名称。
dir 参数是要导出的目录的绝对路径名。
以下是一些选项的列表:

  • -r :重新导出 /etc/exports 中的条目并将 /var/lib/nfs/etab 与 /etc/exports 同步。 /var/lib/nfs/etab 文件是主导出表。当客户端发送 NFS 挂载命令时,rpc.mountd 会读取此文件。
  • -a :导出 /etc/exports 中的条目但不同步 /var/lib/nfs/etab。在进行任何配置更改后运行 exportfs –a。
  • -i :忽略 /etc/exports 中的条目并仅使用命令行参数。
  • -u :取消导出一个或者多个目录。
  • -o :指定 /etc/exports 中指定的客户端选项。
on  It Road.com

CentOS RHEL /etc/exports 示例

在以下示例中,IP 地址为 192.0.2.102 的客户端系统可以挂载具有读/写权限的 /export/directory。
所有对磁盘的写入都是异步的:

/export/directory 192.0.2.102(rw,async)

以下示例将 /exports/apps 目录导出到所有客户端,将所有连接用户转换为本地匿名 nfsnobody 用户,并使目录为只读:

/exports/apps *(all_squash, ro)

以下示例将 /spreadsheets/proj1 目录导出为对 192.168.1.0 子网上的所有客户端具有只读权限,对名为 mgmtpc 的客户端系统具有读/写权限:

/spreadsheets/proj1 192.168.1.0/24(ro) mgmtpc(rw)

CentOS / RHEL NFS 服务器配置

要将系统配置为 NFS 服务器,请安装 nfs-utils 包:

# yum install nfs-utils

NFS 服务器的主要配置文件是 /etc/exports 。
此文件存储远程系统可以挂载的导出目录层次结构列表。
条目格式为:

export-point client1(options) [client2(options) ... ]

导出点是要导出的目录层次结构的绝对路径名。
一个或者多个客户端系统,每个都有特定的选项,可以挂载导出点。
客户端属性和左括号之间没有空格。
未指定客户端选项时,将应用以下默认设置:

  • ro:只读。客户端主机无法更改文件系统上共享的数据。要允许客户端主机对文件系统进行更改,请指定 rw(读/写)选项。
  • sync :NFS 服务器仅在先前请求所做的更改写入磁盘后才回复请求。 async 指定服务器不必等待。
  • wdelay :当 NFS 服务器怀疑另一个写请求即将到来时,它会延迟提交写请求。要禁用延迟,请使用 no_wdelay 选项。仅当还指定了默认同步选项时, no_wdelay 才可用。
  • root_squash :防止远程连接的 root 用户拥有 root 权限,有效地“挤压”远程 root 用户的权力。请求似乎来自用户 nfsnobody、本地系统上的非特权用户或者 anonuid 指定的用户。要禁用根压缩,请指定 no_root_squash 选项。
  • no_all_squash :不改变远程用户的映射。要压缩每个远程用户(包括 root),请使用 all_squash 选项。

要指定 NFS 服务器分配给远程用户的用户 ID (UID) 和组 ID (GID),请使用 anonuid 和 anongid 选项,如下所示:

export-point client(anonuid=uid,anongid=gid)

anonuid 和 anongid 选项允许我们创建一个特殊的用户和组帐户供远程 NFS 用户共享。
默认情况下,NFS 支持访问控制列表 (ACL)。
要禁用此功能,请在导出文件系统时指定 no_acl 选项。

我们可以在客户端名称中使用通配符,例如 (*) 和 (?)。
我们还可以将目录导出到 IP 网络上的所有主机。
为此,请将 IP 地址和网络掩码对指定为地址/网络掩码。
以下任何一种形式都是有效的:

192.168.1.0/24
192.168.1.0/255.255.255.0
日期:2020-09-17 00:12:47 来源:oir作者:oir