linux的文件系统

理解操作系统原理之文件系统

深入理解操作系统原理之文件系统

一、概述

1、文件
计算机系统对系统中软件资源:无论是程序或数据、系统软件或应用软件都以文件方式来管理。

文件是存贮在某种介质上的(如磁盘、磁带等)并具有文件名的一组有序信息的集合。
文件名是由字符和数字组成的,例如MS-DOS中文件名由三部分组成,格式如下:[<盘符>] <文件名> [.扩展名]。格式 [ ] 中是可以省略,盘符为存放文件的磁盘驱动器号,如用A:和C:分别 表示软盘和硬盘驱动器;文件名由1∽8个字符组成。扩展名为由“.”开始的1-3个字符组成,如.EXE表示可执行的浮动代码文件,.TXT表示ASCⅡ码文本文件,.LIB表示库文件,.BAT表示批处理文件等。

UNIX 文件系统将文件分成普通文件、目录文件、设备文件(特殊文件)和符号连接文件(Symbolic link)等几类,UNIX把所有I/O设备作为特殊文件,对I/O设备操作模仿为对普通文件的存取,这样将文件与设备的I/O尽可能统一起来。
文件是具有文件名的一组相关记录的集合。

2、文件系统
文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构(如目录和索引表等)的集合。
从系统角度来看,文件系统是对文件存储器的存储空间进行组织、分配和回收,负责文件的存储、检索、共享和保护。
从用户角度来看,文件系统主要是实现“按名存取”,文件系统的用户只要知道所需文件的文件名,就可存取文件中的信息,而无需知道这些文件究竟存放在什么地方。

文件系统的类型:
(1)FAT文件系统(MS-DOS文件系统、msdos)
它是MS-DOS操作系统使用的文件系统,它也能由Windows98/NT、linux、SCO UNIX等操作系统访问。文件地址以FAT表结构存放,文件目录32B,文件名为8个基本名加上一个“.”和3个字符扩展名。
(2)扩展文件表系统(vfat)
它是Windows98使用的扩展的DOS文件系统,它在MS-DOS文件系统基础上增加了对长文件名(最多到256B)支持。
(3)NTFS(NT文件系统)
它是Windows NT操作系统使用的文件系统,它具有很强的安全特性和文件系统恢复功能,可以处理巨大的存储媒体,支持多种文件系统。
(4)ext2(二级扩展文件系统)
它是Linux操作系统使用的高性能磁盘文件系统,它是对Minux操作系统中使用的文件系统扩展(ext)的扩展。它支持256字符的文件名,最大可支持到4TB的文件系统大小。
(5)HPFS(高性能文件系统、hpfs)
它是OS/2操作系统使用的文件系统。
(6)S51K/S52K(sysv)
它是AT&T UNIX S V 操作系统使用的1KB/2KB文件系统。
(7)CD-ROM文件系统(iso9660)
它是符合ISO9660标准的支持CD-ROM的文件系统,它有High sierra CD-ROM和Rock Ridge CD-ROM二种类型。
(8)UDF通用磁盘格式文件系统
UDF(Universal Disk Format)文件系统是依据光学储存技术协会(Optical Storage Technology Association, OSTA)的通用磁盘格式文件系统规格1.02版所制定的。它提供了对 UDF格式媒体的只读访问(例如DVD光盘)。Windows98提供对UDF文件系统支持。

现代操作系统(如Windows 2000/XP、Linux、UNIX等)提供了对多种文件系统的支持。
(1)Windows 2000/XP
Windows 2000/XP支持FAT文件系统、NTFS、HPFS、CD-ROM文件系统等多种文件系统。 Windows 2000执行体内I/O系统分成I/O管理程序、文件系统驱动程序和盘驱动程序三层,不同的文件系统采用不同的文件系统驱动程序,系统用动态连接库对这些文件系统进行装入和卸出并适宜于将来的扩展。
(2)Linux
Linux支持ext、ext2、msdos、vfat、iso9660、hpfs等多种文件系统。**Linux采用虚拟文件系统VFS支持许多不同类型的文件系统,VFS是物理系统与服务之间的一个接口层,它屏蔽各类文件系统的差异,给用户和程序提供一个统一的接口。**使用命令mkfs创建各类文件系统。

