Linux 文件系统

Linux 文件系统

先说磁盘

磁盘存储系统有一些共同的特征:它们都有物理数据分区,都可以对数据进行直接访问,都有将文件名映射到物理存储的方法;从硬件角度来看,磁盘存储系统有盘片、盘面、磁道、柱面和扇区,这些描述了磁盘的物理结构;

典型的硬盘结构如下图,它由固定在以一定速度旋转的轴上的多个盘片组成,每个盘片的表面都有用来记录磁脉冲的读写磁头。读写磁头以组为单位向盘片的中央或边缘步进。

 

 

 构成:

1、磁道(track):磁盘的表面被格式化成肉眼无法看见的同心圆,称为磁道。数据在磁道上以磁记录的方式存储,典型的3.5英寸硬盘包含上万条磁道。将读写磁头从一个磁道移到另一个磁道称为寻道,平均寻道时间是磁盘速度的一项测量指标;磁盘速度的另外一个指标是RPM(每分钟转数)。

2、柱面(cylinder):柱面是指读写磁头在某位置时可访问的所有磁道。开始时磁盘上的文件总是存储在相邻的柱面上的,这样可以减少磁头的移动。

3、扇区(sector):扇区是磁道上按每512字节来划分的块。物理扇区是由制造商使用一种称为低级格式化(low-level format)的手段所做的磁性标记(不可见)。不管安装的是什么操作系统,扇区的大小是永远不会改变的。在硬盘中每磁道可包含63个或更多的扇区。在计算整个硬盘的存储量时,简单的公式就是:柱面*磁头*扇区*512字节。

4、碎片(fragmented):碎片文件是指其存储扇区在磁盘上并不连续的文件,这种情况下,在读取文件数据时磁头将不得不跨越磁道,这不仅会降低读写文件的速度,而且使数据更容易出错。

磁盘的物理参数用于描述磁盘结构,使其可被系统BIOS理解和读取,物理参数由柱面数、每柱面的读写磁头数和每磁道扇区数构成。硬盘控制器执行一个转换过程,将磁盘的物理参数转换成能被操作系统理解的逻辑结构。控制器通常嵌入于固件(firmware)中,它要么被安装在硬盘内,要么位于一块独立的控制卡上。在转换之后,操作系统就可以使用逻辑扇区号(logical sector numbers)进行操作了,逻辑扇区号是以0开始的数字序列。

磁盘的IO时间是由磁盘寻道时间、磁盘转速(RPM)和数据传输速率(磁盘总线决定)共同决定的。

这里面,寻道时间往往容易成为IO瓶颈,这也是为什么顺序读写与随机读写的性能相差一个甚至多个数量级的原因。

EXT文件系统

Linux系统中,每台设备都被当成一个文件来对待,几乎所有的硬件设备号文件都在/dev目录中。

设备

Linux内的设备号

IDE硬盘

/dev/hd[a-d]

SCSI硬盘/U盘

/dev/sd[a-p]

CDROM

/dev/cdrom

打印机

/dev/lp[0-2]

鼠标

/dev/mouse

 

 

硬盘分区的要点是:主引导记录(MBR, Master Boot Recorder)就是在一块硬盘的第0轨上,这也是计算机启动之后要去使用硬盘时必须读取的第一个区域。MBR里记录了两个重要的信息,分别是Boot Loader(LILO或GRUB)与Partition Table,分区表中记录了每个分区的起始柱面与结束柱面。MBR的最大限制是,它仅能提供最多4个分区的记忆,因此主分区(Primary)与扩展分区(Extended)最多只能有4个。

硬盘的最小物理存储单位是扇区(sector),一个扇区有512字节。但数据所存储的最小单位是逻辑块(block),逻辑块是在分区进行文件系统的格式化时所指定的“最小存储单位”,逻辑块的大小为扇区的2^n倍数。此时,磁头一次可以读取一块,从而提高了文件的读取效率。

在进行分区时,每个分区就是一个文件系统。而每个文件系统开始位置的那个块就称为超级块(superblock)。超级块的作用是存储文件系统的大小、空的和填满的块,以及它们各自的总数和其他诸如此类的信息。因此,要使用一个分区来进行数据访问,第一个要经过的块就是超级块。

在标准的ext2文件系统中,将每个文件的内容分为两个部分来存储,一个是文件的属性,另一个则是文件的内容。为此,ext2规划出inode与块来分别存储文件的属性与文件的内容。要将一个分区格式化(format)为ext2时,就必须指定inode表与块区域的大小才行。

一个inode的大小为128字节,且一个inode只能记录一个文件的属性。inode除了记录文件的属性外,同时还具有指针(pointer)的功能,即指向文件内容放置的块,让操作系统可以正确获取文件的内容。inode记录的主要信息包括:

  1. 该文件的拥有者与用户组(owner/group);
  2. 该文件的访问模式(read/write/execute);
  3. 该文件的类型(type)、大小(size);
  4. 更改文件权限与属性等状态的status time(ctime)、读取文件的access time(atime)、改变文件内容的modification time(mtime);
  5. 定义文件属性的标志(flag),如SUID等;
  6. 该文件真正内容的指针(pointer);

 

在Linux的ext2文件系统建立一个目录时,ext2会给该目录分配一个inode与至少一个块。其中,inode记录该目录的相关属性,并指向分配到的那个块;块记录在这个目录下的相关文件(或目录)的关联性。而建立普通文件时,ext2会给该文件分配至少一个inode与相对于该文件大小的块数量。

注意,inode本身并不记录文件名,而是记录文件的相关属性,文件名则记录在目录所属的块区域。要读取一个文件的内容时,Linux先获取该文件所在目录的inode,再由该目录块中所记录的文件关联性获取该文件的inode,最后通过inode提供的块指针,来获取文件的最终内容。

 

 

目录的最大功能就是提供文件的关联性,其中最主要的就是“文件名与inode的关联数据”。目录下面的文件数如果太多,导致一个块无法容纳所有的关联数据时,Linux会给予该目录多个块,来继续记录关联数据。

创建硬连接(hard link)是在某个目录下新增一个文件的关联数据,即只要在该目录的块中多写入一个关联数据即可。硬连接一般不会改变磁盘空间和inode的数目,当然,如果目录的块刚好被用完时,可能会新加一个块来记录。注意:硬连接不能跨文件系统,不能连接目录。

创建一个硬连接会使关联的inode的链接数加1,如果链接数变为零,并且没有进程打开它,就表示该文件已不再被使用,磁盘上相应的位置就会被标记为可用空间。

创建符号连接(symbolic link)是建立一个独立的文件,会占用掉inode与block。其中block存放的是所指向文件的文件名称,这也是readlink函数读取到的内容。与Windows中的shortcut类似,符号连接会让数据的读取指向它所连接的文件内容。因此,如果源文件被删除,符号连接文件也无法打开了。

硬连接实际上是用多个文件名关联同一个inode,对每个文件名而言都是等价的;

符号连接是关联到不同的inode,是相互独立但又存在依赖关系的两个文件。

在C语言中,我们使用link()和symlink()系统调用创建硬连接和符号连接,unlink()用于删除一个硬连接。

 如果要在程序中创建一个临时文件,最简单的做法是:采用随机文件名open一个新文件,紧接着马上unlink它,这样这个文件的链接数就为0了,在进程结束的时候,文件将自动被删除。

 

原文地址:https://www.cnblogs.com/chenny7/p/3683936.html