首页天道酬勤原语和系统调用,mount命令

原语和系统调用,mount命令

张世龙 05-12 21:08 82次浏览

问题背景

最近正在研究runv (当基于KVM的容器符合OCI标准时)。 我们的场景主要是深度学习计算平台,目前在实现分布式培训计算资源的过程中,涉及到了nfs的装载操作。 常规linux mount命令工作正常,但在c系统调用中调用mount ()将失败,错误消息为invalid argument。

过程分析

man 2 mount

SYNOPSIS

#包含

intmount(constchar*source,const char *target,

常数char *文件系统类型,unsigned long mountflags,

常数语音*数据;

描述

mount (attachesthefilesystemspecifiedbysource,whichisoftenadevicename,butcanalsobeadirectorynameoradummy ) tothedirectory

根据说明,第一个参数设置为192.168.1.10:/exportpath,文件系统类型设置为nfs4,结果运行后报告给Invalid argument。 和同学讨论,没有线索,谷歌也没怎么发现。 根据经验,只能用kernel源代码寻找答案。

代码范围的定位方法

首先,必须确定这个问题应该在哪个代码上。 挂载操作与文件系统相关,基本上可以确定是否应该位于内核的文件系统模块中。 fs文件夹包含内核支持支持的所有文件系统,但这次将重点讨论与nfs相关的逻辑,因为它涉及nfs文件系统。

sructfile _ system _ type NFS _ fs _ type={

. owner=THIS_MODULE,

. name='nfs ',

. mount=nfs_fs_mount,

. kill_sb=nfs_kill_super,

. fs _ flags=fs _ rename _ does _ d _ move|fs _ binary _ mountdata,

(; //fs/nfs/super.c

代码分析

mount系统调用最终将移动到此处的nfs_fs_mount。 这里指出重点代码调用堆栈。

NFS _ validate _ text _ mount _ data-NFS _ parse _ mount _ options-NFS _ verify _ server _ address

staticintnfs _ validate _ text _ mount _ data (void * options,

sructnfs _ parsed _ mount _ dat a* args,

常数char * dev _ name )

{

int port=0;

int max_namelen=PAGE_SIZE;

int max_pathlen=NFS_MAXPATHLEN;

struct sockaddr * sap=(struct sockaddr * ) args-nfs_server.address;

分析if (NFS _ parse _ mount _ options ((char * ) options,args )==0)//options

返回电压;

if (! NFS_verify_server_address(sap )//options是否包含addr字段

goto out_no_address;

}

从代码中可以看到,NFS服务器是从选项中解析的。 选项对应于mount系统调用函数中的最后一个参数const void *data。

问题的原因很明显。 const void *data参数不能为NULL或空字符。 至少NFS服务器地址: mount (必须包含“192.168.1.103360 /导出路径”、mountpath和' nfs4'

也可以调用PS : mount (“: /导出路径”、mountpath、' nfs4'、0和' addr=192.168.1.10 ' )。

总结体验

我再次体会到“代码之前没有秘密”。 当然,并不是任何问题都需要深入挖掘代码。 如果谷歌或有人遇到过类似的问题,有了解决办法,就直接拥有主义就好了。 另外,弱吐man文件完全没有提到这个问题。

linux命令速查手册,系统处于mount状态 linux挂载文件系统命令,linux mount命令详解