C++|C++ 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 EPERM1 /* Operation not permitted 权限问题*/
#define EBUSY 16 /* Device or resource busy 挂载目录正被使用*/
#define ENOENT2 /* 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。 |
mount
和mount2
,第二个可以加参数,所以一般情况下使用mount2
进行强制卸载:bool UnMount(){return umount2(m_localPath.c_str(), MNT_FORCE) == 0); }
如果
m_localPath
目录没有被挂载,则会返回错误检查是否挂载 检查命令
Linux下使用命令检查nfs是否挂载成功的方式有很多,比如:
检查文件系统的磁盘空间占用情况
df -h
FilesystemSizeUsed Available Use% Mounted onubi0:rootfs54.1M50.8M3.3M94% /devtmpfs215.8M0215.8M0% /dev192.168.0.249:/nfs59.6G1.6G57.9G3% /mnt/udisk
【C++|C++ NFS挂载及挂载命令】查看挂载信息文件
cat /proc/mounts
ubi0:rootfs / ubifs rw,sync,relatime 0 0devtmpfs /dev devtmpfs rw,relatime,size=220936k,nr_inodes=55234,mode=755 0 0192.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. 下载地址:https://r.hanewin.net/nfs1261.zip
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:将全部路径开放给客户端
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- c++基础概念笔记
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- QML基础信息
- C++-类型转换
- MongoDB|MongoDB - 简介
- C++面试题目总结