[Linux中的NFS挂载系统调用

问题描述 投票:3回答:3

我正在尝试将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));
}

请提出解决方案。

谢谢

embedded-linux mount nfs
3个回答
12
投票

我很惊讶,因为有关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中更新它们,则安装将最终返回无效参数。

如果遍历nfs_parse_mount_options]的实现,可以看到,仅对于Opt_addr情况,通过解析options参数来更新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服务器ip”。因此,为了使系统调用正常工作,定义此选项为must。据我搜索,描述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服务器路径的定界符。

0
投票

MS_MGC_VAL如果需要,应位于前16位,而不是最低。如果您的内核版本> 2.4,则完全不需要。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.