二、文件的组织

文件的组织是指文件的构造方式,从用户观点出发观察到的文件组织结构称为文件的逻辑结构;而文件在外存上的存储组织形式称为文件的物理结构,又称文件的存储结构。

文件的组织是指文件的构造方式,从用户观点出发观察到的文件组织结构称为文件的逻辑结构;而文件在外存上的存储组织形式称为文件的物理结构,又称文件的存储结构。

1、文件的逻辑结构和存取方法
从用户观点出发观察到的文件组织结构称为文件的逻辑结构,逻辑结构的文件称逻辑文件。逻辑文件从结构上分成二种形式,一种是无结构的流式文件,另一种是有结构的记录式文件。
流式文件是指对文件内信息不再划分单位,它是依次的一串字符流构成的文件。
记录式文件是用户把文件内的信息按逻辑上独立的含义划分信息单位,每个单位称为一个逻辑记录(简称记录)。所有记录通常都是描述一个实体集的,有着相同或不同数目的数据项,记录的长度可分为定长和不定长记录两类。
记录文件有顺序、索引、索引顺序、直接、分区和堆文件几种。

用户通过对文件的存取来完成对文件的修改、追加和搜索等操作。常用的存取方法有顺序存取法、随机存取法(直接存取法)和按键存取法三种。

UNIX、Linux和Windows等操作系统都采用顺序存取和随机存取两种方法。

2、文件的物理结构
文件在存储介质上的组织方式称为文件的存储结构或称文件的物理结构、物理文件。
外存分配方法有连续分配、链接分配、索引分配,相应物理文件有:顺序文件、链接文件、索引文件。

UNIX/Linux直接间接混合寻址方式
由于80%以上文件是小文件,为了解决能高速存取小文件和管理大文件的矛盾,UNIX将直接寻址、一级索引、二级索引和三级索引结合起来,形成了混合寻址方式。

3、VFAT表结构
MS-DOS文件系统的文件物理结构采用FAT表结构。该结构为了克服链接文件随机读取任一逻辑块需要化费多次盘I/O操作的不足,将各盘块中的链接指针集中存放在盘的开始部分,构成一张表,称为FAT表。(这称为显式链接)FAT表每一项存放链接指针(下一个簇号),每个FAT表项占12位或16位,称为FAT12或FAT16。对于软盘因为容量小,簇数也少,采用12位FAT表,对于硬盘则采用16位FAT表。
FAT表文件系统原为小硬盘的目录结构而设计,由于簇的数目最多只能用16位表示,即最多只能有64K个簇,要用FAT表管理大的磁盘分区,只能采取增大每簇所包含的扇区数,一般根据磁盘的类型和容量大小来决定簇的大小。

三、文件的目录和管理

1、文件控制块FCB
为了实现“按名存取”,系统必须为每个文件设置用于描述和控制文件的数据结构,它至少要包括文件名和存放文件的盘物理地址,这个数据结构称为文件控制块FCB,文件控制块的有序集合称为文件目录,即一个文件控制块FCB就是一个文件目录项。文件控制块FCB中包含的信息有以下三类:

  • 基本信息类
    文件名:标识一个文件的符号名,在每个系统中文件必须具有唯一的名字。
    文件的物理地址:这由于文件的物理结构不同而不同。对于连续文件就是文件的起始块号和文件总块数;对于MS-DOS是文件的起始簇号和文件总字节数;对于UNIX S V是文件所在设备的设备号、13个地址项、文件长度和文件块数等。
  • 存取控制信息类
    文件的存取权限,象UNIX用户分成文件主、同组用户和一般用户三类,这三类用户的读写执行(RWX)的权限。
  • 使用信息类
    文件建立日期、最后一次修改日期、最后一次访问的日期;当前使用的信息:打开文件的进程数,在文件上的等待队列等。文件控制块的信息因OS而不同。

