首页 > 网站搭建 > 技术分享内容详情

Linux系统文件系统知识点汇总 2025-02-11 浏览量: 来源:网络

通用文件模型

通常一个完整的 Linux 系统由数千到数百万个文件组成,文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组


ReiserFS(新型的文件系统)–>Reiser4

它通过一种与众不同的方式—完全平衡树结构来容纳数据,包括文件数据、文件名、日志支持。它还可以支持少量磁盘和磁盘阵列,并能在上面继续保持很快的搜索速度和很高的效率。

特点:先进的日志机制。日志机制保证了在每个实际数据修改之前,相应的日志已经写入硬盘,文件与数据的安全性有了很大提高。高效的磁盘空间利用、独特的搜寻方式、支持海量磁盘、优异的性能、搜寻方式、空间分配和利用情况。

Ext4–>Linux系统下的日志式文件系统,Ext3应用广泛

更大的文件系统和更大的文件( Ext3 文件系统最多只能支持 32TB 文件系统和 2TB 文件,实际要比容量少很多,文件系统 2TB 和 16GB 文件。Ext4 文件系统容量达到 1EB,文件容量则达到 16TB。);更多的子目录数量;更多的块和 i-节点数(Ext3 文件系统使用 32 位空间,Ext4 文件系统扩充到 64 位);多块分配;持久性预分配;延迟分配;盘区结构;新的i节点结构;日志检验功能;在线碎片整理。

XFS–>高性能的日志文件系统:XFS极具伸缩性、非常健壮

数据完全性、可扩展性(最大支持文件大小为 9exabytes,最大文件系统尺寸为 18exabytes)、传输特性、传输带宽(单个文件系统测试,吞吐量最高达7GB每秒,对意念文件读写操作吞吐量可达4GB每秒)内核支持40多种文件系统,MS-DOS的 FAT 文件系统,UFS(berkeley UNIX)、网络文件系统(coda 和 NFS)和虚拟文件系统(如 proc)

文件系统类型一般可以分为3种:

(1)基于磁盘的文件系统( Disk-based Filesystem);

(2)虚拟文件系统( Virtual Filesystem);

(3)网络文件系统( Network Filesystem);


Linux 内核文件系统最重要的数据结构为inode,一个inode就代表一个文件,inode结构体保存文件的大小,文件的块大小、创建时间等各种参数。一个文件(和目录)的inode只有唯一一个。


linux 系统中有种文件是链接文件,可以为解决文件的共享使用。

链接分为两种:一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。

硬连接】相当于给一个文件取了多个名称,多个文件名称对应同一个索引节点,索引节点的成员i_nlink是硬链接计数。

软链接】这种文件的数据是另一个文件的路径,软链接可对文件或目录创建。软连接是一个独立的文件所以有独立的 inode

VFS结构

在VFS接口实现当中,涉及大量的数据结构。VFS结构由两个部分组成:文件和文件系统,这些都需要管理和抽象。

inode是 Linux 内核选择用于表示文件内容和相关元数据的方法。

在抽象对底层文件系统的访问时,并未使用固定的函数,而是使用了函数指针。这函数指针保存在两个结构中,包括了所有相关的函数。

(1) inode操作:创建链接、文件重命名、在目录中生成新文件、删除文件。

(2) 文件操作:作用于文件的数据内容。它们包含一些显然的操作(如读和写),还包括如设置文件位置指针和创建内存映射之类的操作。

文件系统和超级块信息

VFS支持的文件系统类型通过一种特殊的内核对象连接进来,该对象提供了一种读取超级块的方法。除了文件系统的关键信息(块长度、最大文件长度,等等)之外,超级块还包含了读、写、操作inode的函数指针。

内核还建立了一个链表,包含所有活动文件系统的超级块实例。之所以使用活动(active)这个术语替代已装载(mounted),是因为在某些环境中,有可能使用一个超级块对应几个装载点。

打开的文件总是分配到系统中一个特定的进程,内核必须在数据结构中存储文件和进程之间的关联。

