C++ NFS挂载及挂载命令

 更新时间:2021年12月24日 11:09:57   作者:Yaronzz  
这篇文章主要介绍了C++ NFS挂载,文中给大家提到了挂载NFS时常用的命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

挂载NFS

挂载命令

挂载NFS时,常用的命令比如:

#将远程目录挂载到本地/home/share目录下
mount -t nfs -o nolock 192.168.1.10:/tmp /home/share

在Linux 下可以用mount函数进行挂载:

bool Mount()
{
    string remotePath = m_remoteIP + ":" + m_remotePath;
    string localPath = m_localPath;
    string params = "nolock,soft,fg,tcp,timeo=5,retrans=1,rsize=4096,vers=3,addr=" + m_remoteIP;

    int ret = mount(remotePath.c_str(),
                    localPath.c_str(),
                    "nfs",
                    MS_SYNCHRONOUS,
                    params.c_str());

    if (ret != 0)
    {
        auto errInfo = errno;
        return false;
    }

    return true;
}

错误码

挂载失败时,常见错误码errno有:

#define EINVAL 22 /* Invalid argument 挂载参数问题,可能是没加addr*/

#define EACCES 13 /* Permission denied 权限问题*/

#define EPERM 1 /* Operation not permitted 权限问题*/

#define EBUSY 16 /* Device or resource busy 挂载目录正被使用*/

#define ENOENT 2 /* No such file or directory 挂载目录错误*/

挂载参数

参数 说明
rsize=n 读时最大字节数
wsize=n 写时最大字节数
timeo=n 客户端重传请求前等待时间,默认等待重传时间为60s
retrans=n 客户端返回错误前的重传次数。默认为重传3次。retrans与soft参数一起使用时才有效。
soft/hard 软挂载方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误;
如果使用硬连接方式则客户端一直重新请求直至成功。默认为hard
bg/fg 设置挂载失败后的行为方式。
默认的fg方式将立刻退出返回错误状态,bg方式是退出前将产生一个子进程在后台继续尝试挂载
vers=xxx 设置版本
addr=xxx 设置服务地址
tcp/udp 设置协议,一般使用tcp,网络不稳定可以换udp
port=n 设置服务端口号
lock/nolock 选择是否使用NLM协议在服务器上锁文件。当选择nolock选项时,锁对于同一主机的应用有效,对不同主机不受锁的影响。默认为lock。

卸载

卸载函数有mountmount2,第二个可以加参数,所以一般情况下使用mount2进行强制卸载:

bool UnMount()
{
    return umount2(m_localPath.c_str(), MNT_FORCE) == 0);
}

如果m_localPath目录没有被挂载,则会返回错误

检查是否挂载

检查命令

Linux下使用命令检查nfs是否挂载成功的方式有很多,比如:

检查文件系统的磁盘空间占用情况 df -h

Filesystem                Size      Used Available Use% Mounted on
ubi0:rootfs              54.1M     50.8M      3.3M  94% /
devtmpfs                215.8M         0    215.8M   0% /dev
192.168.0.249:/nfs       59.6G      1.6G     57.9G   3% /mnt/udisk

查看挂载信息文件 cat /proc/mounts

ubi0:rootfs / ubifs rw,sync,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=220936k,nr_inodes=55234,mode=755 0 0
192.168.0.249:/nfs /mnt/udisk nfs rw,sync,relatime,vers=3,rsize=4096,wsize=8192,namlen=255,soft,nolock,proto=tcp,timeo=5,retrans=1,sec=sys,mountaddr=192.168.0.249,mountvers=3,mountproto=tcp,local_lock=all,addr=192.168.0.249 0 0

直接使用挂载命令 mount

ubi0:rootfs on / type ubifs (rw,sync,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=220936k,nr_inodes=55234,mode=755)
192.168.0.249:/nfs on /mnt/udisk type nfs (rw,sync,relatime,vers=3,rsize=4096,wsize=8192,namlen=255,soft,nolock,proto=tcp,timeo=5,retrans=1,sec=sys,mountaddr=192.168.0.249,mountvers=3,mountproto=tcp,local_lock=all,addr=192.168.0.249)

