在Linux上挂载NFS共享的初学者指南和示例

时间:2020-01-09 10:41:48  来源:igfitidea点击:

在本教程中,我将共享在客户端节点上挂载NFS共享的步骤。

NFS概述

  • 网络文件系统(NFS)是一个分布式文件系统,提供对远程磁盘的透明访问

  • NFS不会在每个系统上复制通用目录(例如/usr/local),而是提供该目录的单个副本,该副本由网络上的所有系统共享。

  • 对于用户而言,NFS意味着他或者她不必登录其他系统即可访问文件。

  • NFS服务器是拥有一个或者多个文件系统并使它们在网络上可用的主机。

  • NFS客户端从一台或者多台服务器挂载文件系统。

准备工作

设置NFS导出服务器

配置NFS服务器未包含在本文的一部分中,因此我假设我们已经启动并正在运行NFS服务器。
在本文中,我们将仅介绍NFS客户端部分,即从服务器在客户端上安装NFS共享。

在这个例子中,我在server1(10.

43.138.1)具有以下配置

[root@server1 ~]# exportfs -v
/ISS           <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

安装NFS客户端

NFS客户端软件包将根据Linux发行版而有所不同。

Ubuntu上安装nfs-common

$sudo apt install -y nfs-common

在" RHEL/CentOS"环境中,安装" nfs-utils"

[root@server2 ~]# yum -y install nfs-utils

手动挂载NFS文件系统

我们可以使用mount命令将NFS文件系统从远程服务器挂载到本地主机。
在客户端节点上挂载NFS文件系统的语法是:

mount [OPTIONS] NFS_SERVER:/PATH/TO/EXPORTED/DIR /MOUNT_POINT_ON_CLIENT

根据我们的配置

  • NFS_SERVER是server1(10.43.138.1)

-/PATH/TO/EXPORTED/DIR是/ISS

-/MOUNT_POINT_ON_CLIENT是/tmp/logs

因此要手动挂载NFS,我们将在客户端上执行以下命令,即server2(10.43.138.2)

我们需要挂载点,所以我将创建挂载点

[root@server2 ~]# mkdir /tmp/logs

接下来从server2的server1挂载NFS文件系统。

[root@server2 ~]# mount -t nfs 10.43.138.1:/ISS /tmp/logs

验证NFS FS是否正确安装

[root@server2 ~]# df -h /tmp/logs
Filesystem        Size  Used Avail Use% Mounted on
10.43.138.1:/ISS  685G  169G  482G  26% /tmp/logs

现在,基于NFS共享的许可,我们可以从server2上的/tmp/logs上的server1上的server1中访问/ISS的数据。

永久挂载NFS文件系统

现在,使用" mount"命令,更改将不再持久,并且不会在重新启动后继续存在。
因此,如果我们希望在每次重新引导后挂载NFS文件系统,则必须将其添加到/etc/fstab或者创建一个systemd单元文件以在重新引导期间更新fstab。

在本文中,我们将使用传统的fstab自动挂载文件系统。
首先确保挂载点存在

[root@server2 ~]# mkdir /tmp/logs

下次使用以下内容更新/etc/fstab

# NFS_SERVER:/PATH/TO/EXPORTED/DIR    /MOUNT_POINT_ON_CLIENT    TYPE_OF_FS   OPTIONS   DUMP	PASS
  10.10.0.10:/backups                 /var/backups              nfs          defaults    0       0

保存并退出文件。

接下来要验证其是否正常运行,首先要卸载NFS文件系统(如果处于装载状态)

[root@server2 ~]# umount /tmp/logs

现在我们将使用fstab挂载/etc/fstab中所有可用的FS。
我们可以安全地执行此命令,并且不会破坏环境中的任何内容

[root@server2 ~]# mount -a

现在,验证NFS文件系统是否已正确安装:

[root@server2 ~]# df -h /tmp/logs
Filesystem        Size  Used Avail Use% Mounted on
10.43.138.1:/ISS  685G  169G  482G  26% /tmp/logs

