首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux中的NFS挂载系统调用

linux中的NFS挂载系统调用
EN

Stack Overflow用户
提问于 2015-02-05 18:01:50
回答 3查看 3.5K关注 0票数 6

我正在尝试将源目录从nfs服务器挂载到具有linux的嵌入式板中的目标目录。在板中的shell提示符中,下面的命令工作得非常好。

代码语言:javascript
复制
mount -t nfs -o nolock 10.126.62.45:/vol/home/avinoba/Sky /mnt

对于上述命令,在程序中使用的等效系统调用是什么?我尝试了下面的调用,但是挂载用“无效参数”失败了。

代码语言:javascript
复制
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));
}

请提出解决办法。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-09 14:46:49

我在这里很惊讶,知道关于NFS挂载的任何手册页面都没有涵盖这一点。在函数nfs_validate_text_mount_data,中,函数nfs_parse_mount_options负责解析作为挂载系统调用中的第五个参数传递的多个逗号分隔选项。

代码语言:javascript
复制
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,中没有更新,那么挂载将返回无效的参数。

如果遍历nfs_parse_mount_options的实现,可以看到,只有在Opt_addr的情况下,通过解析options参数来更新nfs服务器地址和套接字家族。

代码语言:javascript
复制
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服务器ip“。因此,要使系统调用正常工作,定义此选项是一个。据我所搜索,这在描述nfs挂载的所有手册页中都完全缺失了。

因此,现在考虑到问题陈述,请更改为下面的代码

代码语言:javascript
复制
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服务器路径的分隔符。

票数 16
EN

Stack Overflow用户

发布于 2015-02-05 18:43:08

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

票数 0
EN

Stack Overflow用户

发布于 2015-02-06 18:17:12

下面的电话帮我解决了。

代码语言:javascript
复制
if(system("mount -t nfs -o nolock 10.126.62.45:/vol/home/avinoba/Sky /mnt")==-1);
{
     printf("ERROR: mount failed \n");
}

但仍在使用挂载() call搜索答案,因为它接受'filesystemtype‘参数作为"nfs“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28350912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档