2、多级目录
目录结构的组织关系到文件系统的存取速度,关系到文件共享性和安全性,因此组织好文件的目录是设计文件系统的重要环节。

  • 单级目录结构
    最简单的目录结构是在整个文件系统中只建立一张目录表,每个文件占一个表目,这称为单级目录。单级目录结构简单,能实现目录管理的基本功能–按名存取,但存在查找速度慢,不允许重名和不便于实现文件共享等缺点,因此它只适用于单用户环境。

  • 多级目录结构
    为了解决以上问题,在多道程序设计系统中常采用多级目录结构,MS-DOS和UNIX等操作系统都采用多级目录结构。这种目录结构象一棵倒置的有根树,该树根向下,每一个节点是一个目录,最末一个结点是文件,下图为UNIX树形多级目录结构。在多级目录中要访问一个文件时,必须指出文件所在的路径名,路径名从根目录开始到该文件的通路上所有各级目录名拼起来得到,各目录名之间与文件名之间可用分隔符隔开。在MS-DOS中分隔符为“\”,在UNIX中分隔符为“/”。例如下图中访问命令文件man的路径名为/usr/lib/man,这也称为文件全名。
    在这里插入图片描述

3、UNIX/Linux树型目录结构
UNIX为了加快目录的寻找速度,UNIX将文件控制块FCB中文件名和文件说明分开。
文件说明为索引节点,各文件索引节点集中存放在索引节点区,索引节点按索引节点号排序。而文件名与索引节点号构成目录项
,UNIX S V 操作系统的文件名14个字节,索引节点2个字节,共16个字节构成目录项。同一级目录项构成目录文件,在文件区存放。

索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号

Linux目录文件中的目录项会变长,以保证系统支持文件名长度可变,最长达255个字符。目录项的前三项是定长的,包含以下信息:(1)索引节点号(4B);(2)目录项长度(2B);(3)文件名长度(2B)。目录项最后是文件名,目录项不能跨越二个块 。

每个文件有一个存放在磁盘索引节点区的索引节点,称为磁盘索引节点,它包括以下内容:
(1)文件主标识符和同组用户标识符;
(2)文件类型:是普通文件、目录文件、符号连接文件或特别文件(又分块设备文件或字符设备文件);
(3)文件主,同组用户和其它人对文件存取权限(读R、写W、执行X);
(4)文件的物理地址
(5)文件长度(字节数);
(6)文件链接数
(7)文件最近存取和修改时间等。

Linux系统中的每个文件都被赋予一个唯一的数值,这个数值称做索引节点。索引节点存储在一个称作索引节点表< inode table>中,该表在磁盘格式化时被分配。每个实际的磁盘或分区都有其自己的索引节点表。一个索引节点包含文件的所有信息,包括磁盘上数据的地址和文件类型。文件类型包括如普通文件、目录和特殊文件这样的信息。

四、文件存储空间的管理

1、磁盘组织
磁盘是常用的存储设备,它具有容量大,存取速度快,可以实现随机存取等优点,是现代操作系统的必需存储设备,也是实现虚拟存储器所必需的硬件。

一个物理磁盘在逻辑上可分为几个区域,分区信息存放在主引导块分区表中。分区表中保存磁盘各种分区起始和终止的磁头、柱面、扇区、总的扇区数等信息。

在主引导块中有三种类型分区:主分区、扩展区和逻辑分区。

主分区是常用的,加载一个操作系统所需文件安装其上,操作系统必须从主分区上引导,一个硬盘上只能有四个主分区。
为了突破四个分区的限制,就要在四个分区中创建立一个扩展分区。扩展分区其实是一个逻辑盘,它不能格式化,也不能分配盘符。但可在扩展分区中创建一个或多个逻辑分区,(或称逻辑驱动器),每个逻辑分区分配一个盘符,可以格式化成一个特定的文件系统,MS-DOS、Windows98和WindowsNT可用fdisk命令将硬盘分区。

