我正在尝试将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));
}
请提出解决方案。
谢谢
我很惊讶,因为有关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服务器地址和套接字系列。 。
对应于选项“ addr = nfs服务器ip”。因此,为了使系统调用正常工作,定义此选项为must。据我搜索,描述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
因此,现在考虑问题陈述,请尝试更改为下面的代码
选项时,nfs服务器路径前面的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
MS_MGC_VAL如果需要,应位于前16位,而不是最低。如果您的内核版本> 2.4,则完全不需要。
现在通过以下电话给我解决了。