/etc/fstab
文件,可以实现开机时自动挂载文件系统,确保数据持久化和系统稳定性。深入理解Linux文件系统的挂载过程
背景介绍
在Linux的世界里,一切皆文件,无论是硬盘、鼠标还是网络连接,都可以被视为文件来处理,而文件系统则是管理这些文件的大脑,它负责组织和管理所有的文件,确保我们能够高效地找到它们,仅仅有一个文件系统还不够,我们需要一种方法来打开这扇大门,这就是挂载的概念,挂载,就是告诉操作系统:“嘿,这里有本书(或是一堆书),请把它放在这个位置,让我能够阅读。”我们就一起来探索Linux文件系统的挂载过程吧!
挂载流程总览与流程图
1、用户空间:执行mount
命令。
2、系统调用:通过sys_mount
进入内核。
3、内核处理:查找并匹配file_system_type
,初始化super_block
,生成根inode
。
4、挂载完成:更新状态。
mount 命令与用户空间交互
在用户空间,mount
命令用于将设备或文件系统挂载到一个挂载点,它是与内核进行交互的主要途径,挂载是文件系统操作中至关重要的部分,允许用户访问存储设备中的数据,执行以下命令:
mount /dev/sda1 /mnt
这条命令将设备/dev/sda1
(通常是一个磁盘分区)挂载到/mnt
目录,挂载后,用户就可以通过访问/mnt
来访问该设备上的文件系统内容。mount
工具根据这些参数构建一个挂载请求,包含设备、挂载点、文件系统类型、挂载选项等信息,如果用户没有指定文件系统类型,mount
工具会尝试自动检测文件系统类型,构建好的挂载请求会通过sys_mount
系统调用交给内核进行处理。
进入内核:sys_mount 系统调用
当用户通过mount
命令请求挂载一个文件系统时,该请求会被转换为sys_mount
系统调用,这一节我们将详细介绍sys_mount
如何处理挂载参数和路径解析的过程。
1、处理挂载参数与路径解析:
sys_mount
首先需要将用户空间的参数复制到内核空间。
路径解析是sys_mount
的另一个重要任务,内核需要将传入的路径解析为内核中的 dentry 和 vfsmount 结构,dentry 表示文件系统中的一个目录项,而 vfsmount 表示一个挂载点。
代码示例:
struct path path; err = user_path_at(AT_FDCWD, kernel_dir_name, LOOKUP_FOLLOW, &path); if (err) goto out_free_data; struct dentry *mnt_point = path.dentry; struct vfsmount *mnt = path.mnt;
挂载选项通过 flags 参数传递,常见的挂载选项包括:只读挂载、不允许设置用户ID或组ID、不允许访问设备文件、不允许执行文件等。
2、调用内核挂载核心函数 do_mount:
do_mount
函数用于处理文件系统的挂载过程,它会根据文件系统类型来查找对应的 file_system_type 结构,这个结构包含了文件系统的相关操作函数,包括 mount 回调函数。
代码示例:
fs_type = get_fs_type(fstype); sb = fs_type->mount(fs_type, flags, dev_name, data);
do_mount
的核心步骤之一是根据文件系统类型来查找对应的 file_system_type 结构,每个文件系统类型(如 ext4, xfs 等)都会提供自己的 mount 函数,当do_mount
调用fs_type->mount
时,实际执行的是该文件系统的挂载实现,不同文件系统的 mount 函数会有不同的行为,但大体上都会执行以下操作:创建超级块(superblock)、挂载根目录、初始化其他资源。
超级块(superblock):这是一个描述挂载文件系统的结构,挂载完成后,do_mount
最终会通过返回值传递给用户空间,告诉用户挂载操作是否成功。
file_system_type 与文件系统注册
1、file_system_type 结构体的定义与作用:
在 Linux 内核中,file_system_type 结构体用于表示不同类型的文件系统,可以将它类比为 C++中的类,而具体实现的文件系统(ext2)则是这个类的实例,这意味着每个文件系统都会有一个对应的 file_system_type 实例,该实例包涵了对该文件系统的操作函数集合。
file_system_type 结构体的定义如下:
struct file_system_type { const char *name; // 文件系统名称 int fs_flags; // 文件系统标志位 int (*mount)(struct file_system_type *, int, const char *, void *); // 挂载函数指针 // ...其他函数指针,如读取目录、写入目录等 };
每个具体的文件系统都需要实现这个结构体中的函数指针,以便内核能够正确地调用它们来操作相应的文件系统。
以 EXT4 文件系统为例,其 file_system_type 结构体可能如下所示:
static struct file_system_type ext4_fs_type = { .name = "ext4", .fs_flags = 0, .mount = ext4_mount, // ...其他函数指针赋值给相应的函数 };
在这个例子中,ext4_mount
EXT4 文件系统的挂载函数,当内核需要挂载一个 EXT4 文件系统时,它会调用这个函数来完成实际的挂载工作。
注册文件系统类型是通过register_filesystem
函数来完成的,这个函数接受一个指向 file_system_type 结构体的指针作为参数,并将其添加到内核的文件系统列表中,这样,当用户尝试挂载一个文件系统时,内核就可以遍历这个列表并找到匹配的文件系统类型来执行相应的操作。
注册过程通常发生在模块加载或者系统启动的过程中,一旦文件系统类型被注册成功,它就可以被所有进程共享使用了,这对于支持多种文件系统的操作系统来说是非常重要的功能之一。
AutoFs服务与按需挂载
AutoFs是一种守护进程,只有检测到用户试图访问一个尚未挂载的文件系统时才自动的检测并挂载该文件系统。
1、特点:
AutoFs非常方便,主要有两点:开机不一定要挂载的目录,当用户访问对应文件系统的时候才实现自动挂载,用户不使用自动挂载的目录一段的时间之后,文件系统会被自动卸载(默认时间为5分钟)。
2、安装与配置:
AutoFs属于第三方软件,需要额外安装:
yum install -y autofs
具体使用方法本文不做详细阐述。
Systemd与现代挂载方式
Linux systemd不仅可以用来关闭与开启服务,也提供处理挂载和自动挂载文件系统的新方式,即以一项服务的方式管理文件系统的挂载,Systemd扩展了fstab文件的定义方式,合理使用Systemd提供的挂载选项,可以完美地解决以前使用/etc/fstab时的一些痛点。
1、systemd.mount的优势:
可以让那些要求在网络可用时的文件系统在网络已经可用的情况下才去挂载,还可以定义等待网络可用的超时时间,从而避免在开机过程中长时间卡住。
可以让某个挂载项自动开始挂载和自动卸载,而不是在开机时挂载后永久挂载在后台。
可以让系统跳过失败的挂载,避免系统因硬盘挂载问题而启动失败,无法进入系统(只能进入临时修复系统)。
2、示例:
查看/etc/systemd/system目录即可看到一个名为mnt-volume.mount的文件:
[Unit] Description=Mount DO Volume volume [Mount] What=/dev/disk/by-uuid/d946870c-ef31-48ee-a9f1-446acaa56f46 Where=/mnt/volume Options=defaults,nofail,discard,noatime Type=ext4 [Install] WantedBy=multi-user.target
该文件定义了一个挂载项:
systemctl status mnt-volume.mount systemctl enable mnt-volume.mount systemctl disable mnt-volume.mount systemctl start mnt-volume.mount systemctl stop mnt-volume.mount
3、:
Systemd的文件挂载选项非常丰富,具体情况本文不再赘述。
当前Digitalocean提供的硬盘自动挂载服务正是使用了Systemd的挂载方式,查看/etc/systemd/system目录即可看到一个名为mnt-volume.mount的文件。
以上内容就是解答有关“mount自动挂载_自动挂载文件系统”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1339246.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复