linux中的NFS挂载系统调用

Posted

技术标签:

【中文标题】linux中的NFS挂载系统调用【英文标题】:NFS mount System Call in linux 【发布时间】:2015-04-05 17:14:19 【问题描述】:

我正在尝试将源目录从 nfs 服务器挂载到具有 linux 的嵌入式板中的目标目录。以下命令在板中的 shell 提示符下完美运行。

mount -t nfs -o nolock 10.126.62.45:/vol/home/avinoba/Sky /mnt

上述命令在程序中使用的等效系统调用是什么? 我尝试了以下调用,但安装失败并显示“无效参数”

if(mount("10.126.62.45:/vol/home/avinoba/Sky","/mnt","nfs",MS_MGC_VAL,"nolock") == -1)

     printf("ERROR: mount failed: %s \n",strerror(errno));

请提出解决方案。

谢谢

【问题讨论】:

您可以使用strace-ed mount 命令来查找它正在执行的确切系统调用 【参考方案1】:

知道关于 NFS 挂载的任何手册页都没有涵盖这一点,我对此感到非常惊讶。深入内核代码,在函数nfs_validate_text_mount_data中,函数nfs_parse_mount_options负责解析在mount中作为第五个参数传递的多个逗号分隔选项strong> 系统调用。

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

if (nfs_parse_mount_options((char *)options, args) == 0)
    return -EINVAL;

if (!nfs_verify_server_address(sap))
    goto out_no_address;

在上面的代码块中,最后一个 if 语句检查 nfs 服务器地址和套接字系列是否定义为有效值。如果它们没有在 nfs_parse_mount_options 中更新,mount 最终会返回无效参数。

如果遍历nfs_parse_mount_options的实现,可以看出,只有Opt_addr这种情况,通过解析更新nfs服务器地址和socket族选项参数。

case Opt_addr:
    string = match_strdup(args);
    if (string == NULL)
        goto out_nomem;
    mnt->nfs_server.addrlen =
        rpc_pton(mnt->net, string, strlen(string),
            (struct sockaddr *)
            &mnt->nfs_server.address,
            sizeof(mnt->nfs_server.address));
    kfree(string);
    if (mnt->nfs_server.addrlen == 0)
        goto out_invalid_address;
    break;

情况Opt_addr对应选项“addr=nfs server ip”。因此,要使系统调用正常工作,定义此选项是必须。据我搜索,这在所有描述 nfs 挂载的手册页中完全缺失。

所以现在考虑问题陈述,请尝试更改为以下代码

if(mount(":/vol/home/avinoba/Sky","/mnt","nfs",0,"nolock,addr=10.126.62.45") == -1)

     printf("ERROR: mount failed: %s \n",strerror(errno));

还要注意,当addr选项放在参数中时,nfs服务器路径前面的ip地址就变成了可选的。然而,':' 是必须的,因为它充当解析 nfs 服务器路径的分隔符。

【讨论】:

这真的很有帮助..它现在按预期工作.. mount(2) 的手册页似乎需要更新,否则有人必须像你一样查看内核源代码做过。谢谢阿比吉特。【参考方案2】:

如果需要,MS_MGC_VAL 应该位于前 16 位,而不是底部。如果您的内核版本 > 2.4,则根本不需要它。

【讨论】:

是的。你是对的。我力求找到任何合适的挂载标志。尝试传递 0,但有帮助。内核版本是 2.6【参考方案3】:

现在通过下面的电话解决了。

if(system("mount -t nfs -o nolock 10.126.62.45:/vol/home/avinoba/Sky /mnt")==-1);

     printf("ERROR: mount failed \n");

但仍在使用 mount() 调用寻找答案,因为它接受 'filesystemtype' 参数作为“nfs”。

【讨论】:

以上是关于linux中的NFS挂载系统调用的主要内容,如果未能解决你的问题,请参考以下文章

linux下配置nfs服务器以及设置自动挂载(以centos6.7为例)

centos配置NFS服务和autofs自动挂载服务

NFS 网络文件系统 简单搭建

NFS服务器搭建与autofs自动挂载

Linux7 挂载 nfs 远程目录

Linux系统之使用autofs自动挂载nfs共享