Linux文件系统的实现(inode/block/superblock)与虚拟文件系统


磁盘组成与分区复习

文件系统的最终目的是把大量数据有组织的放入持久性的存储设备(如磁盘)中。

磁盘的物理组成:

  • 扇区(Sector)为最小的物理存储单位,目前主要有512bytes和4K两种格式;磁盘同一位置的磁道组成磁柱(Cylinder);早期的分区主要以磁柱为最小分区单位,现在的分区通常使用扇区为最小分区单位。
  • 磁盘分区表主要有两种格式:MBR分区表和GPT分区表。MBR分区表的第一个扇区最重要,其中包含:开机引导程序、分区表和有效标志。GPT分区相较于MBR分区数量得到扩充、拥有备份区域以及支持的磁盘容量可以超过2TB。

常见存储设备最开始的扇区为主引导扇区(MBR),Linux开机启动需要MBR加载开机管理程序。剩余的空间可能被分为数个分区,每个分区的信息记录在分区表中。
磁盘组成

文件系统特性(inode、block、superblock)

磁盘分区完毕后需要进行格式化之后操作系统才能使用这个文件系统。因为每种操作系统所设定的文件属性、权限并不相同,为了存放这些文件所需的数据,需要将分区进行格式化以成为操作系统能够利用的文件系统格式。

传统的磁盘与文件系统,一个分区只能够被格式化成为一个文件系统,因此此时可以称一个文件系统就是一个分区。但是新技术的应用可以将一个分区格式化成为多个文件系统(如LVM),也可以将多个分区合成一个文件系统(如LVM、RAID)。因此现在在格式化时不再称一个文件系统就是一个分区,通常称一个可被挂载的数据为一个文件系统而不是一个分区。

文件系统的运作与操作系统的文件数据有关。目前操作系统的文件数据除了文件实际内容之外,还包含有非常多的属性,如Linux操作系统的文件权限(rwx)与文件属性(拥有者、所属组、时间信息等)。文件系统通常将这两部分的数据分别存放在不同区块:权限与属性放置在inode中,实际数据放置在data block中,并使用superblock记录整个文件系统的整体信息(包括inode和block的总量、使用量、剩余量)。

一个典型的Linux分区如下:
Linux分区

  • 分区的第一个部分为启动区:主要为Linux开机服务。Linux开机启动后会首先载入MBR,随后MBR从某个硬盘的启动区加载开机管理程序。一般为了方便管理,即使某个分区没有安装操作系统,也会预留启动区。
  • 分区的第二个部分为super block区:记录文件系统的整体信息,包括inode和block的总量、使用量、剩余量,以及文件系统的类型和相关信息等。
  • 分区的第三个部分为inode区:inode记录文件的权限和属性,一个文件对应一个inode,inode中包含多个指针指向属于该文件的各个data block。
  • 分区的最后一个部分为data block区:实际记录文件的内容,大文件会占用多个block。

superblock

superblock记录整个文件系统相关信息,包括inode和block的总量、使用量、剩余量,以及文件系统的类型和相关信息等:
superblock

data block

data block是用来放置文件实际内容的地方。在EXT2文件系统中支持的block大小有1KB、2KB和4KB三种,在格式化时block大小就已经固定,且每个block都有编号,以便inode记录。由于block大小差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。

  • 每个block内最多放置一个文件的数据;
  • 如果文件大小大于block的大小,则会占用多个block;
  • 如果文件大小小于block的大小,则该block的剩余容量不会被使用(磁盘空间浪费)。

block bitmap(区块对照表)

新增文件时,通过block bitmap得知哪些block是可使用的,系统可以快速找到位置放置文件内容;

删除文件时,将block bitmap中该文件对应的block号码标志改为未使用。

inode

inode记录的文件的权限属性以及该文件实际数据存放的data block号,inode至少记录如下数据:
inode
每个inode有一个唯一的整数编号(inode number),每个文件都只对应一个inode,因此,此文件系统能够建立的文件数量与inode的数量有关(inode无剩余,block有剩余也会造成磁盘空间不足现象)。

inode和bolck的数量与大小在ext家族中格式化的时候就已确定,要想改变大小除非重新格式化;而在xfs中为动态产生,并非一开始在格式化就完成配置。

