NFS挂载系统调用linux

时间:2015-02-05 18:01:51

标签: embedded-linux mount nfs

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

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

上述命令在程序中使用的等效系统调用是什么? 我尝试了下面的调用但挂载失败了" Invalid Argument"

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));
}

请建议解决方案是什么。

由于

3 个答案:

答案 0 :(得分:11)

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

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服务器地址和套接字系列选项参数。

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服务器路径的分隔符。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

现在通过以下电话解决了我。

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”。