查看指定目录是否挂载点 mountpoint -d /mnt/udisk

#打印文件系统的主设备号和次设备号

0:21

功能实现

功能需求:

  • 检查目录是否挂载成功
  • 当NFS服务关闭时,检查结果也需要同步

经过测试,只有mountpoint 能完成第二点功能需求,所以直接使用shell命令来进行检查:

bool CheckMount()
{
    string shell = "mountpoint -d " + m_localPath;

    QProcess proc;
    proc.start(shell.c_str());
    if (!proc.waitForFinished(10000))
        return false;
    
    auto output = proc.readAll();
    return !output.isEmpty())
}

NFS服务

Linux下的NFS服务安装比较方便,Windows下常见的NFS服务软件可以使用haneWIN NFS Server

1. 下载地址:http://xiazai.jb51.net/202112/yuanma/nfsd_jb51.rar

2. 配置方法:打开目录下的exports文件,配置NFS服务目录,比如共享D盘下的NFSData目录:

D:\NFSData  -name:nfs -exec -maproot:0 -alldirs

  • name:设置挂载的目录名给客户端使用,比如mount -t nfs -o nolock 192.168.1.10:/nfs /home/share
  • maproot:将root权限开放给客户端
  • alldirs:将全部路径开放给客户端

到此这篇关于C++ NFS挂载的文章就介绍到这了,更多相关C++ NFS挂载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中单链表的基本操作(创建、销毁、增删查改等)

    C语言中单链表的基本操作(创建、销毁、增删查改等)

    这篇文章主要介绍了C语言中单链表的基本操作(创建、销毁、增删查改等),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言非递归算法解决快速排序与归并排序产生的栈溢出

    C语言非递归算法解决快速排序与归并排序产生的栈溢出

    上期我们讲完了排序算法下,不知道小伙伴们有没有发现一个问题,快速排序和归并排序我们都是用递归来实现的,可能有小伙伴会问,如果说数据量很多话,栈区空间会不会不够用呢?这期我们就来解决使用递归实现的排序导致栈溢出如何解决
    2022-04-04
  • c++中的const_cast用法大全

    c++中的const_cast用法大全

    const_cast转换符是用来移除变量的const或volatile限定符。对于后者,我不是太清楚,因为它涉及到了多线程的设计,今天重点给大家介绍c++中的const_cast用法大全,需要的朋友参考下吧
    2021-07-07
  • 浅谈关于C++memory_order的理解

    浅谈关于C++memory_order的理解

    这篇文章主要介绍了浅谈关于C++memory_order的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C语言中的数组和指针汇编代码分析实例

    C语言中的数组和指针汇编代码分析实例

    这篇文章主要介绍了C语言中的数组和指针汇编代码分析实例,本文用一则C语言例子来得到对应的汇编代码,并一一注解每句汇编代码的含义,需要的朋友可以参考下
    2015-06-06
  • C++创建窗口程序的实现示例

    C++创建窗口程序的实现示例

    Windows窗体应用程序是C#语言中的一个重要应用,本文主要介绍了C++创建窗口程序的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C++ STL标准库std::vector扩容时进行深复制原因详解

    C++ STL标准库std::vector扩容时进行深复制原因详解

    我们知道,std::vector之所以可以动态扩容,同时还可以保持顺序存储,主要取决于其扩容复制的机制。当容量满时,会重新划分一片更大的内存区域,然后将所有的元素拷贝过去
    2022-08-08
  • Qt编写地图实现海量点位标注

    Qt编写地图实现海量点位标注

    海量点位标注的出现,是为了解决普通设备点超过几百个性能极速降低的问题。本文将介绍如何通过Qt实现海量点位标注功能,感兴趣的可以了解一下
    2022-01-01
  • linux系统中c++写日志文件功能分享

    linux系统中c++写日志文件功能分享

    这篇文章主要介绍了linux系统中c++写日志文件功能,简化了glog,只保留了写日志文件的功能,只是改写了linux版本,需要的朋友可以参考下
    2014-03-03
  • C语言指针应用简单实例

    C语言指针应用简单实例

    这篇文章主要介绍了C语言指针应用简单实例的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论