系统读取一个文件时需要先找到文件对应的inode,并分析inode记录的权限与用户是否符合,若符合则沿着指针将指向的block内容收集起来,就可以在内存中组成一个文件的数据。

系统写入一个文件时,分配一个空白inode给该文件,将其inode编号记入该文件所属目录,然后选取空白block,让inode的指针指向这些数据块,并放入内存中的数据。
注意:在Linux中目录也是文件,目录的inode节点指向的data block的内容是该目录下所有文件的文件名与inode的对应关系(详情请查看文件系统与目录树的关系)。

inode bitmap(inode对照表)

新增文件时,通过inode bitmap得知哪些inode是可使用的,系统可以快速为新文件分配一个inode;

删除文件时,将inode bitmap中该文件对应的inode释放。

文件创建

  • 首先确定用户对想要新建文件的目录有没有w和x权限,有的话才可以创建文件;
  • 根据inode bitmap找到没有使用的inode号码,并将新文件的属性和权限写入;
  • 根据block bitmap找到没有使用的block号码,并将文件的实际数据写入block,且更新inode的block指向数据;
  • 将刚刚写入的inode和block数据同步更新inode bitmap 和 block bitmap,并更新superblock的内容。

文件删除

Linux通过link的数量来控制文件的删除,只有当一个文件的link数为0时,该文件才算被删除。

每个文件有两个link计数器:i_nlink和i_count:

  • i_nlink:硬链接的数量(磁盘引用计数器)
  • i_count:文件被调用的数量(内存引用计数器)

当一个文件被一个进程引用时,对应的i_count数就会增加,当创建文件的硬链接时,对应的i_nlink数就会增加。

rm命令对inode的操作如下:

  • 系统将文件的i_nlink -1,操作后如果文件的链接数小于1,则释放该文件的inode节点;
  • 释放存储该文件内容的data blocks(将这些数据块标记为可用);
  • 删除记录这个文件名和inode节点号的目录记录。
  • 系统此时并没有真正删除掉这一文件中的数据,只有这些释放的data block被新文件的数据覆盖时,原有的数据才算被删掉。

对于命令rm而言,就是减少磁盘引用数量i_nlink。如果一个文件正在被某进程调用,当用户执行rm将被调用文件删除后,调用该文件的进程依然能够正常进行,但是ls、cat等其他文件管理命令无法找到文件。这是因为rm将i_nlink减少,但是文件对应的i_count依然不为0,可见只有当i_nlink和i_count都为0时,文件的inode被系统回收,才算是真正删除。

文件恢复

rm操作只是将i_link的数量-1(解除文件名和inode之间的联系),但是并没有清空block数据块。此时即使停止写入操作,避免原文件的block块被其它文件占用,仍有希望找回数据。

在ext3和ext4文件系统中,每个文件都是通过inode来描述其数据存放的具体位置。文件的读写是通过inode来实现,当文件被删除后,inode的数据指针部分被清零,即使文件block还在也没有办法将其组合出来。

当ext3和ext4文件系统中的元数据metadata发生变化时,相应的元数据metadata在日志文件中会有一份拷贝。如果文件被删除了,它的inode信息会在日志文件中先保存一份,然后再把要删除文件的inode信息清零。此时可以通过日志文件进行恢复(日志的切割和轮替,如果操作过多,删除文件的inode日志记录被新的日志轮替,就失去了找回的可能)。

extundelete工具可以恢复EXT家族的文件,无法恢复CentOS 7系统默认采用的XFS文件系统的文件。针对XFS目前没有较成熟的文件恢复工具,可使用xfsdump和xfstore工具进行备份与恢复。

与目录树的关系

目录的inode和block

在Linux下的文件系统建立一个目录时,文件系统会分配一个inode和至少一块block给该目录:

  • inode记录该目录的权限与属性,以及分配到的block的号码;
  • block记录在该目录下的文件名与该文件名占用的inode号码。
    目录inode

目录树读取

inode本身不记录文件名,文件名记录在目录的block中,因此文件的新增/删除/更名文件名与目录的w权限有关。

由于文件名记录在目录的block中,当读取某个文件时,必须经过目录的inode与block才能找到待读取文件的inode号码,并最终读取文件的block数据。

由于目录树由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的inode号,就可以读取到根目录的inode内容,并根据inode读取根目录的block内的文件名数据,再一层一层的读取到正确的文件名。

