在Linux上挂载NFS共享的初学者指南和示例
在本教程中,我将共享在客户端节点上挂载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是使用具有不同的rsize
,wsize
等的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"指定客户端和服务器之间来回传递的数据块的大小。
如果未指定rsize
和wsize
选项,则默认值会因所使用的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