2、磁盘空闲块管理和磁盘碎片整理
为了实现存储空间的分配和回收,系统应为存储空间设置相应的结构以记住存储空间的使用情况,并配以相应算法方便地对存储空间进行分配和回收,下面介绍几种常用的文件存储空间管理方法。

  • 空闲表法
    空闲表法属于连读分配方法,它为外存上所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中包括序号、该空闲区的第一盘块号,该区的空闲盘块数等信息,再将所有空闲区按起始盘块号递增的次序排列。 UNIX S V操作系统盘对换区空间管理采用空闲表法,它与内存系统页表管理采用同样的数据结构和分配回收算法。空闲表法的缺点是需要专用盘区来存放空闲表,在文件系统中较少采用连续分配。

  • 位示图法
    位示图是利用二进制的一位来表示磁盘中一个块的作用情况,当其值为0时表示对应盘块空闲;值为1时盘块已分配。磁盘上所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位形成了一个集合称为位示图,位示图用磁盘块存放,称为位图块。

  • 空闲块链接法
    空闲块链接法是将磁盘上所有空闲盘区链接在一个队列中,称为空闲块链。请求分配时从链头依次摘下适当数目的空闲盘块来分配,回收时将回收空闲盘块链入空闲块链尾部。空闲块链接法的优点是不需专用块存放管理信息,它的缺点是连续分配回收多块空闲块时需增加盘I/O操作。

  • 成组链接法
    UNIX S V操作系统采用成组链接法管理磁盘空闲块,该方法是空闲表法和空闲块链接法的结合,具备分配回收方便,不需专用块来存放分配表等优点。成组链接法将磁盘空闲块分成若干组,如将每100个盘块作为一组,该组空闲块总数和各空闲块块号存入下一组的第一个空闲块中。最后不满100块的那组空闲块总数和各空闲块块号记入磁盘区专用管理块的空闲块管理的数据结构:s_nfree和s_free[100]中。

五、安全和保护

影响文件安全性的主要因素,第一是人为因素,即由于人们有意或无意的行为,而使文件系统中的数据遭到破坏或丢失;第二是系统因素,即由于系统的某部分出现异常情况,而造成对数据的破坏或丢失,特别是作为数据存储介质的磁盘,在出现故障或损坏时,会对文件系统的安全性造成影响;第三是自然因素,即存放在磁盘上的数据,随着时间的推移将可能发生溢出或逐渐消失。
为了确保文件系统的安全性,可针对上述原因而采取以下措施:
(1)通过存取控制机制来防止由人为因素所造成的文件不安全性。
(2)通过磁盘容错技术,来防止由磁盘部分的故障所造成的文件不安全性。
(3)通过“后备系统”来防止由自然因素所造成的不安全性。

  • 存取控制矩阵
    理论上存取控制方法可用存取控制矩阵,它是一个二维矩阵,一维列出计算机的全部用户,另一维列出系统中的全部文件,矩阵中每个元素Aij是表示第i个用户对第j个文件的存取权限。
    存取控制矩阵在概念上是简单清楚的,但实现上却有困难。当一个系统用户数和文件数很大时,二维矩阵要占很大的存储空间,验证过程也费时。

  • 存取控制表
    存取控制矩阵由于太大而往往无法实现。一个改进的办法是按用户对文件的访问权力的差别对用户进行分类,由于某一文件往往只与少数几个用户有关,所以这种分类方法可使存取控制表大为简化。UNIX系统就是使用这种存取控制表方法。它把用户分成三类:文件主、同组用户和其它用户,每类用户的存取权限为可读、可写、可执行以及它们的组合。

  • 用户权限表
    改进存取控制矩阵的另一种方法是以用户或用户组为单位将用户可存取的文件各集中起来存入一表,这称为用户权限表,表中每个表目表示该用户对应文件的存取权限,如下表所示。这相当于存取控制矩阵一行的简化。

2、分级安全管理