例:读取/etc/passwd文件的流程:

[root@localhost Desktop]# ll -di / /etc /etc/passwd
     128 dr-xr-xr-x.  18 root root 4096 Jul  1 21:21 /
67108993 drwxr-xr-x. 129 root root 8192 Jul  9 16:59 /etc
70277929 -rw-r--r--    1 root root 2307 Jul  4 16:55 /etc/passwd

读取文件流程

文件系统的运作

所有的数据都要加载到内存后CPU才能够对该数据进行处理,如果编辑文件时频繁的要操作系统将数据写回磁盘,会尝尝耗费在等待磁盘IO上。因此Linux在处理文件时通常使用异步处理的方式:

  • 当系统加载一个文件到内存,如果该文件没有被动过,则在内存区段的文件被设定为干净;
  • 如果内存的文件数据被改动过了,此时该内存中的数据就被设定为脏的;
  • 此时所有的动作还在内存中执行,并没有写入到磁盘中,系统会不定时的将内存中设定为葬的数据写回磁盘,以保持磁盘与内存数据的一致性(也可以使用sync命令手动强迫写入磁盘)。

由于内存的速度要比磁盘快的多,因此将常用的文件放置到内存中,会增加系统性能。Linux系统的文件系统和内存有很大的关系:

  • 系统会将常用的文件数据放置在内存缓冲区,以加速文件系统的读写;
  • 正常关机时,关机指令会呼叫sync将内存中的数据写回磁盘,也可以手动使用sync命令强迫内存中脏数据写回磁盘;
  • 非正常关机时,由于数据尚未写入磁盘,重启后可能会花很多时间进行磁盘检验,甚至可能导致文件系统的损坏。

挂载点的意义

每个文件系统都有独立的inode、block、superblock等信息,该文件系统要链接到目录树才能使用,将文件系统与目录树链接的动作称之为挂载。

  • 挂载点一定是目录,该目录作为进入文件系统的入口;
  • 文件系统最顶层的目录的inode一般是128。
    [root@localhost Desktop]# ls -lid / /boot
    128 dr-xr-xr-x. 18 root root 4096 Jul  1 21:21 /
    128 dr-xr-xr-x.  4 root root 4096 Apr  9 22:18 /boot
    

常见文件系统

Linux常见的支持文件系统:

  • 传统文件系统:ext2、minix、MS-DOS、FAT、iso9660等;
  • 日志式文件系统:ext3、ext4、XFS
  • 网络文件系统:NFS、SMBFS

EXT

EXT文件系统对于文件格式化的处理方面,采用的是预先规划出所有的inode、block、metadata等数据,之后系统可以直接取用,不需要再进行动态配置的做法。

该方法适用于早期磁盘容量不大的时候,磁盘容量过大使用ext在格式化的时候会耗费很多很多时间。

XFS

XFS文件系统是一个日志式文件系统,xfs在资料分布上主要规划为三个部分:

  • 资料区(data section):inode/data block/superblock 等数据都放置在这个区块,数据区与 ext 家族的 block group 类似,分为多个储存区群组 (allocation groups) 来分别放置文件系统所需要的数据。 inode 与 block 都是系统需要用到时动态配置产生,格式化动作超级快。
  • 文件系统活动登录区(log section):主要用来纪录文件系统的变化,文件的变化会在这里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。
  • 实时运作区(realtime section):当有文件要被建立时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去 ( extent 区块的大小得要在格式化的时候就先指定 4K -1G)。

虚拟文件系统

Linux支持多种文件系统,那么Linux的核心如何管理不同的文件系统?

整个Linux系统透过虚拟文件系统(Virtual Filesystem System)的核心功能去读取文件系统,即Linux支持的文件系统都是由VFS管理。
虚拟文件系统作为一个通用的文件系统,抽象了文件系统的四个基本概念:文件、目录项(dentry)、索引节点(inode)、挂载点,VFS在内核中为用户层的文件系统提供了相关的接口,VFS实现了open()、read()等系统调用,使得用户层程序可跨文件系统操作。
VFS
VFS存在四个基本对象:

  • 超级块对象(superblock object):表示一个已安装的文件系统
  • 索引节点对象(inode object):表示一个文件
  • 目录项对象(dentry object):表示一个目录
  • 文件对象(file object):由进程打开的文件

