您的位置:首页 > 运维架构 > Linux

Linux系统的文件系统详解

2016-05-08 13:30 295 查看

Linux系统文件系统:

1、文件系统介绍

文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识。

本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录、挂载基本原理、文件存储结构、软链接硬链接、和常见目录的介绍。相信有了这些知识对于深入的学习linux会有一定的帮助。

Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。

2、Linux文件常见的目录

Linux发行版本之间的差别很少,差别主要表现在系统管理的特色工具以及软件包管理方式的不同。目录结构基本上都是一样的。Windows的文件结构是多个并列的树状结构,最顶部的是不同的磁盘(分区),如:C,D,E,F等。

Linux的文件结构是单个的树状结构.可以用tree命令进行展示(默认没有安装)。

每次安装系统的时候我们都会进行分区,Linux下磁盘分区和目录的关系如下:

① 任何一个分区都必须挂载到某个目录上。

② 目录是逻辑上的区分。分区是物理上的区分。

③ 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。

④ 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。

以下是我们可能存在的一种目录和分区关系:



Q:如何查看分区和目录及使用情况?
– fdisk查看硬盘分区表
– df:查看分区使用情况
– du: 查看文件占用空间情况
Q: 为什么要分区,如何分区?
– 可以把不同资料,分别放入不同分区中管理,降低风险。
– 大硬盘搜索范围大,效率低
– 磁盘配合只能对分区做设定
– /home /var /usr/local经常是单独分区,因为经常会操作,容易产生碎片。

3.文件类型
Linux下面的文件类型主要有:
a) 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。
b) 目录文件:目录,存储文件的唯一地方。
c) 链接文件:指向同一个文件或目录的的文件。
d) 特殊文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。
可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。
4、存储设备分区

文件系统的最终目的是把大量数据有组织的放入持久性(persistant)的存储设备中,比如硬盘和磁盘。这些存储设备与内存不同。它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。观察常见存储设备。最开始的区域是MBR,
MBR(分为三个部分)
446字节(bootloader 引导加载器(是个程序))引导某个分区的加载的
46个字节(分区表)标识分区信息 每16个字节标识一个分区(所以只能划分4个主分区)
2个字节(魔数)magic number 作用标记MBR是否有效(常见的55AA
用于Linux开机启动(参考下列简短总结Linux开机启动过程)。

电脑开机--》BIOS(是一段程序)中的数据对计算机的健康状态的自身检查
将这段程序映射到内存最开始的那个段中(内存分为三段 BIOS段和内核空间和用户空间)

根据BIOS中设定的启动次序去寻找启动设备的MBR
BOIS中设置的启动顺序去启动对应的系统:设置的种类有:硬盘,光盘,U盘(winPE安装系统的时候设置设备的启动顺序--》U盘先启动)

找到上述的设备种类进行加载,把BootLoader加载到内存中(BIOS就退出了,把指令交给bootLoader)--》读取分区表(64个字节)--》在分区中找到系统内核,把操作系统的内核读进内存中进行解析--》把控制权交给内核--》内核启动自身--》内核根据配置找到文件系统的位置--》启动文件系统。

剩余的空间可能分成数个分区(partition)。每个分区有一个相关的分区表(Partition table),记录分区的相关信息。这个分区表是储存在分区之外的。分区表说明了对应分区的起始位置和分区的大小。


我们在Windows系统常常看到C分区、D分区等。Linux系统下也可以有多个分区,但都被挂载在同一个文件系统树上。

数据被存入到某个分区中。一个典型的Linux分区(partition)包含有下面各个部分:



分区的第一个部分是启动区(Boot block),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR(MBR:主引导记录
在磁盘的第0盘面0磁道0扇区,大小512个字节)
,不属于任何文件系统,是全局的,独立于任何文件系统
随后MBR从某个硬盘的启动区加载程序。该程序负责进一步的操作系统的加载和启动。为了方便管理,即使某个分区中没有安装操作系统,Linux也会在该分区预留启动区。

启动区之后的是超级区(Super block)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。
随后是多个inodes,它们是实现文件存储的关键。在Linux系统中,一个文件可以分成几个数据块存储,就好像是分散在各地的龙珠一样。为了顺利的收集齐龙珠,我们需要一个“雷达”的指引:该文件对应的inode。每个文件对应一个inode。这个inode中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要对应inode的"地图",收集起分散的数据块,就可以收获我们的文件了。

最后一部分,就是真正储存数据的数据块们(data blocks)了。

5、文件系统
系统分区完成后,将要将分区格式化文件系统(文件系统是个管理软件,存到磁盘分区的某个位置,文件系统不是整个分区)但是文件系统上的数据是在这个分区上的,所以说文件系统是一个管理软件。
文件系统把磁盘分为两片:元数据存储区(metadata)(inode位图、块位图、inode条目等等)、数据存储区(数据存储区又分为多个逻辑存储单元叫做磁盘块(是逻辑概念))

任何文件系统中的数据分为数据和元数据(metadata)。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。但是元数据中★不包含文件名★文件名存放在磁盘块上的

6、文件存储结构

Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
目录项:包括文件名和inode节点号。
Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。
数据块:文件的具体内容存放地。
Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。
文件存储结构大概如下:



其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):



其中文件的inode结构如下(inode里所包含的文件信息可以通过stat
filename查看得到):



inode简介

上面我们看到了存储设备的宏观结构。我们要深入到分区的结构,特别是文件在分区中的存储方式。文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。

Linux文件管理中,我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls
-l filename来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inode number)表示。

在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。



数据块在1, 32, 0, ...

inode并不是组织文件的唯一方式。最简单的组织文件的方法,是把文件依次顺序的放入存储设备,DVD就采取了类似的方式。但果有删除操作,删除造成的空余空间夹杂在正常文件之间,很难利用和管理。

复杂的方式可以使用链表,每个数据块都有一个指针,指向属于同一文件的下一个数据块。这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行。如果想随机存取,那么必须遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢。

FAT系统是将上面链表的指针取出,放入到内存的一个数组中。这样,FAT可以根据内存的索引,迅速的找到一个文件。这样做的主要问题是,索引数组的大小与数据块的总数相同。因此,存储设备很大的话,这个索引数组会比较大。

inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。

inode事例

在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。

在Linux下,可以使用$stat filename,来查询某个文件对应的inode编号。





在存储设备中实际上存储为右图

当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

7、软连接、硬链接

软链接和硬链接是我们常见的两种概念:

硬连接:直接指向同一个inode的不同路径彼此之间称为硬链接是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中[color=red]任意一个[/color]其余的文件将不受影响。

软连接:也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,指向另一个路径(是一个字符串),最终访问文件的权限是以哪个文件权限为准,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。

具体关系可以看下图:



从图上可以看出硬链接和软链接的区别:
1:硬链接原文件和新文件的inode编号一致。而软链接不一样。
2:对原文件删除,会导致软链接不可用,而硬链接不受影响。
3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。

硬链接:

1、只能对文件创建,不能应用于目录
2、不能跨文件系统
3、创建硬链接会增加文件系统被链接的次数

符号链接:
1、可应用于目录
2、可以跨文件系统
3、不会增加被链接文件的链接次数
4、其大小为指定的路径所包含的字符个数

上述图片和大量内容来自: http://www.cnblogs.com/vamei http://www.cnblogs.com/vamei/p/3506566.html http://www.iteye.com/topic/816268
出于对原创博客作者的尊重,如有转载的请保留这段声明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: