系统环境

标题 版本 备注
系统版本 ubuntu 22.04.3 LTS (Jammy Jellyfish) -
内核版本 5.15.0-88-generic #98-Ubuntu SMP Mon Oct 2 15:18:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux -
Server 端 - 10.10.10.203
Client 端 - 10.10.10.204
NFS v4.2 -

NFS 简介

NFSNetwork File System 的缩写,即网络文件系统。它是一种分布式文件系统,允许客户端远程访问和共享服务器上的文件。它是在UNIX和类UNIX操作系统之间共享文件的标准方式之一。NFS最初由Sun Microsystems开发,并成为了许多UNIX和类UNIX操作系统的标准组件

特点

  • C/S架构: NFS采用客户端-服务器架构,其中客户端请求访问远程文件并与服务器通信。服务器则负责管理文件系统和处理客户端请求。
  • 跨平台: NFS 可以让不同操作系统之间的机器共享文件,例如 Linux 可以访问 Windows 上的文件。
  • 透明性: 对于应用程序来说,NFS 是透明的,就像访问本地文件一样。
  • 易用性: NFS 配置简单,使用方便。
  • 高性能: NFS 在局域网中具有较高的性能。
  • 安全性: NFS提供了一些安全功能,例如访问控制列表(Access Control Lists,ACLs)和Kerberos认证,以保护文件免受未经授权的访问。

应用场景

NFS 常见于以下应用场景:

  • 共享文件: 在局域网中共享文件,例如共享打印机、CD-ROM 等。
  • Web 服务器: 将 Web 服务器的根目录挂载到 NFS 共享上,可以方便地更新网站内容。
  • 数据库: 将数据库文件存储在 NFS 共享上,可以提高数据库的性能和可用性。
  • 虚拟机: 将虚拟机镜像文件存储在 NFS 共享上,可以方便地管理虚拟机。

工作机制

NFS 使用 RPC 协议进行通信,RPC 是远程过程调用协议。NFS 可以看作是一个 RPC 服务器,主要功能是管理需要共享的目录和文件。

NFS 的工作机制如下:

  1. 客户端发起一个 RPC 调用,请求服务器打开一个文件。
  2. 服务器收到请求后,打开文件并返回文件句柄给客户端。
  3. 客户端使用文件句柄对文件进行读写操作。
  4. 客户端完成操作后,关闭文件句柄。

配置

NFS 的配置相对简单,只需要在服务器端和客户端进行配置即可。

服务器端配置

  1. 安装 NFS 服务软件。
  2. 创建要共享的目录。
  3. 配置 NFS 共享。

客户端配置

  1. 安装 NFS 客户软件。
  2. 挂载 NFS 共享。

总结

NFS 是一种简单易用的网络文件系统,适用于在局域网中共享文件。NFS 具有跨平台、透明性、易用性、高性能等特点,广泛应用于各种场景。

NFS 安装

NFS 服务端

1.执行 apt 命令在线安装 nfs 服务端包:

1
$ sudo apt install -y nfs-kernel-server

按转完成后,可以执行命令 cat /proc/fs/nfsd/versions 查看目前 nfs 所支持的版本:

1
2
$ sudo cat /proc/fs/nfsd/versions 
-2 +3 +4 +4.1 +4.2

2.创建文件共享目录:

1
$ sudo mkdir -p /data/nfs

3.由于是默认的共享方式,NFS会将客户机上的所有root操作都映射为nobody:nogroup身份,因此,我们需要修改该目录的拥有权,以便匿名身份可以读写该目录:

1
$ sudo chown nobody:nogroup /data/nfs

4.编辑 /etc/exports 文件,配置授权(允许哪些 IP 能访问 nfs)

1
2
3
$ sudo sh -c 'cat << EOF >> /etc/exports
/data/nfs 10.10.10.0/24(rw,sync,no_subtree_check)
EOF'

配置参数说明:

参数 说明 备注
/data/nfs server 端创建的共享目录 -
10.10.10.0/24 允许哪些主机可以访问共享目录 /data/nfs 也可以用 * 替代,表示对所有主机开放共享
rw 表示该目录可读写 -
ro 表示该目录只读 -
sync 表示写操作将同步到磁盘上 -
async 不同步,把内存中数据定期写入磁盘中 -
no_subtree_check 表示不进行子目录检查 -
all_squash 不管使用NFS的用户是谁,他的身份都会被限定成为一个指定的普通用户身份 如果共享目录设置成了匿名用户,则可以不需要配合 anonuid/anongid 参数;否则,必须加上
anonuid/anongid 要和root_squash 或者 all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid
insecure 允许客户机从大于等于1024的端口来访问NFS,如果不写明此选项,有时候客户机mount时会报错access denied -

注意: 每修改一次 /etc/exports 文件 ,都需要执行 exportfs -arv 命令,目的是使修改的内容立即生效,而不用重新加载或启动 nfs 服务:

1
2
$ sudo exportfs -avr
exporting *:/data/nfs

5.执行命令 systemctl restart nfs-kernel-server.service 重启下 nfs 服务(第一次修改 /etc/exports 文件):

1
$ sudo systemctl restart nfs-kernel-server.service

6.查看其启动状态:

1
2
3
4
5
6
7
8
9
10
11
12
$ $ sudo systemctl status nfs-kernel-server.service 
● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor >
Active: active (exited) since Fri 2024-03-15 01:57:11 UTC; 2min 6s ago
Process: 485581 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=1>
Process: 485582 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCE>
Main PID: 485582 (code=exited, status=0/SUCCESS)
CPU: 21ms

Mar 15 01:57:11 vm002-ubuntu2204 systemd[1]: Starting NFS server and services>
Mar 15 01:57:11 vm002-ubuntu2204 exportfs[485581]: exportfs: Failed to stat />
Mar 15 01:57:11 vm002-ubuntu2204 systemd[1]: Finished NFS server and services.

NFS 客户端

手动挂载

1.执行 apt 命令,在线安装客户端包 nfs-common

1
$ sudo apt install -y nfs-common

2.执行 showmount -e SERVER_ip ,查看服务端提供哪些共享目录:

1
2
3
$ sudo showmount -e 10.10.10.203
Export list for 10.10.10.203:
/data/nfs 10.10.10.0/24

3.接下来就可以对服务器提供的共享目录进行挂载了:

1
$ sudo mount -t nfs 10.10.10.203:/data/nfs /data/shared/

4.命令执行成功后,可以执行 df -h 命令进行确认,查看挂载是否成功:

1
2
$ df -h |egrep '/data/shared'
10.10.10.203:/data/nfs 24G 9.4G 13G 42% /data/shared

卸载挂载

如果要卸载挂载目录,则只需要执行 umount /data/shared 即可。偶尔在卸载时会提示设备正处于 busy 状态,则在卸载的同时,加参数 -l 即可!:

1
$ sudo umount /data/shared/    # or sudo umount -l /data/shared

自动挂载

1.如果要想让服务器每次重启后都能自动挂载 NFS 共享,则编辑 /etc/fstab 文件,在底部追加一行配置,如下:

1
2
3
$ sudo sh -c 'cat << EOF >> /etc/fstab
10.10.10.203:/data/nfs /data/shared nfs nolock 0 0
EOF'

如果想手动测试下自动挂载是否能成功,则可以使用命令 mount -a ,前提是你之前没有挂载过共享目录!

测试

1.在客户端端上往挂载目录写入一个文件,如下:

1
$ echo 1111 > /data/shared/1.txt

2.在服务端上确认共享目录下是否有生成的文件,并确认下内容:

1
2
$ cat /data/nfs/1.txt 
1111