随着计算机应用范围扩大,在所有稍具规模的系统中,都从多个级别上来保证系统的安全性。

  • 系统级安全管理
    系统级安全管理的主要任务是不允许未经核准的用户进入系统,从而也防止了他人非法使用系统中各类资源(包括文件)。

  • 用户级安全管理
    用户级安全管理是通过对不同的用户对不同文件设置不同的存取权限来实现。

  • 目录级安全管理
    目录级安全管理,是为了保护系统中各种目录而设计的,它与用户权限无关。为保证目录的安全规定只有系统核心才具有写目录的权利。
    用户对目录的读、写和执行与一般文件的读、写和执行的含义有所不同,对于目录的读权限意味着允许打开并读该目录的信息,例如UNIX系统使用ls命令可列出该目录的子目录和文件名。
    对于目录的写权限意味着可以在此目录中创建或删除文件,禁止对于某个目录的写权限并不意味着在该目录中的文件不能修改,只有在一个文件上的写权限才真正地控制修改文件的能力。对于一个目录的执行权限意味着系统在分析一个文件时可检索此目录。禁止一个目录的执行权限可真正地防止用户使用该目录中的文件,用户不能使用cd命令来进入此目录。

  • 文件级安全管理
    文件级安全管理,是通过系统管理员或文件主对文件属性的设置来控制用户对文件的访问。用户对文件的访问,将由用户访问权、目录访问权限及文件属性三者的权限所确定。或者说是有效权限和文件属性的交集。例如对于只读文件,尽管用户的有效权限是读/写,但都不能对只读文件进行修改、更名和删除。对于一个非共享文件,将禁止在同一时间内由多个用户对它们进行访问。通过上述四级文件保护措施,可有效地对文件的保护。

3、备份和恢复
文件系统中不论硬件和软件都会因电源中断和变化,用户粗野和不慎的操作而发生损坏和错误,所以为使至关重要的文件系统万无一失,应对保存在辅存中的文件采取一些保险措施,这些措施中最简便方法是“定期转储”,使一些重要的文件有多个副本。

Linux文件系统

在 Linux 系统中,文件系统主要分为两部分,一部分为元数据(metadata),另一部分为数据本身。元数据,换句话说,就是“包含了与数据有关信息的数据”。索引节点就管理着文件系统中元数据的部分。

linux硬盘组织方式为:引导区、超级块(superblock),索引结点(inode),数据块(datablock),目录块(diredtory block)

其中超级块中包含了关于该硬盘或分区上的文件系统的整体信息,如文件系统的大小等;

超级块后面的数据结构是索引结点,它包含了针对某一个具体文件的几乎全部信息,如文件的存取权限、所有者、大小、建立时间以及对应的目录块和数据块等;

数据块是真正存储文件内容的位置。但是索引结点中不包括文件的名字,文件名是放在目录块里的。

目录块里包含有文件的名字以及此文件的索引结点编号。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

关于索引节点inode的理解

来自Linux的inode的理解

一、inode是什么?

操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

  1. Size 文件的字节数
  2. Uid 文件拥有者的User ID
  3. Gid 文件的Group ID
  4. Access 文件的读、写、执行权限
  5. 文件的时间戳,共有三个:
    Change 指inode上一次变动的时间
    Modify 指文件内容上一次变动的时间
    Access 指文件上一次打开的时间
  6. Links 链接数,即有多少文件名指向这个inode
  7. Inode 文件数据block的位置
  8. Blocks 块数
  9. IO Blocks 块大小
  10. Device 设备号码
    可以用stat命令,查看某个文件的inode信息:
stat example.txt

在这里插入图片描述
总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
附:stat介绍

三、inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

df -i

在这里插入图片描述
查看每个inode节点的大小,可以用如下命令:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

在这里插入图片描述
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。案例http://zyan.cc/post/295/

四、inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

ls -i example.txt

在这里插入图片描述

五、目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名,ls -i命令列出整个目录文件,即文件名和inode号码:
在这里插入图片描述
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点读取信息。目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。

六、硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

ln命令可以创建硬链接:

ln 源文件 目标文件

在这里插入图片描述
运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:".“和”…"。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。

七、软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

ln -s命令可以创建软链接:

ln -s 源文文件或目录 目标文件或目录

在这里插入图片描述

八、inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
移动文件或重命名文件,只是改变文件名,不影响inode号码。
打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

九、实际问题解决

1、新建scan.sh文件,保存如下内容

