mount过程分析之二——mount系统调用

本文深入探讨Linux中的mount系统调用,包括其在挂载文件系统过程中的作用,flags和data参数的解析,以及mount的实现结构如struct mount和struct vfsmount。通过实例展示了如何使用mount命令并分析了strace输出,揭示了mount操作的内部工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

= 引文 =

上文中我们说到了file_system_type,以及一个文件系统是如何在内核中注册产生的。但是注册了一个文件系统并不代表这个文件系统被使用了,就像你注册了优快云帐号但是你不登陆就没有使用它。同理,你不挂载文件系统,这个文件系统在内核中就以一个file_system_type的形式存在,仅仅是存在这么一个type,并没有构建到全局文件系统树中。

回忆一下,注册file_system_type的时候我们主要提供两个成员给内核,一个是文件系统的名字,一个是mount这个文件系统的方法(其它参数也很重要,但重点就是这两个)。名字就是一个id,唯一标记一个文件系统,并方便内核在需要时根据它找到这个文件系统的file_system_type。mount方法在挂载这个文件系统时使用的,在需要挂载一个文件系统时通过name找到这个文件系统的file_system_type实例,然后使用这个实例中挂载的方法(mount函数),进行挂载。

当一个文件系统被挂载之后,一个文件系统实例就诞生并可以使用了。


= 使用mount系统调用 =

== 初探 ==

试想一下,我们如何挂载一个文件系统?常见的可能如下:

mount -t xfs /dev/sda1 /mnt -o ....

这应该是一个典型的mount命令的使用,其中包含了执行时几个重要参数——fstype, devname, mountpoint, options。我们经常使用,甚至可以说99%的人平时都是这样使用的,但是为了研究mount系统调用我们就应该研究mount系统调用函数,而不是mount命令,来看它的定义(man 2 mount):

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

从定义上看和mount命令需要的参数也差不多, source是要挂载的设备名,target是要挂载到哪,filesystemtype顾名思义就是文件系统类型名,以上都是字符串类型的参数,都可以直接写路径名或fsname。使用上述三个参数就一个可以完成一次简单的挂载操作。比如我们准备了一个/dev/sdc1的设备,和一个/mnt/testdir挂载点:

mkfs.xfs -f /dev/sdc1

mkdir /mnt/testdir

然后遍写mount_test_01.c程序:

#include <sys/mount.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
        if (mount("/dev/sdc1", "/mnt/testdir", "xfs", 0, NULL)) {
                perror("mount failed");
        }
        return 0;
}

编译:

gcc -Wall -o mount_test_01 mount_test_01.c

执行:

./mount_test_01

如果没有返回错误,那么/dev/sdc1应该就应该挂载好了。来看一下挂载的结果:

findmnt /dev/sdc1

就能看到

TARGET       SOURCE    FSTYPE OPTIONS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值