经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++ NFS挂载
来源:cnblogs  作者:Yaronzz  时间:2021/12/31 9:04:21  对本文有异议

挂载NFS

挂载命令

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

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

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

  1. bool Mount()
  2. {
  3. string remotePath = m_remoteIP + ":" + m_remotePath;
  4. string localPath = m_localPath;
  5. string params = "nolock,soft,fg,tcp,timeo=5,retrans=1,rsize=4096,vers=3,addr=" + m_remoteIP;
  6. int ret = mount(remotePath.c_str(),
  7. localPath.c_str(),
  8. "nfs",
  9. MS_SYNCHRONOUS,
  10. params.c_str());
  11. if (ret != 0)
  12. {
  13. auto errInfo = errno;
  14. return false;
  15. }
  16. return true;
  17. }

错误码

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

  1. #define EINVAL 22 /* Invalid argument 挂载参数问题,可能是没加addr*/
  2. #define EACCES 13 /* Permission denied 权限问题*/
  3. #define EPERM 1 /* Operation not permitted 权限问题*/
  4. #define EBUSY 16 /* Device or resource busy 挂载目录正被使用*/
  5. #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进行强制卸载:

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

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

检查是否挂载

检查命令

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

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

    1. Filesystem Size Used Available Use% Mounted on
    2. ubi0:rootfs 54.1M 50.8M 3.3M 94% /
    3. devtmpfs 215.8M 0 215.8M 0% /dev
    4. 192.168.0.249:/nfs 59.6G 1.6G 57.9G 3% /mnt/udisk
  2. 查看挂载信息文件 cat /proc/mounts

    1. ubi0:rootfs / ubifs rw,sync,relatime 0 0
    2. devtmpfs /dev devtmpfs rw,relatime,size=220936k,nr_inodes=55234,mode=755 0 0
    3. 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
  3. 直接使用挂载命令 mount

    1. ubi0:rootfs on / type ubifs (rw,sync,relatime)
    2. devtmpfs on /dev type devtmpfs (rw,relatime,size=220936k,nr_inodes=55234,mode=755)
    3. 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)
  4. 查看指定目录是否挂载点 mountpoint -d /mnt/udisk

    1. #打印文件系统的主设备号和次设备号
    2. 0:21

功能实现

功能需求:

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

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

  1. bool CheckMount()
  2. {
  3. string shell = "mountpoint -d " + m_localPath;
  4. QProcess proc;
  5. proc.start(shell.c_str());
  6. if (!proc.waitForFinished(10000))
  7. return false;
  8. auto output = proc.readAll();
  9. return !output.isEmpty())
  10. }

NFS服务

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

1. 下载地址https://r.hanewin.net/nfs1261.zip

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

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

原文链接:http://www.cnblogs.com/yaronzz/p/15726328.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号