我正在尝试将源目录从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));
}
请建议解决方案是什么。
由于
答案 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”。