就是这样,下次客户端重新启动时,只要NFS服务器已启动并正在运行,NFS文件系统就会自动挂载。

挂载NFS文件系统的其他选项

此部分适用于"基于NFS服务器配置"。

例如,在上述情况下,如果我检查使用哪个NFS挂载的选项

[root@server2 ~]# mount | grep logs
10.43.138.1:/ISS on /tmp/logs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.43.138.2,local_lock=none,addr=10.43.138.1)

其中该命令告诉我们NFS是使用具有不同的rsizewsize等的NFSv4挂载的。
因此,在执行挂载时,我们可以选择修改这些值。

挂载NFS文件系统时提供NFS版本

如果NFS服务器允许我们为客户端挂载选择NFS版本,则可以使用-o nfsvers = <ver>,例如,使用NFSv3挂载

[root@server2 ~]# mount -o nfsvers=3 10.43.138.1:/ISS /tmp/logs

同样,如果客户端和服务器支持,则可以提供不同的NFS版本。

设置块大小以优化传输速度

挂载命令选项" rsize"和" wsize"指定客户端和服务器之间来回传递的数据块的大小。
如果未指定rsizewsize选项,则默认值会因所使用的NFS版本而异。

[root@server2 ~]# mount -o rsize=<val>,wsize=<val> 10.43.138.1:/ISS /tmp/logs

从客户端删除NFS挂载

要卸载NFS挂载点,我们可以只使用umount命令,然后是挂载点路径

# umount /MOUNT_POINT

或者,如果我们不知道挂载点,也可以提供" REMOTE_SERVER"和" REMOTE_DIR PATH",即

# umount NFS_SERVER:/PATH/TO/EXPORTED/DIR

因此,在我们的示例中,要卸载我们的NFS文件系统,我们将使用

[root@server2 ~]# umount /tmp/logs

或者

[root@server2 ~]# umount 10.43.138.1:/ISS

接下来,使用" df"或者" mount"命令确保不再挂载NFS FS。

如何修复" umount:设备正忙"

有时我们可能会收到此错误

umount.nfs4: <mount_point>: device is busy

这很可能是因为某些进程正在使用安装了NFS文件系统的mount_point
因此,我们既可以找到并"杀死该进程",也可以"让该进程完成"。

杀死进程

首先要杀死进程,我们应该知道正在占用mount_point的进程。
我们可以使用

# fuser -m /mount_point

这将使用以下格式的mount_point为我们提供进程的PID,在本示例中,我的mount_point/mnt

[root@server2 ~]# fuser -m /mnt
/mnt:                12594

因此,现在我们可以搜索PID为12594的过程

[root@server2 ~]# ps -p 12594
  PID TTY          TIME CMD
12594 pts/0    00:00:00 tail

现在,既然我们知道正在占用NFS挂载点的进程,则可以选择终止它或者让进程完成

我们也可以使用lsof通过文件系统检测进程列表:

# lsof +f -- <mountpoint or device>

懒惰卸载

如果我们选择忽略PID并希望使其完成,我们将如何知道该过程何时完成?

我们将必须不断监控PID以确保它完整,之后才可以卸载NFS文件系统。
为了克服这个问题,我们有一个叫做"懒惰卸载"的东西,我们可以用-l或者--lazy触发umount,例如:

[root@server2 ~]# umount /mnt
umount.nfs4: /mnt: device is busy

默认的umount不起作用,所以让我们尝试延迟卸载

[root@server2 ~]# umount --lazy /mnt

退出状态为成功,因此我们的命令已成功执行:

[root@server2 ~]# echo $?
0

因此,这将立即从文件系统层次结构中分离文件系统,并在不再繁忙时清除对文件系统的所有引用。
" umount -l"的" recommended"用例是为了防止由于无法访问的网络共享而在关机时挂起,而正常的umount会由于服务器或者网络分区关闭而挂起。

[root@server2 ~]# umount --lazy /mnt