mount()系统调用&mount命令

问题背景

最近一直在研究runv(一个符合OCI标准的基于KVM容器运行时)。我们的场景主要是深度学习计算平台,目前在实现一个分布式训练计算资源的过程中,涉及到nfsmount操作。普通的linux mount命令可以正常运行,但是通过c的系统调用mount()则失败,报错信息为invalid argument

分析过程

man 2 mount

SYNOPSIS
#include <sys/mount.h>

   int mount(const char *source, const char *target,
             const char *filesystemtype, unsigned long mountflags,
             const void *data);

DESCRIPTION
mount() attaches the filesystem specified by source (which is often a device name, but can also be a directory name or a dummy) to the directory specified by target.

根据说明,第一个参数我设置为192.168.1.10:/exportpathfilesystemtype设置为nfs4,结果执行的时候,就会报Invalid argument。跟同学讨论,没有头绪,google也没有太多发现。根据经验,只能去kernel源码中寻找答案了。

代码范围定位方法

首先得确定这个问题应该在哪块代码中,mount操作是文件系统相关,基本上可以确定应该在内核的文件系统模块中。fs文件夹中包含了内核支持所支持的所有文件系统,我们这次涉及到的是nfs文件系统,所以重点看nfs相关的逻辑。

struct file_system_type nfs_fs_type = {
    .owner          = THIS_MODULE,
    .name           = "nfs",
    .mount          = nfs_fs_mount,
    .kill_sb        = nfs_kill_super,
    .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
};//fs/nfs/super.c

代码分析

mount系统调用最终会调到这里nfs_fs_mount,下面我重点指出重点代码调用栈。
nfs_validate_text_mount_data -> nfs_parse_mount_options-> nfs_verify_server_address

static int nfs_validate_text_mount_data(void *options,
                                    struct nfs_parsed_mount_data *args,
                                    const char *dev_name)
{
    int port = 0;
    int max_namelen = PAGE_SIZE;
    int max_pathlen = NFS_MAXPATHLEN;
    struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address;

    if (nfs_parse_mount_options((char *)options, args) == 0) //解析options
            return -EINVAL;

    if (!nfs_verify_server_address(sap))//options中是否包含addr字段
            goto out_no_address;
}

从代码中可以看出,nfsserver会从options中解析得到,options对应的就是mount系统调用函数的最后一个参数const void *data

问题的原因就比较明确了:const void *data参数不能为NULL或空字符,至少必须包含nfsserver地址:mount(“192.168.1.10:/exportpath”, mountpath, "nfs4", 0, "addr=192.168.1.10"),如此调用,则没有任何问题了。
ps: mount(“:/exportpath”, mountpath, "nfs4", 0, "addr=192.168.1.10") 这种调用方式也可以。

总结体会

再次深刻体会到“代码面前无秘密”。当然不是说任何问题都需要深入代码,如果google或者有人遇到过类似问题,且有解决方案,直接拿来主义就好。另外弱弱吐槽下man文档,对这个问题压根儿就没有提及到。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,734评论 0 10
  • 29.1 引言 本章中我们要讨论另一个常用的应用程序:NFS(网络文件系统),它为客户程序提供透明的文件访问。NF...
    张芳涛阅读 982评论 0 4
  • 1.Linux下如何用命令查看实时日志(完整命令) tail -f 路径.log查看前多少行 tai-200f 路...
    qianyewhy阅读 2,286评论 0 11
  • 系统环境: centos73.10.0-514.26.2.el7.x86_64 机器数量:五台 硬盘:四块一块为系...
    think_lonely阅读 4,681评论 0 5
  • qemu中uboot用tftp加载内核并用NFS作为根文件系统作者 codercjg 在 20 八月 2015, ...
    codercjg阅读 1,365评论 0 2