首页 > 编程知识 正文

Linux文件系统与其挂载盘(linux文件系统和挂载点修改)

时间:2023-05-05 08:12:32 阅读:77869 作者:2136

1 .数据结构

本节介绍与挂载文件系统相关的两个主要数据结构: vfsmount和path。

1.1结构虚拟机

挂载在内核目录树中的每个文件系统都与vfsmount结构相对应。 此结构的部分字段将在后面介绍。 必须假设设备/dev/sdc是ntfs文件系统,并且文件系统必须装载在ext3的/home/edsionte/work下。 因此,/home/edsionte/work可以称为ntfs文件系统的挂载点,而ntfs文件系统称为与ext3文件系统形成父子文件系统关系。 ntfs也称为源文件系统,ext3也称为目标文件系统。

struct list_head mnt_hash;

内核在哈希表中组织系统中所有挂载的文件系统,每个vfsmount都位于相应jmdqj值的冲突链表中。 mnt_hash字段是特定冲突链表的元素。

结构列表_ head mnt _ mounts;

如果在当前文件系统下挂载了其他子文件系统,则这些子文件系统通过其vfsmount的mnt_child字段(即父文件系统的mnt_mounts字段)链接到链表

struct list_head mnt_child;

当前文件系统通过此字段与其他父文件系统下的子文件系统构成链表。

struct vfsmount *mnt_parent;

此字段指向父文件系统中的对应vfsmount结构。 这意味着与ext3文件系统对应的vfsmount结构。

结构目录* mnt _ mount point;

此字段表示与源文件系统的挂载点相对应的目录结构。 如果/home/edsionte/work是装载点,则此字段指向目录项work。

结构目录* mnt _ root;

指向当前文件系统的根条目。 对于源文件系统ntfs,根项相对于/,但整个系统目录树的根项是work。

struct super_block *mnt_sb;

每个文件系统都对应于super_block结构,该结构指向与/dev/sdc设备上的文件系统相对应的超级块。

结构列表_ head mnt _ list;

命名空间中的所有文件系统都在mnt_list字段中链接。 链表的标头是命名空间结构中的list字段。

struct mnt_namespace *mnt_ns;

此字段表示与当前vfsmount相对应的命名空间结构。

1.2结构路径

path结构由vfsmount结构和dentry结构构成。 装载文件系统时,此结构表示目标文件系统的vfsmount结构和装载点dentry。

2 .函数调用关系图

3 .实现

3.1 mount系统调用服务例程

mount )系统调用的服务例程如下:

syscall_define5(mount,char_user*,dev_name,char_user*,dir_name,char_user*,type,unname

其内部实现主要是将用户状态的参数依次复制到内核状态,调用内核函数do_mount ()。

3.2 do_mount ()

在此函数内部,首先从kern_path ()中检索目标文件系统的path结构,即挂载点目录条目和目标文件系统的vfsmount结构。 然后,检查flags并按目的分发装载操作。 本节介绍在新挂载点上挂载文件系统(调用do_new_mount () )的最常见方案。

3.3 do_new_mount ()

此函数列出了装载新文件系统的最常见方案,主要包括以下几个方面:

1 .文件系统类型、操作权限检查等:

从do_kern_mount ()获取源文件系统的vfsmount结构

do_add_mount )将源文件系统添加到目标文件系统;

3.4 do_add_mount ()

1.flags参数合法性检验:

2 .检查指定的目标文件系统是否为当前文件系统。 如果是,则失败;

3 .检查源文件系统的根inode是否为链接文件。 如果是,则失败;

使用graft_tree ()在目标文件系统上挂载源文件系统。 其内部graft还包含attach_recursive_mnt (;

3.5 attach_recursive_mnt (

此函数的主要作用是设置父子文件系统的映射关系。 具体操作如下。

在mnt_set_mountpoint ()中将子vfsmount的mnt_parent指定为父vfsmount,将子vfsmount的mnt_mountpoint指定为父文件系统中的挂载点dentry

使用commit_tree ()将子文件系统添加到内核的文件系统jmdqj表中,并将子文件系统添加到父文件系统的相应子文件系统链接表中。

3.6 commit_tree ()

1 .将当前文件系统的命名空间设置为父命名空间,父vfsmount来自当前vfsmount的mnt_parent; 连接到父级的命名空间链表。

2 .将当前vfsmount添加到与jmdqj值相对应的冲突链表中,并使用hash ()计算jmdqj值。 其中,mnt_hash用作链表元素。

3 .将当前vfsmount添加到对应于父vfsmount的子文件系统链接列表mnt_mounts中。 其中,mnt_child用作链表元素。

从整个装载处理流程来看,装载的本质是将源文件系统的vfsmount结构连接到目标文件系统的相应vfsmount结构。 这意味着指向两个vfsmount中字段的指针问题。 两个vfsmount的具体父子关系也对应于内核中目录树的父子关系。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。