florder=$1
dir=$(ls -l $florder |awk '/^d/ {print $NF}')
for i in $dir
do
    if [ "$i" != 'home' -a "$i" != 'proc' ];then
    f=$i
    if [ $florder != '/' ];then
        f=$florder/$i
    fi
        rs=$(ls -lR $f|grep "^-"| wc -l)
    echo $f 文件以及子文件个数 $rs
    fi
done

挨个文件夹执行,会遍历当前目录下文件夹的文件数量
2、找到文件数很大的文件夹,比如session文件夹:执行命令(xxx)是目录

find /xxx/ -type f -name '*' -print0 | xargs -0 rm &

执行后,时间较长,可以用htop查看find进程

虚拟文件系统VFS

通过标准的Unix系统调用对不同的文件系统,甚至不同介质的文件系统进行读写操作,如图
在这里插入图片描述
VFS使得用户可以直接使用open()、read()和write()这样的系统调用而无须考虑具体文件系统和实际物理介质。
在这里插入图片描述

Unix文件系统

Unix使用了四种和文件系统相关的传统抽象概念:文件、目录项、索引节点和安装点(mount point)。
Unix系统将文件的相关信息和文件本身这两个概念加以区分,例如访问控制权限、大小、拥有者、创建时间等信息。文件相关信息,有时被称为索引节点(inode),他其实是index node的缩写。

VFS对象及其数据结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

超级块对象

各种文件系统都必须实现超级块对象,该对象用于存储特定文件系统的信息,通常对应于存放在磁盘特定扇区中的文件系统超级块或文件系统控制块(称为超级块对象)。对于并非基于磁盘的文件系统(如基于内存的文件系统,比如sysfs),它们会在使用现场创建超级块并将其保存到内存中。
超级块对象由super_block结构体表示,定义在文件<linux/fs.h>中,下面给出它的结构和各个域的描述
在这里插入图片描述
在这里插入图片描述
创建、管理和撤销超级块对象的代码位于文件 fs/super.c中。
超级块对象通过alloc_super()函数创建并初始化。在文件系统安装时,文件系统会调用该函数以便从磁盘读取文件系统超级块,并且将其信息填充到内存中的超级块对象中

由这里可知:超级块对象原先是在磁盘中,当创建文件系统时,这个超级块会被读入到内存中

超级块操作

超级块对象中最重要的一个域是s_op,它指向超级块的操作函数表。超级块操作函数表由super_operations结构体表示,定义在文件<linux/fs.h>中,形式如下:
在这里插入图片描述
该结构体中的每一项都是一个指向超级块操作函数的指针,超级块操作由函数执行文件系统和索引节点的底层操作。
当文件系统需要对其超级块执行操作时,首先要在超级块对象中寻找需要的操作方法。比如,如果一个文件系统要写自己的超级块,需要调用:

sb->s_op->write_super(sb);

在这里插入图片描述
在这里插入图片描述

索引节点对象

索引节点对象包含了内核在操作文件或目录时需要的全部信息。
对于Unix风格的文件系统来说,这些信息可以从磁盘索引节点直接读入。

如果一个文件系统没有索引节点,那么,不管这些相关信息在磁盘上是怎么存放的,文件系统都必须从中提取这些信息。没有索引节点的文件系统通常将文件的描述信息作为文件的一部分来存放。
这些文件系统与Unix风格的文件系统不同,没有将数据与控制信息分开存放。有些现代文件系统使用数据库来存储文件的数据。
不管哪种情况,采用哪种方式,索引节点对象必须在内存中创建,以便文件系统使用
索引节点对象由inode结构体表示,它定义在文件<linux/fs.h>中,下面给出它的结构体和各项的描述。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

索引节点操作

和超级块操作一样,索引节点对象中的inode_operations项也非常重要,因为它描述了VFS用以操作索引节点对象的所有方法,这些方法由文件系统实现。与超级块类似,对索引节点的操作调用方式如下:

i->i_op->truncate(i)

i指向给定的索引节点,truncate()函数是由索引节点i所在的文件系统定义的。inode_operations结构体定义在文件<linux/fs.h>中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

目录项对象