文件系统简单操作

磁盘与目录的容量(df&du)

磁盘的整体数据在superblock区块中,每个文件的各自容量在inode中记载。

  • df:列出文件系统的整体磁盘使用量,读取的范围主要是在superblock内的信息,因此该命令显示速度非常快。

    [root@localhost Desktop]# df -h /etc
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda3        49G  6.5G   43G  14% /
    /etc在根目录下,df列出文件系统的整体磁盘使用量,因此df查询/etc查询到根目录所在文件系统的整体使用情况
    
  • du:显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小,该命令直接到文件系统内寻找文件数据,因此该命令运行时间可能会长一点。

    [root@localhost Desktop]# du -sh /etc
    42M	/etc
    -s:只列出总量而不列出每个个别的目录占用容量
    

du和df的区别

  • du -sh命令通过将指定文件系统中的目录、符号链接、文件使用的块数累加得到该文件系统使用的总块数;df命令通过查看superblock得出总块数和剩余块数。
  • du不考虑metadata,df考虑metadata,因此正常情况下,df计算的used空间回比du计算的略大。

软链接和硬链接(ln)

在Linux下链接有两种:硬链接和软链接

硬链接

一个inode号对应多个文件名,这些文件为硬链接(它们有共同的inode),硬链接特性如下:

  • 文件具有相同的inode和data block;
    [root@localhost Desktop]# touch test.txt
    [root@localhost Desktop]# ln test.txt test.txt.h
    [root@localhost Desktop]# ll -i
    total 8
    136117897 -rw-r--r-- 2 letty letty 24 Jul 10 16:16 test.txt
    136117897 -rw-r--r-- 2 letty letty 24 Jul 10 16:16 test.txt.h
    
  • 只能对已存在的文件创建;
    [root@localhost Desktop]# ln no_exist hard_link
    ln: failed to access ‘no_exist’: No such file or directory
    
  • 不能跨文件系统创建硬链接;
    [root@localhost Desktop]# ln test.txt /mnt/test.txt.h
    ln: failed to create hard link ‘/mnt/test.txt.h’ => ‘test.txt’: Invalid cross-device link
    
  • 不能对目录创建硬链接,只能对文件创建;
    [root@localhost Desktop]# ln dir dir.h
    ln: ‘dir’: hard link not allowed for directory
    
  • 删除一个硬链接文件不影响具有相同inode号的其他文件。

软链接

文件的data block中存放的是另一个文件的路径名的指向,则该文件是软链接。软链接的特性如下:

  • 软链接有自己的inode和block;
    [root@localhost Desktop]# echo "Hello" >> hello.txt
    [root@localhost Desktop]# ln -s hello.txt hello.txt.s
    [root@localhost Desktop]# ll -i
    total 4
    136117897 -rw-r--r-- 1 root root 6 Jul 10 16:24 hello.txt
    138248279 lrwxrwxrwx 1 root root 9 Jul 10 16:24 hello.txt.s -> hello.txt
    
  • 软链接可对不存在的文件或目录创建;
    [root@localhost Desktop]# ln -s no_exist no_exist.s
    [root@localhost Desktop]# cat no_exist.s 
    cat: no_exist.s: No such file or directory
    [root@localhost Desktop]# mkdir dir
    [root@localhost Desktop]# ln -s dir/ dir.s
    [root@localhost Desktop]# cd dir.s/
    [root@localhost dir.s]# 
    
  • 软链接可以跨文件系统;
    [root@localhost Desktop]# ln -s hello.txt /mnt/hello.s
    [root@localhost Desktop]# cat /mnt/hello.s 
    cat: /mnt/hello.s: No such file or directory
    [root@localhost Desktop]# cat hello.txt
    Hello
    
  • 删除软链接不影响被指向的文件,但被指向的文件删除后相关软链接会成为死链接。
    [root@localhost Desktop]# ll
    total 4
    -rw-r--r-- 1 root root 6 Jul 10 16:24 hello.txt
    lrwxrwxrwx 1 root root 9 Jul 10 16:24 hello.txt.s -> hello.txt
    [root@localhost Desktop]# rm -rf hello.txt
    [root@localhost Desktop]# cat hello.txt.s 
    cat: hello.txt.s: No such file or directory
    
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值