linux 中的 NFS 挂载系统调用
NFS mount System Call in linux
我正在尝试将源目录从 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));
}
请提出解决方案。
谢谢
如果需要,MS_MGC_VAL 应该位于前 16 位,而不是底部。如果你的内核版本 > 2.4,你根本不需要它。
下面的电话帮我解决了。
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"。
我很惊讶地知道关于 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[=的情况34=],通过解析 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 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));
}
Also note that when the addr option is put in the argument, the ip address in front of the nfs server path becomes optional. However the ':' is must,as this acts as the delimiter to parse the nfs server path.
我正在尝试将源目录从 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));
}
请提出解决方案。
谢谢
MS_MGC_VAL 应该位于前 16 位,而不是底部。如果你的内核版本 > 2.4,你根本不需要它。
下面的电话帮我解决了。
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"。
我很惊讶地知道关于 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[=的情况34=],通过解析 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 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));
}
Also note that when the addr option is put in the argument, the ip address in front of the nfs server path becomes optional. However the ':' is must,as this acts as the delimiter to parse the nfs server path.