精华内容
下载资源
问答
  • Linux文件系统结构

    千次阅读 2015-07-02 22:20:56
    写在前面linux区别于windows的其中一个很大的特点是linux采用的文件系统结构。即linux只有一个单独的顶级目录结构。所有一切都从 ‘root’ 开始,用 ‘/’ 代表, 并且延伸到子目录。一句话:一切皆文件!当有新的...

    写在前面

    linux区别于windows的其中一个很大的特点是linux采用的文件系统结构。

    即linux只有一个单独的顶级目录结构。所有一切都从 ‘root’ 开始,用 ‘/’ 代表, 并且延伸到子目录。一句话:一切皆文件!当有新的设备要接入linux,它就把这个设备当作文件目录挂载进来。

    虽然linux有各种各样不同的发行版本,但他们的文件系统结构大致都是相同的,因此理解了linux的文件系统结构对学习linux有非常大的帮助。

    文件结构

    如下图所示(不全,只是为了让脑子中有树的概念):
    文件结构

    1. / (root)这是linux的根,所有文件、设备都是在这个根下

    2. /bin 这是linux系统放置很多执行文件的目录,最常见的应该就是/bin/bash是放置shell命令的

    3. /dev 任何设备与接口设备都是以文件形式存放在这个目录中

    4. /etc 系统配置文件之类的,比如默认的开机启动项在/etc/init.d/下,还有网络ip地址设置等等

    5. /lib 放置系统开始时需要用到的函数库,可以想象成windows中的驱动程序

    6. /sbin 图中有少许错误,这里面放置是的只有root用户才能使用的执行文件,就是super bin的意思

    7. /lost+found 这是在标准的ext2/ext3文件系统格式才有的,虽然现在大部分都是ext4了,但我觉得很多企业应该还是使用比较老的文件系统格式,毕竟升级还是有一定危险性,所以还是得了解下。就是当系统发生错误的时候,将一些丢失的片段放在里面

    8. /usr 特别注意usr是UNIX Software Resource的缩写,不是user,所以里面放的是系统默认的软件,有点像windows里的C:\Windows\和C:\Program files\这两个目录的集合。

    9. /var 里面主要是系统缓存、登录文件还有软件运行产生的文件等

    10. /home 这是图中没提到的,当你创建一般用户的时候就会在这个目录下新建一个用户目录

    11. /media 这里就是放置一些可删除设备,比如U盘、DVD光盘等

    此外还有些目录我并没有提到,但目前初步掌握这些就足够了。

    相对路径与绝对路径

    还有一点要提的就是关于相对路径和绝对路径的区别。

    当我们要change directory,即使用cd命令改变文件目录时,要特别注意这一点。

    相对路径

    是由根目录(/)开始写起的文件名或目录名称,如 cd /home/lv/

    绝对路径

    是以你当前所在路径的相对位置来表示,通常以 ./ 或 ../,其中

    • . :代表当前的目录
    • .. :代表上一层目录,即先返回上一层目录,再找到某某文件夹

    比如,执行shell时,会在终端输入 # ./xx.sh,就是表示执行当前目录的xx.sh文件。

    本文完。

    展开全文
  • linux 文件系统结构

    千次阅读 2008-03-12 15:23:00
    文件系统 转自:http://man.chinaunix.net/tech/lyceum/linuxK/fs/filesystem.html 本章主要描叙Linux核心对文件系统的支持, 虚拟文件系统(VFS)以及Linux核心对实际文件系统的支持。 Linux的最重要特征之一...

    文件系统

    转自:http://man.chinaunix.net/tech/lyceum/linuxK/fs/filesystem.html
    本章主要描叙Linux核心对文件系统的支持, 虚拟文件系统(VFS)以及Linux核心对实际文件系统的支持。

    Linux的最重要特征之一就是支持多种文件系统。这样它更加灵活并可以和许多其它种操作系统共存。在本文写作时Linux已经支持15种文件系统: ext,ext2,xia,minix,umsdos,msdos,vfat,proc,smb,ncp,iso9660,sysv,hpfs,affs 以及ufs。毫无疑问,今后支持的文件系统类型还将增加。

    Linux和Unix并不使用设备标志符(如设备号或驱动器名称)来访问独立文件系统,而是通过一个将整个文件系统表示成单一实体的层次树结构来访问它。 Linux每安装(mount)一个文件系统时都会其加入到文件系统层次树中。不管是文件系统属于什么类型,都被连接到一个目录上且此文件系统上的文件将 取代此目录中已存在的文件。这个目录被称为安装点或者安装目录。当卸载此文件系统时这个安装目录中原有的文件将再次出现。

    当磁盘初始化时(使用fdisk),磁盘中将添加一个描叙物理磁盘逻辑构成的分区结构。每个分区可以拥有一个独立文件系统如EXT2。文件系统将文件组织 成包含目录,软连接等存在于物理块设备中的逻辑层次结构。包含文件系统的设备叫块设备。Linux文件系统认为这些块设备是简单的线性块集合,它并不关心 或理解底层的物理磁盘结构。这个工作由块设备驱动来完成,由它将对某个特定块的请求映射到正确的设备上去;此块所在硬盘的对应磁道、扇区及柱面数都被保存 起来。不管哪个设备持有这个块,文件系统都必须使用相同的方式来寻找并操纵此块。Linux文件系统不管(至少对系统用户来说)系统中有哪些不同的控制器 控制着哪些不同的物理介质且这些物理介质上有几个不同的文件系统。文件系统甚至还可以不在本地系统而在通过网络连接的远程硬盘上。设有一个根目录内容如下 的SCSI硬盘:

    A         E         boot      etc       lib       opt       tmp       usr

    C F cdrom fd proc root var sbin

    D bin dev home mnt lost+found

    此时不管是用户还是程序都无需知道他们现在操纵的这些文件中的/C实际上是位于系统第一个IDE硬盘上并已安装VFAT文件系统。在此例中/E表示系统中第二个IDE控制器上的主IDE硬盘。至于第一个IDE控制器是PCI控制器和第二个则是控制IDE CDROM的ISA控制器无关紧要。当使用modem通过PPP网络协议来拨入网络时,可以将Alpha AXP Linux文件系统安装到/mnt/remote目录下。

    文件系统中的文件是数据的集合;包含本章内容的文件是一个名叫filesystems.tex的ASCII文件。文件系统不仅包含着文件中的数据而且还有 文件系统的结构。所有Linux用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。此外文件系统中必须包含安全信息以便保持操作系统的基 本完整性。没人愿意使用一个动不动就丢失数据和文件的操作系统。

    Linux最早的文件系统是Minix,它受限甚大且性能低下。其文件名最长不能超过14个字符(虽然比8.3 文件名要好)且最大文件大小为64M字节。64M字节看上去很大,但实际上一个中等的数据库将超过这个尺寸。 第一个专门为Linux设计的文件系统被称为扩展文件系统(Extended File System)或EXT。它出现于1992年四月,虽然能够解决一些问题但性能依旧不好。1993年扩展文件系统第二版或EXT2被设计出来并添加到 Linux中。它是本章将详细讨论的文件系统。

    将EXT文件系统添加入Linux产生了重大影响。每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS来通讯。

    VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS的通用接口。由于软件将Linux文件系统的所有细节进行了转换, 所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。 Linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。

    虚拟文件系统的设计目标是为Linux用户提供快速且高效的文件访问服务。同时它必须保证文件及其数据的正确性。这两个目标相互间可能存在冲突。当安装一个文件系统并使用时, Linux VFS为其缓存相关信息。此缓存中数据在创建、写入和删除文件与目录时如果被修改,则必须谨慎地更新文件系统中对应内容。 如果能够在运行核心内看到文件系统的数据结构, 那么就可以看到那些正被文件系统读写的数据块。描叙文件与目录的数据结构被不断的创建与删除而设备驱动将不停地读取与写入数据。这些缓存中最重要的是Buffer Cache,它被集成到独立文件系统访问底层块设备的例程中。当进行块存取时数据块首先将被放入Buffer Cache里并根据其状态保存在各个队列中。此Buffer Cache不仅缓存数据而且帮助管理块设备驱动中的异步接口。

    9.1  第二代扩展文件系统(EXT2)


    图9.1 EXT2文件系统的物理分布

    第二代扩展文件系统由Rey Card设计,其目标是为Linux提供一个强大的可扩展文件系统。它同时也是Linux界中设计最成功的文件系统。

    象很多文件系统一样, EXT2建立在数据被保存在数据块中的文件内这个前提下。这些数据块长度相等且这个长度可以变化,某个EXT2文件系统的块大小在创建(使用 mke2fs)时设置。 每个文件的大小和刚好大于它的块大小正数倍相等。如果块大小为1024字节而一个1025字节长的文件将占据两个1024字节大小的块。这样你不得不浪费 差不多一般的空间。我们通常需要在CPU的内存利用率和磁盘空间使用上进行折中。而大多数操作系统,包括Linux在内,为了减少CPU的工作负载而被迫 选择相对较低的磁盘空间利用率。并不是文件中每个块都包含数据,其中有些块被用来包含描叙此文件系统结构的信息。EXT2通过一个inode结构来描叙文 件系统中文件并确定此文件系统的拓扑结构。 inode结构描叙文件中数据占据哪个块以及文件的存取权限、文件修改时间及文件类型。EXT2文件系统中的每个文件用一个inode来表示且每个 inode有唯一的编号。文件系统中所有的inode都被保存在inode表中。 EXT2目录仅是一个包含指向其目录入口指针的特殊文件(也用inode表示)。

    图9.1给出了占用一系列数据块的EXT2文件系统的布局。对文件系统而言文件仅是一系列可读写的数据块。文件系统并不需要了解数据块应该放置到物理介质 上什么位置,这些都是设备驱动的任务。无论何时只要文件系统需要从包含它的块设备中读取信息或数据,它将请求底层的设备驱动读取一个基本块大小整数倍的数 据块。EXT2文件系统将它所使用的逻辑分区划分成数据块组。每个数据块组将那些对文件系统完整性最重要的信息复制出来, 同时将实际文件和目录看作信息与数据块。为了发生灾难性事件时文件系统的修复,这些复制非常有必要。以下一节将着重描叙每个数据块组的内容。

    9.1.1  The EXT2 Inode


    图9.2 EXT2 Inode

    在EXT2文件系统中inode是基本块;文件系统中的每个文件与目录由唯一的inode来描叙。每个数据块组的EXT2 inode被保存在inode表中, 同时还有一个位图被系统用来跟踪已分配和未分配的inode。图 9.2给出了EXT2 inode的格式,它包含以下几个域:

    mode
    它包含两类信息;inode描叙的内容以及用户使用权限。EXT2中的inode可以表示一个文件、目录、符号连接、块设备、字符设备或FIFO。
    Owner Information
    表示此文件或目录所有者的用户和组标志符。文件系统根据它可以进行正确的存取。
    Size
    以字节计算的文件尺寸。
    Timestamps
    inode创建及最后一次被修改的时间。
    Datablocks
    指向此inode描叙的包含数据的块指针。前12个指针指向包含由inode描叙的物理块, 最后三个指针包含多级间接指针。例如两级间接指针指向一块指针,而这些指针又指向一些数据块。这意味着访问文件尺寸小于或等于12个数据块的文件将比访问大文件快得多。

    EXT2 inode还可以描叙特殊设备文件。虽然它们不是真正的文件, 但可以通过它们访问设备。所有那些位于/dev中的设备文件可用来存取Linux设备。例如mount程序可把设备文件作为参数。

    9.1.2  EXT2 超块

    超块中包含了描叙文件系统基本尺寸和形态的信息。文件系统管理器利用它们来使用和维护文件系统。 通常安装文件系统时只读取数据块组0中的超块,但是为了防止文件系统被破坏, 每个数据块组都包含了复制拷贝。超块包含如下信息:

    Magic Number
    文件系统安装软件用来检验是否是一个真正的EXT2文件系统超块。当前EXT2版本中为0xEF53。
    Revision Level
    这个主从修订版本号让安装代码能判断此文件系统是否支持只存在于某个特定版本文件系统中的属性。同时它还是特性兼容标志以帮助安装代码判断此文件系统的新特性是否可以安全使用。
    Mount Count and Maximum Mount Count
    系统使用它们来决定是否应对此文件系统进行全面检查。每次文件系统安装时此安装记数将递增,当它等于最大安装记数时系统将显示一条警告信息“maxumal mount count reached, running e2fsck is recommended”。
    Block Group Number
    超块的拷贝。
    Block Size
    以字节记数的文件系统块大小,如1024字节。
    Blocks per Group
    每个组中块数目。当文件系统创建时此块大小被固定下来。
    Free Blocks
    文件系统中空闲块数。
    Free Inodes
    文件系统中空闲Inode数。
    First Inode
    文件系统中第一个inode号。EXT2根文件系统中第一个inode将是指向'/'目录的目录入口。

    9.1.3  EXT2 组标志符

    每个数据块组都拥有一个描叙它结构。象超块一样,所有数据块组中的组描叙符被复制到每个数据块组中以防文件系统崩溃。每个组描叙符包含以下信息:

     

    Blocks Bitmap 对应此数据块组的块分配位图的块号。在块分配和回收时使用。 Inode Bitmap 对应此数据块组的inode分配位图的块号。在inode分配和回收时使用。 Inode Table 对应数据块组的inode表的起始块号。每个inode用下面的EXT2 inode结构来表示。 Free blocks count, Free Inodes count, Used directory count

    组描叙符放置在一起形成了组描叙符表。每个数据块组在超块拷贝后包含整个组描叙符表。EXT2文件系统仅使用第一个拷贝(在数据块组0中)。其它拷贝都象超块拷贝一样用来防止主拷贝被破坏。

    9.1.4  EXT2 目录


    图9.3 EXT2目录

    在EXT2文件系统中目录是用来创建和包含文件系统中文件存取路径的特殊文件。图9.3给出了内存中的目录入口布局。

    目录文件是一组目录入口的链表,它们包含以下信息:

    inode 对应每个目录入口的inode。它被用来索引储存在数据块组的Inode表中的inode数组。 在图9.3中file文件的目录入口中有一个对inode号11的引用。 name length 以字节记数的目录入口长度。 name 目录入口的名称

    每个目录的前两个入口总是"."和".."。它们分别表示当前目录和父目录。

    9.1.5  在EXT2文件系统中搜寻文件

    Linux文件名的格式与Unix类似,是一系列以"/"隔开的目录名并以文件名结尾。/home/rusling/.cshrc中/home和 /rusling都是目录名而文件名为.cshrc。象Unix系统一样,Linux并不关心文件名格式本身,它可以由任意可打印字符组成。为了寻找 EXT2文件系统中表示此文件的inode,系统必须将文件名从目录名中分离出来。

    我们所需要的第一个inode是根文件系统的inode,它被存放在文件系统的超块中。为读取某个EXT2 inode, 我们必须在适当数据块组的inode表中进行搜寻。如果根inode号为42则我们需要数据块组0 inode表的第42个inode。此根inode对应于一个EXT2目录,即根inode的mode域将它描叙成目录且其数据块包含EXT2目录入口。 home目录是许多目录的入口同时此目录给我们提供了大量描叙/home目录的inode。我们必须读取此目录以找到rusling目录入口,此入口又提 供了许多描叙/home/rusling目录的inode。最后读取由/home/rusling目录描叙的inode指向的目录入口以找出.cshrc 文件的inode号并从中取得包含在文件中信息的数据块。

     

    9.1.6  改变EXT2文件系统中文件的大小

    文件系统普遍存在的一个问题是碎块化。一个文件所包含的数据块遍布整个文件系统,这使得对文件数据块的顺序访问越来越慢。EXT2文件系统试图通过分配一 个和当前文件数据块在物理位置上邻接或者至少位于同一个数据块组中的新块来解决这个问题。只有在这种分配策略失败时才在其它数据块组中分配空间。

    当进程准备写某文件时, Linux文件系统首先检查数据是否已经超出了文件最后一个被分配的块空间。如果是则必须为此文件分配一个新数据块。进程将一直等待到此分配完成;然后将 其余数据写入此文件。EXT2块分配例程所作的第一件事是对此文件系统的EXT2超块加锁。这是因为块分配和回收将导致超块中某些域的改变,Linux文 件系统不能在同一时刻为多个进程进行此类服务。如果另外一个进程需要分配更多的数据块时它必须等到此进程完成分配操作为止。 在超块上等待的进程将被挂起直到超块的控制权被其当前使用者释放。对超块的访问遵循先来先服务原则,一旦进程取得了超块的控制则它必须保持到操作结束为 止。如果系统中空闲块不多则此分配的将失败,进程会释放对文件系统超块的控制。

    如果EXT2文件系统被设成预先分配数据块则我们可以从中取得一个。预先分配块实际上并不存在,它们仅仅包含在已分配块的位图中。我们试图为之分配新数据 块文件所对应的VFS inode包含两个EXT2特殊域:prealloc_block和prealloc_count,它们分别代表第一个预先分配数据块的块号以及各自的数 目。如果没有使用预先分配块或块预先分配数据块策略,则EXT2文件系统必须分配一个新块。它首先检查此文件最后一个块后的数据块是否空闲。从逻辑上来说 这是让其顺序访问更快的最有效块分配策略。如果此块已被使用则它会在理想块周围64个块中选择一个。这个块虽然不是最理想但和此文件的其它数据块都位于同 一个数据块组中。

    如果此块还是不空闲则进程将在所有其它数据块组中搜寻,直到找到一空闲块。块分配代码将在某个数据块组中寻找一个由8个空闲数据块组成的簇。如果找不到那 么它将取更小的尺寸。如果使用了块预先分配则它将更新相应的prealloc_block和prealloc_count。

    找到空闲块后块分配代码将更新数据块组中的位图并在buffer cache中为它分配一个数据缓存。这个数据缓存由文件系统支撑设备的标志符以及已分配块的块号来标志。缓存中的数据被置0且缓存被标记成dirty以显 示其内容还没有写入物理磁盘。最后超块也被标记为dirty以表示它已被更新并解锁了。如果有进程在等待这个超块则队列中的第一个进程将得到运行并取得对 超块的独占控制。如果数据块被填满则进程的数据被写入新数据块中,以上的整个过程将重复且另一个数据块被分配。

    9.2  虚拟文件系统(VFS)


    图9.4 虚拟文件系统的逻辑示意图

    图9.4给出了Linux核心中虚拟文件系统和实际文件系统间的关系。此虚拟文件系统必须能够管理在任何时刻mount到系统的不同文件系统。它通过维护一个描叙整个虚拟文件系统和实际已安装文件系统的结构来完成这个工作。

    容易让人混淆的是VFS使用了和EXT2文件系统类似的方式:超块和inode来描叙文件系统。象EXT2 inode一样 VFS inode描叙系统中的文件和目录以及VFS中的内容和拓扑结构。从现在开始我将用VFS inode和VFS超块来将它们和EXT2 inode和超块进行区分。

    文件系统初始化时将其自身注册到VFS中。它发生在系统启动和操作系统初始化时。这些实际文件系统可以构造到核心中也可以设计成可加载模块。文件系统模块 可以在系统需要时进行加载,例如VFAT就被实现成一个核心模块,当mount VFAT文件系统时它将被加载。mount一个基于块设备且包含根文件系统的文件系统时,VFS必须读取其超块。每个文件系统类型的超块读取例程必须了解 文件系统的拓扑结构并将这些信息映射到VFS超块结构中。VFS在系统中保存着一组已安装文件系统的链表及其VFS超块。每个VFS 超块包含一些信息以及一个执行特定功能的函数指针。例如表示一个已安装EXT2文件系统的超块包含一个指向EXT2相关inode读例程的指针。这个 EXT2 inode读例程象所有文件系统相关读例程一样填充了VFS inode中的域。每个VFS超块包含此文件系统中第一个VFS inode的指针。对于根文件系统此inode表示的是"/"目录。这种信息映射方式对EXT2文件系统非常有效但是对其它文件系统要稍差。

    系统中进程访问目录和文件时将使用系统调用遍历系统的VFS inode。

    例如键入ls或cat命令则会引起虚拟文件系统对表示此文件系统的VFS inode的搜寻。由于系统中每个文件与目录都使用一个VFS inode来表示,所以许多inode会被重复访问。这些inode被保存在inode cache中以加快访问速度。如果某个inode不在inode cache中则必须调用一个文件系统相关例程来读取此inode。对这个inode 的读将把此它放到inode cache中以备下一次访问。不经常使用的VFS inode将会从cache中移出。

    所有Linux文件系统使用一个通用buffer cache来缓冲来自底层设备的数据以便加速对包含此文件系统的物理 设备的存取。

    这个buffer cache与文件系统无关并被集成到Linux核心分配与读写数据缓存的机制中。让Linux文件系统独立于底层介质和设备驱动好处很多。所有的块结构设 备将其自身注册到Linux核心中并提供基于块的一致性异步接口。象SCSI设备这种相对复杂的块设备也是如此。当实际文件系统从底层物理磁盘读取数据 时,块设备驱动将从它们所控制的设备中读取物理块。buffer cache也被集成到了块设备接口中。 当文件系统读取数据块时它们将被保存在由所有文件系统和Linux核心共享的全局buffer cache中。这些buffer由其块号和读取设备的设备号来表示。所以当某个数据块被频繁使用则它很可能能从buffer cache而不是磁盘中读取出来,后者显然将花费更长的时间。有些设备支持通过预测将下一次可能使用的数据提前读取出来。

    VFS还支持一种目录cache以便对经常使用的目录对应的inode进行快速查找。我们可以做一个这样的实验,首先我们对一个最近没有执行过列目录操作 的目录进行列目录操作。第一次列目录时你可能发现会有较短的停顿但第二次操作时结果会立刻出现。目录cache不存储目录本身的inode;这些应该在 inode cache中,目录cache 仅仅保存全目录名和其inode号之间的映射关系。

    9.2.1  VFS 超块

    每个已安装的文件系统由一个VFS超块表示;它包含如下信息:

    Device
    表示文件系统所在块设备的设备标志符。例如系统中第一个IDE硬盘的设备标志符为0x301。
    Inode pointers
    这个mounted inode指针指向文件系统中第一个inode。而covered inode指针指向此文件系统安装目录的inode。根文件系统的VFS超块不包含covered指针。
    Blocksize
    以字节记数的文件系统块大小,如1024字节。
    Superblock operations
    指向此文件系统一组超块操纵例程的指针。这些例程被VFS用来读写inode和超块。
    File System type
    这是一个指向已安装文件系统的file_system_type结构的指针。
    File System specific
    指向文件系统所需信息的指针。

    9.2.2  The VFS Inode

    和EXT2文件系统相同,VFS中的每个文件、目录等都用且只用一个VFS inode表示。每个VFS inode中的信息通过文件系统相关例程从底层文件系统中得到。VFS inode仅存在于核心内存并且保存只要对系统有用,它们就会被保存在在VFS inode cache中。每个VFS inode包含下列域:

    device 包含此文件或此VFS inode代表的任何东西的设备的设备标志符。 inode number 文件系统中唯一的inode号。在虚拟文件系统中device和inode号的组合是唯一的。 mode 和EXT2中的相同, 表示此VFS inode的存取权限。 user ids 所有者的标志符。 times VFS inode 创建、修改和写入时间。 block size 以字节计算的文件块大小,如1024字节。 inode operations 指向一组例程地址的指针。这些例程和文件系统相关且对此inode执行操作,如截断此inode表示的文件。 count 使用此VFS inode的系统部件数。一个count为0的inode可以被自由的丢弃或重新使用。 lock 用来对某个VFS inode加锁,如用于读取文件系统时。 dirty 表示这个VFS inode是否已经被写过,如果是则底层文件系统需要更新。 file system specific information

    9.2.3  注册文件系统


    图9.5 已注册文件系统

    当重新建立Linux核心时安装程序会询问是否需要所有可支持的文件系统。核心重建时文件系统启动代码包含了所有那些编入核心的文件系统的初始化例程。

    Linux文件系统可构造成模块, 此时它们会仅在需要时加载或者使用insmod来载入。当文件系统模块被加载时, 它将向核心注册并在卸载时撤除注册。每个文件系统的初始化例程还将向虚拟文件系统注册,它用一个包含文件系统名称和指向其VFS超块读例程的指针的 file_system_type结构表示。每个file_system_type结构包含下列信息:

    Superblock read routine
    此例程载文件系统的一个实例被安装时由VFS调用。
    File System name
    文件系统的名称如ext2。
    Device needed
    文件系统是否需要设备支持。并不是所有的文件系统都需要设备来保存它。例如/proc文件系统不需要块设备支持。

    你可以通过查阅/proc/filesystems可找出已注册的文件系统,如:

          ext2

    nodev proc

    iso9660

    9.2.4  安装文件系统

    当超级用户试图安装一个文件系统时,Linux核心首先使系统调用中的参数有效化。尽管mount程序会做一些基本的检查, 但是它并不知道核心构造时已经支持那些文件系统,同时那些建议的安装点的确存在。看如下的一个mount命令:

    $ mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom

    mount命令将传递三个参数给核心:文件系统名,包含文件系统的物理块设备以及此新文件系统要安装到的已存在的目录名。

    虚拟文件系统首先必须做的是找到此文件系统。它将通过由链指针file_systems指向的file_system_type结 构来在所有已知文件系统中搜寻。

    如果找到了一个相匹配的文件系统名,那么它就知道核心支持此文件系统并可得到读取此文件系统超块相关例程的指针。如果找不到,但文件系统使用了可动态加载核心模块,则操作仍可继续。此时核心将请求核心后台进程加载相应的文件系统模块。

    接下来如果由mount传递的物理设备还没有安装, 则必须找到新文件系统将要安装到的那个目录的VFS inode。 这个VFS inode可能在inode cache中也可能在支撑这个安装点所在文件系统的块设备中。一旦找到这个inode则将对它进行检查以确定在此目录中是否已经安装了其它类型的文件系统。多个文件系统不能使用相同目录作为安装点。

    此时VFS安装代码必须分配一个VFS超块并将安装信息传递到此文件系统的超块读例程中。系统中所有的VFS 超块都被保存在由super_block结构构成的super_blocks数组中, 并且对应此安装应有一个这种结构。超块读 例程将基于这些从物理设备中读取的信息来填充这些VFS超块域。对于EXT2文件系统此信息的转化过程十分 简便,仅需要读取EXT2超块并填充VFS超块。但其它文件系统如MS-DOS文件系统就不那么容易了。不管哪种文件系统,对VFS超块的填充意味着文件 系统必须从支持它的块设备中读取描叙它的所有信息。如果块设备驱动不能从中读取或不包含这种类型文件系统则mount命令会失败。


    图9.6 一个已安装的文件系统

    每个文件系统用一个vfsmount结构来描叙。如图9.6所示。它们被排入由vfsmntlist指向的的链表中。

    另外一个指针:vfsmnttail指向链表的最后一个入口, 同时mru_vfsmnt指针指向最近使用最多的文件系统。 每个vfsmount结构中由以下部分组成:包含此文件系统的块设备的设备号,此文件系统安装的目录以及文件 系统安装时分配的VFS超块指针。VFS超块指向这种类型文件系统和此文件系统根inode的file_system_type结构。一旦此文件系统被加载, 这个inode将一直驻留在VFS inod cache中。

    9.2.5  在虚拟文件系统中搜寻文件

    为了在虚拟文件系统中找到某个文件的VFS inode,VFS必须依次解析此文件名字中的间接目录直到找到此VFS inode。每次目录查找包括一个对包含在表示父目录VFS inode中的查找函数的调用。由于我们总是让每个文件系统的根可用并且由此系统的VFS 超块指向它,所以这是一个可行方案。每次在实际文件系统中寻找inode 时,文件系统将在目录cache中寻找相应目录。如果在目录cache中无相应入口则文件系统必须从底层文件系统或inode cache中取得此VFS inode。

    9.2.6  Creating a File in the Virtual File System

    9.2.7  卸载文件系统

    如果已安装文件系统中有些文件还在被系统使用则不能卸载此文件系统。例如有进程使用/mnt/cdrom或其子目录时将不能卸载此文件系统。如果将要卸载 的文件系统中有些文件还在被使用,那么在VFS inode cache中有与其对应的VFS inode。通过在inode链表中查找此文件系统占用设备的inode来完成此工作。对应此已安装文件系统的VFS超块为dirty,表示它已被修改过 所以必须写回到磁盘的文件系统中。一旦写入磁盘,VFS超块占用的内存将归还到核心的空闲内存池中。最后对应的vfsmount结构将从 vfsmntlist中释放。

    9.2.8  The VFS Inode Cache

    操纵已安装文件系统时,它们的VFS inode将被连续读写。虚拟文件系统通过维护一个inode cache来加速对所有已安装文件系统的访问。每次VFS inode都可从inode cache中读取出来以加速对物理设备的访问。

    VFS inode cache以散列表形式实现,其入口时指向具有相同散列值的VFS inode链表。每个inode的散列值可通过包含此文件系统的底层物理设备标志符和inode号计算出来。每当虚拟文件系统访问一个inode时,系统 将首先在VFS inode cache中查找。为了在cache中寻找inode,系统先计算出其散列值然后将其作为inode散列表的索引。这样将得到指向一系列相同散列值的 inode链表。然后依次读取每个inode直到找到那个具有相同inode号以及设备标志符的inode为止。

    如果在cache中找到了此inode则它的count值递增以表示用户增加了一个,同时文件操作将继续进行。否则必须找到一个空闲VFS inode以便文件系统能从内存中读取此inode。VFS有许多种选择来取得空闲inode。如果系统可以分配多个VFS inode则它将按如下步骤进行:首先分配核心页面并将其打碎成新的空闲inode并将其放入inode链表中。系统所有的VFS inode都被放到由first_inode指向的链表和inode散列表中。如果系统已经拥有所有inode, 则它必须找到便于重新使用的inode。那些inode最好count记数为0;因为这种inode没有谁在使用。很重要的VFS inode,如文件系统的根inode,其count 域总是大于0,所以它所使用的inode是不能被重新使用的。一旦找到可重用inode则应清除之: 其VFS inode可能为dirty,必须要写入到文件系统中或者需要加锁,此时系统必须等到解锁时才能继续运行。

    找到新的VFS inode后必须调用文件系统相关例程使用从底层实际文件系统中读出的内容填充它。在填充过程 中,此新VFS inode的count记数为1并被加锁以排斥其它进程对它的使用直到此inode包含有效信息为止。

    为了取得真正需要的VFS inode,文件系统可能需要存取几类其它inode。我们读取一个目录时虽然只需要最后一级目录但是所有的中间目录也被读了出来。由于使用了VFS inode cache,较少使用的inode将被丢弃而较多使用的inode将保存在cache中。

    9.2.9  目录 Cache

    为了加速对常用目录的访问,VFS维护着一个目录入口cache。

    当在实际文件系统寻找目录时,有关此目录的细节将被存入目录cache中。当再次寻找此目录时,例如在此目录中列文件名或打开文件,则这些信息就可以在目录cache中找到。在实际实现中只有短目录入口(最多15个字 符)被缓存,这是因为那些较短目录名的目录正是使用最频繁的。例如/usr/X11R6/bin这个短目录经常被X server所使用。

    目录cache也由散列表组成,每个入口指向具有相同散列值的目录cache人口链表。散列函数使用包含此文件系统的设备号以及目录名称来计算在此散列表中的偏移值或者索引值, 这样能很快找到被缓存的目录。 如果在cache中的搜寻消耗的时间太长或者甚至没有找到则使用此cache用处不大。

    为了保证cache的有效性和及时更新,VFS保存着一个最近最少使用(LRU)的目录cache人口链表。当首次查找此目录时其目录入口被首次放入 cache中并添加到第一级LRU链表的尾部。在已经充满的cache 中它代替位于LRU链表最前端的现存入口。此目录入口被再次使用时它将被放到第二级LRU cache链表的最后。此时需要将位于第二级LRU cache链表的最前端的那个替换掉。入口在链表前端的唯一原因是它们已经很久没被访问过了。如果被访问过那么它们将位于此链表的尾部附近。位于第二级 LRU cache链表中的入口要比位于第一级LRU cache链表中的安全一些。

    9.3  The Buffer Cache


    图9.7 Buffer Cache示意图

    操纵已安装文件系统将产生大量对此块设备的读写请求。这些块读写请求都是通过标准核心例程调用以buffer_head结构形式传递到设备 驱动中。它们提供了设备驱动所需的所有信息:表示设备的设备标志符以及请求的块号。所有块设备都被看成相同块大小的线性块集合。为了加速对物理块设备的访 问,Linux 使用了一个块buffer cache。系统中全部的块缓冲,包括那些没使用过的新缓冲都保存在此buffer cache中。这个cache被多个物理块设备共享;任何时刻此cache中都有许多属于不同系统块设备且状态不同的块缓冲。如果有效数据可以从 buffer cache中找到则将节省大量访问物理设备的时间。任何对块设备读写的块缓冲都被放入此cache中。随时间的变化有些块缓冲可能将会被此cache中删 除以为更需要它的缓冲腾出空间,如果它被频繁使用则可以一直保存在此cache中。

    此cache中的块缓冲由设备标志符以及缓冲对应的块号来唯一的表示。它由两个功能部分组成。其一是空闲块缓冲链表。它为每个可支持的块大小提供了一个链 表并且系统中的空闲块缓冲在创建或者被丢弃时都被排入此链表中。当前可支持的块大小为512、1024、2048、4096与8192字节。其二是 cache自身。它是用一组指向具有相同散列索引值的缓冲链的散列表。这个散列索引值通过其自身的设备标志符与数据块设备的块号来产生。图9.7给出了一 个带有一些入口的散列表。块缓冲要么在空闲链表中要么在此buffer cache中。如果在buffer cache中则它们按照最近最少使用(LRU)链表来排列。 对于每种缓冲类型都有一个LRU链表,系统使用它们来对某种缓冲进行操作,如将带新数据的缓冲写入到磁盘上。缓冲的类型表示其当前状态,Linux现在支 持以下集中类型:

    clean 未使用的新缓冲 locked 等待写入且加锁的缓冲 dirty dirty缓冲。它们包含新的有效数据,但目前没被调度执行写操作。 shared 共享缓冲 unshared 以前被共享但现在没有被共享的缓冲

    当文件系统需要从其底层物理设备读取一个缓冲块时,它将首先在buffer cache里寻找。如果在此buffer cache中找不到则它将从适当大小的空闲链表中取得一个clean状态的节点, 同时将新缓冲添加到buffer cache 中去。如果所需的缓冲位于buffer cache中,那么它可能已经或没有更新。如果没有被更新或者它为新块则文件系统必须请求相应的数据驱动从磁盘中读取该数据块。

    为了让此buffer cache运行更加有效并且在使用此buffer cache的块设备之间合理的分配cache入口,系统必须对其进行维护。Linux使用bdflush核心后台进行来对此cache执行许多琐碎工作,但有时作为使用cache 的结构自动进行。

    9.3.1  bdflush 核心后台进程

    bdflush是对过多的dirty缓冲系统提供动态响应的简单核心后台进程;这些缓冲块中包含必须被写入到硬盘上的数据。它在系统启动时作为一个核心线 程运行,其名字叫"kflushd"。你可以使用ps命令看到此系统进程。通常情况下此进程一直在睡眠直到系统中的dirty缓冲数目增大到一定数目。当 分配与丢弃缓冲时,系统中dirty缓冲的数目将做一个统计。如果其数目超过某个数值则唤醒bdflush进程。缺省的阀值为60%, 但是如果系统急需缓冲则任何时刻都可能唤醒bdflush。使用update命令可以看到和改变这个数值。



    # update -d



    bdflush version 1.4

    0: 60 Max fraction of LRU list to examine for dirty blocks

    1: 500 Max number of dirty blocks to write each time bdflush activated

    2: 64 Num of clean buffers to be loaded onto free list by refill_freelist

    3: 256 Dirty block threshold for activating bdflush in refill_freelist

    4: 15 Percentage of cache to scan for free clusters

    5: 3000 Time for data buffers to age before flushing

    6: 500 Time for non-data (dir, bitmap, etc) buffers to age before flushing

    7: 1884 Time buffer cache load average constant

    8: 2 LAV ratio (used to determine threshold for buffer fratricide).



    但有数据写入缓冲使之变成dirty时,所有的dirty缓冲被连接到一个BUF_DIRTY LRU链表中,bdflush会将适当数目的缓冲块写到磁盘上。这个数值的缺省值为500。

    9.3.2  update进程

    update命令不仅仅是一个命令;它还是一个后台进程。当作为超级用户运行时(在系统初始化时)它将周期性调用系统服务例程将老的dirty缓冲冲刷到磁盘上去。它所完成的这个工作与bdflush类似。当一个dirty缓冲完成此操作后, 它将把本应写入到各自磁盘上的时间标记到其中。update每次运行时它将在系统的所有dirty缓冲中查找那些冲刷时间已过期的。这些过期缓冲都被写入到磁盘。

    9.4  /proc文件系统

    /proc文件系统真正显示了Linux虚拟文件系统的能力。事实上它并不存在-不管时/proc目录还是其子目录和文件都不真正的存在。但是我们是如何 能够执行cat /proc/devices命令的?/proc文件系统象一个真正的文 件系统一样将向虚拟文件系统注册。然而当有对/proc中的文件和目录的请求发生时, VFS系统将从核心中的数据中临时构造这些文件和目录。例如核心的/proc/devices文件是从描叙其设备的内核数据结构中产生出来。/proc文 件系统提供给用户一个核心内部工作的可读窗口。几个Linux子系统,如在modules一章描叙的Linux核心模块都在/proc文件系统中创建入口。

     

    9.5  设备特殊文件

    和所有Unix版本一样Linux将硬件设备看成特殊的文件。如/dev/null表示一个空设备。设备文件不使用文件 系统中的任何数据空间,它仅仅是对设备驱动的访问入口点。EXT2文件系统和Linux VFS都将设备文件实现成特殊的inode类型。有两种类型的设备文件:字符与块设备特殊文件。在核心内部设备驱动实现了类似文件的操作过程:我们可以对 它执行打开、关闭等工作。字符设备允许以字符模式进行I/O操作而块设备的I/O操作需要通过buffer cache。当对一个设备文件发出的I/O请求将被传递到相应的设备驱动。常常这种设备文件并不是一个真正的设备驱动而仅仅是一个伪设备驱动,如SCSI 设备驱动层。设备文件通过表示设备类型的主类型标志符和表示单元或主类型实例的从类型来引用。例如在系统中第一个IDE控制器上的IDE硬盘的主设备号为 3而其第一个分区的从标志符为1。所以执行ls -l /dev/hda1将有如下结果:

    $ brw-rw----   1 root    disk       3,    1  Nov 24  15:09 /dev/hda1

    在核心内部每个设备由唯一的kdev_t结构来表示,其长度为两字节,首字节包含从设备号而尾字节包含主设备号。 上例中的核心IDE设备为0x0301。表示块或者字符设备的EXT2 inode在其第一个直接块指针包含了设备的主从设备号。当VFS读取它时,表示它的VFS inode结构的i_rdev域被设置成相应的设备标志符。

     
    展开全文
  • Linux 文件系统结构介绍

    千次阅读 2019-03-08 23:54:03
    Linux 文件系统结构介绍 Linux中的文件是什么?它的文件系统又是什么?那些配置文件又在哪里?我下载好的程序保存在哪里了?在 Linux 中文件系统是标准结构的吗?好了,上图简明地阐释了Linux文件系统的层次关系...

    Linux 文件系统结构介绍

    Linux中的文件是什么?它的文件系统又是什么?那些配置文件又在哪里?我下载好的程序保存在哪里了?在 Linux 中文件系统是标准结构的吗?好了,上图简明地阐释了Linux的文件系统的层次关系。当你苦于寻找配置文件或者二进制文件的时候,这便显得十分有用了。我在下方添加了一些解释以及例子,不过“篇幅较长,可以有空再看”。

    Linux 文件系统结构介绍

     另外一种情况便是当你在系统中获取配置以及二进制文件时,出现了不一致性问题,如果你是在一个大型组织中,或者只是一个终端用户,这也有可能会破坏你的系统(比如,二进制文件运行在旧的库文件上了)。若然你在你的Linux系统上做安全审计的话,你将会发现它很容易遭到各种攻击。所以,保持一个清洁的操作系统(无论是Windows还是Linux)都显得十分重要。

    Linux的文件是什么?

    对于UNIX系统来说(同样适用于Linux),以下便是对文件简单的描述:

    在UNIX系统中,一切皆为文件;若非文件,则为进程

    这种定义是比较正确的,因为有些特殊的文件不仅仅是普通文件(比如命名管道和套接字),不过为了让事情变的简单,“一切皆为文件”也是一个可以让人接受的说法。Linux系统也像UNIX系统一样,将文件和目录视如同物,因为目录只是一个包含了其他文件名的文件而已。程序、服务、文本、图片等等,都是文件。对于系统来说,输入和输出设备,基本上所有的设备,都被当做是文件。

    题图版本历史:

    • Version 2.0 – 17-06-2015
      • – Improved: 添加标题以及版本历史
      • – Improved: 添加/srv,/meida和/proc
      • – Improved: 更新了反映当前的Linux文件系统的描述
      • – Fixed: 多处的打印错误
      • – Fixed: 外观和颜色
    • Version 1.0 – 14-02-2015
      • – Created: 基本的图表
      • – Note: 摒弃更低的版本

    下载链接

    以下是大图的下载地址。如果你需要其他格式,请跟原作者联系,他会尝试制作并且上传到某个地方以供下载

    注意: PDF格式文件是打印的最好选择,因为它画质很高。

    Linux 文件系统描述

    为了有序地管理那些文件,人们习惯把这些文件当做是硬盘上的有序的树状结构,正如我们熟悉的’MS-DOS’(磁盘操作系统)就是一个例子。大的分枝包括更多的分枝,分枝的末梢是树的叶子或者普通的文件。现在我们将会以这树形图为例,但晚点我们会发现为什么这不是一个完全准确的一幅图。

    目录 描述
    / 主层次 的根,也是整个文件系统层次结构的根目录
    /bin 存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat、ls、cp等等
    /boot 存放引导加载程序文件,例如kernels、initrd等
    /dev 存放必要的设备文件,例如/dev/null
    /etc 存放主机特定的系统级配置文件。其实这里有个关于它名字本身意义上的的争议。在贝尔实验室的UNIX实施文档的早期版本中,/etc表示是“其他(etcetera)目录”,因为从历史上看,这个目录是存放各种不属于其他目录的文件(然而,文件系统目录标准 FSH 限定 /etc 用于存放静态配置文件,这里不该存有二进制文件)。早期文档出版后,这个目录名又重新定义成不同的形式。近期的解释中包含着诸如“可编辑文本配置”或者“额外的工具箱”这样的重定义
    /etc/opt 存储着新增包的配置文件 /opt/.
    /etc/sgml 存放配置文件,比如 catalogs,用于那些处理SGML(译者注:标准通用标记语言)的软件的配置文件
    /etc/X11 X Window 系统11版本的的配置文件
    /etc/xml 配置文件,比如catalogs,用于那些处理XML(译者注:可扩展标记语言)的软件的配置文件
    /home 用户的主目录,包括保存的文件,个人配置,等等
    /lib /bin/ 和 /sbin/中的二进制文件的必需的库文件
    /lib<架构位数> 备用格式的必要的库文件。 这样的目录是可选的,但如果他们存在的话肯定是有需要用到它们的程序
    /media 可移动的多媒体(如CD-ROMs)的挂载点。(出现于 FHS-2.3)
    /mnt 临时挂载的文件系统
    /opt 可选的应用程序软件包
    /proc 以文件形式提供进程以及内核信息的虚拟文件系统,在Linux中,对应进程文件系统(procfs )的挂载点
    /root 根用户的主目录
    /sbin 必要的系统级二进制文件,比如, init, ip, mount
    /srv 系统提供的站点特定数据
    /tmp 临时文件 (另见 /var/tmp). 通常在系统重启后删除
    /usr 二级层级存储用户的只读数据; 包含(多)用户主要的公共文件以及应用程序
    /usr/bin 非必要的命令二进制文件 (在单用户模式中不需要用到的);用于所有用户
    /usr/include 标准的包含文件
    /usr/lib 库文件,用于/usr/bin/ 和 /usr/sbin/中的二进制文件
    /usr/lib<架构位数> 备用格式库(可选的)
    /usr/local 三级层次 用于本地数据,具体到该主机上的。通常会有下一个子目录, 比如, bin/, lib/, share/.
    /usr/local/sbin 非必要系统的二进制文件,比如用于不同网络服务的守护进程
    /usr/share 架构无关的 (共享) 数据.
    /usr/src 源代码,比如内核源文件以及与它相关的头文件
    /usr/X11R6 X Window系统,版本号:11,发行版本:6
    /var 各式各样的(Variable)文件,一些随着系统常规操作而持续改变的文件就放在这里,比如日志文件,脱机文件,还有临时的电子邮件文件
    /var/cache 应用程序缓存数据. 这些数据是由耗时的I/O(输入/输出)的或者是运算本地生成的结果。这些应用程序是可以重新生成或者恢复数据的。当没有数据丢失的时候,可以删除缓存文件
    /var/lib 状态信息。这些信息随着程序的运行而不停地改变,比如,数据库,软件包系统的元数据等等
    /var/lock 锁文件。这些文件用于跟踪正在使用的资源
    /var/log 日志文件。包含各种日志。
    /var/mail 内含用户邮箱的相关文件
    /var/opt 来自附加包的各种数据都会存储在 /var/opt/.
    /var/run 存放当前系统上次启动以来的相关信息,例如当前登入的用户以及当前运行的daemons(守护进程).
    /var/spool 该spool主要用于存放将要被处理的任务,比如打印队列以及邮件外发队列
    /var/mail 过时的位置,用于放置用户邮箱文件
    /var/tmp 存放重启后保留的临时文件

    Linux的文件类型

    大多数文件仅仅是普通文件,他们被称为regular文件;他们包含普通数据,比如,文本、可执行文件、或者程序、程序的输入或输出等等

    虽然你可以认为“在Linux中,一切你看到的皆为文件”这个观点相当保险,但这里仍有着一些例外。

    • 目录:由其他文件组成的文件
    • 特殊文件:用于输入和输出的途径。大多数特殊文件都储存在/dev中,我们将会在后面讨论这个问题。
    • 链接文件:让文件或者目录出现在系统文件树结构上多个地方的机制。我们将详细地讨论这个链接文件。
    • (域)套接字:特殊的文件类型,和TCP/IP协议中的套接字有点像,提供进程间网络通讯,并受文件系统的访问控制机制保护。
    • 命名管道 : 或多或少有点像sockets(套接字),提供一个进程间的通信机制,而不用网络套接字协议。

    现实中的文件系统

    对于大多数用户和常规系统管理任务而言,“文件和目录是一个有序的类树结构”是可以接受的。然而,对于电脑而言,它是不会理解什么是树,或者什么是树结构。

    每个分区都有它自己的文件系统。想象一下,如果把那些文件系统想成一个整体,我们可以构思一个关于整个系统的树结构,不过这并没有这么简单。在文件系统中,一个文件代表着一个inode(索引节点),这是一种包含着构建文件的实际数据信息的序列号:这些数据表示文件是属于谁的,还有它在硬盘中的位置。

    每个分区都有一套属于他们自己的inode,在一个系统的不同分区中,可以存在有相同inode的文件。

    每个inode都表示着一种在硬盘上的数据结构,保存着文件的属性,包括文件数据的物理地址。当硬盘被格式化并用来存储数据时(通常发生在初始系统安装过程,或者是在一个已经存在的系统中添加额外的硬盘),每个分区都会创建固定数量的inode。这个值表示这个分区能够同时存储各类文件的最大数量。我们通常用一个inode去映射2-8k的数据块。当一个新的文件生成后,它就会获得一个空闲的inode。在这个inode里面存储着以下信息:

    • 文件属主和组属主
    • 文件类型(常规文件,目录文件……)
    • 文件权限
    • 创建、最近一次读文件和修改文件的时间
    • inode里该信息被修改的时间
    • 文件的链接数(详见下一章)
    • 文件大小
    • 文件数据的实际地址

    唯一不在inode的信息是文件名和目录。它们存储在特殊的目录文件。通过比较文件名和inode的数目,系统能够构造出一个便于用户理解的树结构。用户可以通过ls -i查看inode的数目。在硬盘上,inodes有他们独立的空间。

    本文转自:https://linux.cn/article-6132-1.html

    展开全文
  • unix/linux 文件系统结构浅析

    千次阅读 2018-11-07 21:24:18
    一、物理磁盘到文件系统 ...这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。 2) i-节点表。超级块的下一个部分就是i-节点表,每个...

    一、物理磁盘到文件系统

    文件系统用来存储文件内容、文件属性、和目录。这些类型的数据如何存储在磁盘块上的呢?unix/linux使用了一个简单的方法。如图所示.

    它将磁盘块分为三个部分:
    1)超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。
    2) i-节点表。超级块的下一个部分就是i-节点表,每个文件都有一些属性,如文件的大小、文件所有者、和创建时间等,这些性质被记录在一个称为i-节点的结构中。所有i-节点都有相同的大小,并且i-节点表是这些结构的一个列表,文件系统中每个文件在该表中都有一个i-节点。
    3)数据区。文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独立的磁盘块中.

    二、创建一个文件的过程
    我们现在知道文件的内容和属性是分开存放的,那么又是如何管理它们的呢?现在我们以创建一个文件为例来讲解。在命令行输入命令:
    $ who > userlist
    当完成这个命令时。文件系统中增加了一个存放命令who输出内容的新文件,那么这整个过程到底是怎么回事呢?
    文件的属性和内容:内核将文件内容存放在数据区,文件属性存放在i-节点,文件名存放在目录。图2显示了创建一个文件的例子,假如这个新文件要3 个存储块来存放内容。

    包括如下四个步骤:

    1)存储属性 也就是文件属性的存储,内核先找到一块空的i-节点。图2中。内核找到i-节点号47。内核把文件的信息记录其中。如文件的大小、文件所有者、和创建时间等
    2)存储数据 即文件内容的存储,由于该文件需要3个数据块。因此内核从自由块的列表中找到3个自由块。图2中分别为627、200、992,内核缓冲区的第一块数据复制到块627,第二和第三分别复制到200和992.
    3)记录分配情况,数据保存到了三个数据块中。所以必须要记录起来,以后再找到正确的数据。分配情况记录在文件的i-节点中的磁盘序号列表里。这3个编号分别放在最开始的3个位置。
    4)添加文件名到目录,新文件的名字是userlist,   内核将文件的入口(47,userlist)添加到目录文件里。文件名和i-节点号之间的对应关系将文件名和文件和文件的内容属性连接起来,找到文件名就找到文件的i-节点号,通过i-节点号就能找到文件的属性和内容。

    三、创建一个目录的过程

    前面说了创建一个文件的大概过程,那么创建一个目录时又是怎么回事呢?
    我们知道,目录其实也是文件,只是它的内容比较特殊:包含文件名字列表,列表一般包含两个部分:i-节点号和文件名。所以它的创建过程和文件创建过程一样,只是第二步写的内容不同。一个目录创建时至少包括两个链接:“.”,“..”
    我们可以通过系统命令来查看目录的内容:#ls -lia

       

    上图的结果是文件名和对应的i-节点号,其中“.”表示是当前目录,而“..”是当前目录的父目录。但也有特殊情况,我们查看根目录的情况:

    [root@localhost ~]# ls -i1a /
    2 .
    2 ..
    98305 .autofsck
    1310721 backup
    我们发现“.”和“..”都指向i-节点2.实际上当用mkfs创建一个文件系统时,mkfs会将根目录的父目录指向自己
    

    四、如果有大文件如何实现
    文件内容的分配情况是必须记录在i-节点的磁盘序号列表里的。但是i-节点只包含一个最多含有13个项的分配链表,如果分配的数据块超过13个块时怎么办?
    Linux用到一个间接块来解决此问题.比如我们要记录14个块的编号,可以把前面10个记录在i-节点的磁盘序号列表里。另外4个编号放在一个数据块中。在i-节点的第11项里记录存放编号的数据块的指针,通过这个指针就能找到余下的4个数据块的编号,这个用来存放编号的数据就叫间接块。(二次间接寻址找到数据)
    但当间接块也存满了时我们还可以再开第二个间接块,甚至3、4、5。。。更多额外块。但内核并不会把这些块记录在文件的i-节点的第12、13项里。而是开辟一个新的块的来存放这些间接块的列表,并在i-节点的第12项存放这一新额外块的编号。这存放着那个存储着第2、3、4、及后继额外块的编号的块的编号,这个块称为二级间接块.
    同理当二级间接块饱和时还可以开辟第三级。(三次间址)

    展开全文
  • 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、 函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 usr是Unix Software Resource的缩写, 也就是...
  • linux文件系统结构

    千次阅读 2008-03-12 15:35:00
  • linux文件系统结构图.jpg

    千次阅读 2010-10-17 09:07:00
  • Linux文件系统目录结构详解

    万次阅读 2017-10-08 13:09:34
    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux...
  • linux文件系统采用 级层式的树状目录结构,在此结构中的最上层是根目录`/`,然后在此目录下再创建其他的目录。与windows多个根目录不同,Linux只有一个根目录。在Linux的世界中,一切皆文件
  • Linux源码目录结构Linux文件系统目录结构

    万次阅读 多人点赞 2018-03-14 18:03:34
    学习Linux也有一段时间了,具体来整理一下Linux源码的目录结构文件系统的目录结构,以便加深记忆。一、Linux源码的目录结构首先上一张截图,如下所示:再看各个文件的介绍,借用一下其他资源。arch:这个为目录是...
  • Linux - 系统文件结构

    千次阅读 2015-04-05 14:07:53
    Linux系统的文件系统结构/:文件系统结构的起始点 /home:用户主目录 /bin:标准指令和工具程序 /usr :系统使用文件和指令 /usr/bin:用户命令和工具程序 /usr/sbin:系统管理员命令 /usr/lib:编程语言库 /...
  • Linux文件系统和目录结构

    千次阅读 2020-10-07 15:39:54
    文章目录基本介绍Windows文件系统Linux文件系统具体的目录结构Linux目录小结 基本介绍 Windows文件系统 windows系统每个磁盘都有一个根目录结构,相当于森林。 Linux文件系统 linux的文件系统是采用级层式的树状...
  • 这篇文章我写一下自己对于linux文件系统结构和节点inode的简单理解。 文件系统结构概述 我们先简单看一下linux的文件系统结构划分,linux的文件系统大致可以分为三部分,或者,我们可以直接理解为linux的物理磁盘...
  • 很简单,在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构,如图 1 所示。 图 1 Linux 系统文件和目录组织示意图 其中,目录就相当于 Windows 中的文件夹,目录中存放的...
  • Linux文件系统层级结构

    千次阅读 2018-03-31 15:28:17
    Linux系统中的所有文件存储在文件系统中,他们被组织到一个颠倒的目录树中,称为文件系统层次结构。 /bin 常用的二进制目录。比如:ls cp mkdir等,和/usr/bin类似 /sbin 大多涉及系统管理的命令存放,是超级权限...
  • linux系统目录结构

    万次阅读 2020-09-08 09:54:03
    /:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。 /bin:bin 就是二进制(binary)英文缩写。在一般的系统当中,都可以在这个目录下找到linux常用的命令。系统所需要...
  • Linux源码的目录结构Linux文件系统的目录结构 我是一个小白,最近找工作找到是一份驱动方面的工作,刚从学校毕业出来啥也不懂。个人觉得首先了解的就是一个工程的目录下的文件分别表示什么,所以看了别人的文章,...
  • Linux文件系统的目录结构

    千次阅读 2016-02-26 19:35:27
     Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用“/”表示),其中含有下级子目录或文件的信息;子目录中又可含有更下级的子目录或者文件的信息。这样一层一层地延伸下去,构成一棵倒置的树,如...
  • 下面是一张文件系统目录的结构规范: bin:保存常用的可执行的二进制文件(bin目录下的文件是所有用户都有权限执行的) boot:引导目录(与引导,启动相关的文件以及Linux内核存在该目录下面) dev:保存计算机上...
  • 这片学习资料写的深入浅出,值得一看。...请点击这里查看:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html 文中有一处图片画得有点问题,容易让人产生误解,我纠正了下:
  • Linux文件系统以及目录结构简介

    千次阅读 2016-09-13 10:53:51
    linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。 在经过 chroot 命令之后,系统读取到的目录和文件将不
  • Linux系统结构详解

    万次阅读 多人点赞 2011-01-07 14:14:00
    内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。 1. linux内核 Linux内核是世界上最大的开源项目之一,内核是与计算机...
  • Linux 文件系统体系结构

    千次阅读 2013-10-29 22:46:31
  • Linux 文件系统类型 磁盘文件系统。 包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:autofs、coda、Ext(Extended File sytem,扩展文件系统)、Ext2、Ext3、VFAT、ISO9660(通常是CD-ROM...
  • Linux文件系统的整体结构模型大概可以划分为以下层次:  Hard Disk => Disk Driver => Filesystem(ext3,ext4,btrfs …) => User Operation  上面结构模型很简单,有一块物理硬盘,首先这块硬盘需要有硬盘...
  • Linux文件系统目录结构

    千次阅读 2014-01-08 14:56:05
    Linux文件系统目录结构如图:  /bin 二进制可执行命令  /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序  /etc 系统管理和配置文件  /dev 设备特殊文件 /etc/rc.d 启动的配置文件和脚本 /home ...
  • Linux 文件系统的目录结构

    千次阅读 2015-07-24 11:02:02
    Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的。各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差不多。 1. / 文件...
  • 文件系统方面,Linux® 可以算得上操作系统中的 ...本文讨论 Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要结构。 基本的文件系统体系结构Linux 文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 567,346
精华内容 226,938
关键字:

linux文件系统结构

linux 订阅