各个文件系统实现也能在 VFS inode 中存储自身的数据(不通过VFS层操作)。尽管每个文件系统在file_system_type中只出现一次,但所有超级块实例的链表中,可能有几个同一文件系统类型的超级块实例,因为在各个块设备/分区上可能存储了同一类型的几个文件系统。

Linux 将磁盘块分为三个部分:

1)超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。

2)i-节点表,超级块的下一个部分就是i-节点表,每个文件都有一些属性,如文件的大小、文件所有者、和创建时间等,这些性质被记录在一个称为 i-节点 的结构中。所有 i-节点 都有相同的大小,并且 i-节点表 是这些结构的一个列表,文件系统中每个文件在该表中都有一个i-节点

3)数据区,文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独立的磁盘块中。

VFS 的inode结构

inode 操作:

内核提供了大量函数,对inode进行操作。为此定义了一个函数指针的集合,以抽象这些操作,因为实际数据是通过具体文件系统的实现操作的。调用接口总是保持不变,但实际工作是由特定于实现的函数完成的。


inode 结构有两个指针(i_op和i_fop),指向实现上述抽象的数组。inode 结构和 file 结构包括一个指向file_operations结构的指针。file_operations用于操作文件中包含数据,inode_operations负责管理结构性的操作(删除一个文件)和文件相关的元数据(属性等)。

文件操作:


目录项缓存

由于块设备速度较慢,可能需要很长时间才能找到与一个文件名关联的inode。即使设备数据已经在页缓存。Linux使用 目录项缓存(简称dentry 缓存) 来快速访问此前的查找操作的结果。该缓存围绕着struct dentry建立。

在 VFS 连同文件系统实现读取的一个目录项(目录或文件) 的数据之后,则创建一个 dentry 实例,以缓存找到的数据。


dentry结构不仅使得易于处理文件系统,对提高系统性能也很关键。dentry对象在内存中的组织,涉及下面两个部分。

(1) 一个散列表(dentry_hashtable)包含了所有的dentry对象。

(2) 一个LRU(最近最少使用,least recently used)链表,其中不再使用的对象将授予一个最后宽限期,宽限期过后才从内存移除。

dentry 操作

dentry_operations结构保存了一些指向各种特定于文件系统可以对dentry对象执行的操作的函数指针。该结构定义如下:


处理VFS对象

注册文件系统:在文件系统注册到内核时,文件系统是编译为模块,或者持久编译到内核中。

fs/super.c中的register_filesystem用来向内核注册文件系统。我们可以通过/proc/filesystems查看系统所有的文件系统类型。

一个文件系统不能注册两次,否则,将描述新文件系统的对象置于链表末尾,这样就完成向内核的注册。

    static struct file_system_type ext4_fs_type = {  .owner    = THIS_MODULE,  .name    = "ext4",  .mount    = ext4_mount,  .kill_sb  = kill_block_super,  .fs_flags  = FS_REQUIRES_DEV,};
    int register_filesystem(struct file_system_type * fs){  int res = 0;  struct file_system_type ** p;
     BUG_ON(strchr(fs->name, '.'));  if (fs->next)    return -EBUSY;  write_lock(&file_systems_lock);  //在已注册的全局文件系统链表file_systems中查找,看是否已经注册过  p = find_filesystem(fs->name, strlen(fs->name));  if (*p)    //如果查找到就返回错误,同一个文件系统不能注册两次    res = -EBUSY;  else    //没查找到,直接将该文件系统添加链表末尾    *p = fs;  write_unlock(&file_systems_lock);  return res;}
    static struct file_system_type **find_filesystem(const char *name, unsigned len){  struct file_system_type **p;  //在已注册的全局文件系统链表file_systems中查找  for (p = &file_systems; *p; p = &(*p)->next)    if (strncmp((*p)->name, name, len) == 0 &&        !(*p)->name[len])      break;  return p;}

    相关标签: Linux系统 IT技术分享

    Copyright © 2016-2025 帆笛跨境网 · 版权所有

    联系我们

    全国服务热线

    4008105666

    E-mail:support@myfindy.com‬

    地 址:中国 · 成都

    帆笛跨境客服微信二维码
    扫一扫,加微信

    Copyright © 2016-2025 帆笛跨境网 · 版权所有