VFS把目录当作文件对待,所以在路径/bin/vi中,bin和vi都属于文件----bin是特殊的目录文件而vi是一个普通文件,路径中的每个组成部分都由一个索引节点对象表示。虽然它们可以同意由索引节点表示,但是VFS经常需要执行目录相关的操作,比如路径名查找等。路径名查找需要解析路径中的每一个组成部分,不但要确保它有效,而且还需要再进一步寻找路径中的下一个部分。
为了方便查找操作,VFS引入了目录项的概念。每个dentry代表路径中的一个特定部分。对于前一个例子来说,/、bin和vi都属于目录项对象。前两个是目录,最后一个是普通文件。必须明确:在路径中(包括普通文件在内),每一个部分都是目录项对象。解析一个路径并遍历其分量绝非简单的演练,它是耗时的、常规的字符串比较过程,执行耗时、代码繁杂。目录项对象的引入使得这个过程更加简单。
目录项也可包括安装点。在路径/mnt/cdrom/foo中,构成元素 /、mnt、cdrom和foo都属于目录项对象。VFS在执行目录操作时(如果需要的话)会现场创建目录项对象。

目录项对象由dentry结构体表示,定义在文件<linux/dcache.h>中。下面给出该结构体和其中各项的描述:
在这里插入图片描述
与前面的两个对象不同,目录项对象没有对应的磁盘数据结构,VFS根据字符串形式的路径名现场创建它。而且由于目录项对象并非真正保存在磁盘上,所以目录项结构体没有是否被修改的标志(也就是是否为脏、是否需要写回磁盘的标志)

这里个人有个疑问:目录项对象最重要的功能就是可以由文件名找到其相关联的索引节点,
这里VFS根据字符串形式的路径名现场创建它?
如果不事先保存在磁盘中,那开机重启后,如何知道路径名对应到哪一个inode?
仔细想想:其实磁盘中没有dentry对象,并不是说磁盘中没有路径名与inode对应关系的信息,
磁盘中至少必须保存路径名信息和对应的inode的信息。

目录项状态

在这里插入图片描述
在这里插入图片描述

目录项缓存

在这里插入图片描述
在这里插入图片描述

目录项操作

dentry_operation 结构体指明了VFS操作目录项的所有方法。
该结构定义在文件< linux/dcache.h>中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件对象

VFS的最后一个主要对象是文件对象。文件对象表示进程已打开的文件。

如果我们照在用户角度看待VFS,文件对象会首先进入我们的视野。进程直接处理的是文件,而不是超级块、索引节点或目录项。

所以不必奇怪:文件对象包含我们非常熟悉的信息(如访问模式,当前偏移等),同样道理,文件操作和我们非常熟悉的系统调用read()和write()等也很类似。

文件对象是已打开的文件在内存中的表示。该对象(不是物理文件)由相应的open()系统方法调用创建,由close()系统调用撤销,所有这些文件相关的调用实际上都是文件操作表中定义的方法。因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象

文件对象仅仅在进程观点上代表已打开文件,它反过来指向目录项对象(目录项对象反过来指向索引节点),其实只有目录项对象才表示已打开的实际文件。虽然一个文件对应的文件对象不是唯一的,但对应的索引节点和目录项对象无疑是唯一的

文件对象由file结构体表示,定义在< linux/fs.h>中,下面给出该结构体和各项的描述。
在这里插入图片描述
在这里插入图片描述

文件操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

和文件系统相关的数据对象

除了以上几种VFS基础对象外,内核还使用了另外一些标准数据结构来管理文件系统的其他相关数据。第一个对象是file_system_type,用来描述各种特定文件系统类型,比如ext3、ext4或UDF。第二个结构体是vfsmount,用来描述一个安装文件系统的实例。

因为Linux支持众多不同的文件系统,所以内核必须由一个特殊的结构来描述每种文件系统的功能和行为。file_system_type结构体被定义在<linux/fs.h>中,具体实现如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

和进程相关的数据结构体

进程与vfs对象之间的关系
在这里插入图片描述
在这里插入图片描述

UNIX V7文件系统

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值