来点绿色放松一下眼睛吧 :)

文件系统是对文件和目录的组织集合。

一 设备文件

设备文件和系统的某个设备相对应。

设备驱动程序

  • 处理设备的所有IO请求。
  • 提供了一致的API接口,对应于系统调用的open, close, read, write, mmap以及ioctl,屏蔽了底层设备的差异。

设备的类型

  • 字符型设备:基于每个字符来处理请求,例如终端和鼠标、键盘。
  • 块设备:按数据块处理请求,通常数据块是512字节的整数倍。例如硬盘和磁带。

设备ID

  • 每个设备文件都有主、辅设备文件ID。主文件ID标识一般的设备等级,内核会根据主ID查找与该类设备对应的设备驱动程序。
  • 辅ID能够在一般等级中唯一标识特定设备。
  • 文件的inode中记录了主辅ID

二 磁盘和分区

2.1 磁盘驱动器

磁盘驱动器是一种机械装置,由一个或多个高速旋转的盘片组成。通过在磁盘上快速移动读写磁头,便可获取/修改磁盘表面的磁性编码信息。

其结构见下图。

磁道:磁盘表面的信息存储在称为磁道的一组同心圆上。

扇区:磁道被划分为若干扇区。

物理块:扇区包含一系列物理块,物理块的容量一般为512字节,代表了驱动器可以读写的最小信息单位。

寻道时间:读写磁盘信息,首先,磁头要移动到相应磁道,这段时间叫做寻道时间。

旋转延迟:然后,驱动器要等待相应的扇区旋转到磁头下。

传输时间:最后,从所请求的块上传输数据。

执行上述操作所耗费的时间总量通常以毫秒为单位。

2.1 磁盘分区

分区:可将每块磁盘换分成一个或多个不重叠的分区。内核则将每个分区视为位于/dev路径下的单独设备。

磁盘分区可容纳任何类型的信息,通常包括:

  • 文件系统:用来存放常规文件
  • 数据区域:可做为裸设备对其进行访问,一些数据库管理系统会这样使用。
  • 交换区域:供内核的内存管理之用。

可使用Linux专有文件/proc/swaps来查看系统中当前已激活交换区域的信息,其中包括每个交换区域的大小,以及在用交换区域的个数。

三 文件系统

文件系统是对常规文件和目录的组织集合。

Linux的强项之一是支持种类繁多的文件系统。

以ext2为例来介绍文件系统。

3.1 文件系统结构

逻辑块:在文件系统中,用来分配空间的基本单位是逻辑块,也就是文件系统所在物理设备上若干连续的物理块。在ext2文件系统上,逻辑块的大小为1024、2048或4096。

磁盘分区和文件系统之间的关系如下图所示

文件系统由以下几个部分组成:

  1. 引导块:总是作为文件系统的首块。引导块不为文件系统所用,只是包含用来引导操作系统的信息。
  2. 超级块:紧随引导块之后的一个独立块,包含与文件系统相关的参数信息,包括:
    1. i节点表容量
    2. 文件系统中逻辑块的大小
    3. 以逻辑块计,文件系统的大小
  3. i节点表:文件系统中的每个文件或目录在i节点表中都对应着唯一一条记录。这条记录登记了和文件相关的各种信息。
  4. 数据块:文件系统的大部分空间都用于存放数据,以构成驻留于文件系统之上的文件和目录。

3.2 i节点

i节点维护的信息如下

  • 文件类型
  • 文件属主
  • 文件属组
  • 3类用户的访问权限
  • 3个时间戳:对文件的最后访问时间、文件的最后修改时间、文件状态的最后改变时间
  • 指向文件的硬连接数量
  • 文件的大小,以字节为单位
  • 实际分配给文件的数据块,以512字节为单位
  • 指向文件数据块的大小

ext2中的i节点和数据块指针

文件的数据块不一定连续,为了定位文件数据块,inode维护了一组指针,如下图所示:

在ext2中,每个inode包含15个指针,其中

  • 前12个指针指向前12个数据块在文件系统中的位置。
  • 第13个指针是一个一重间接指针
  • 第14个指针是一个二重间接指针
  • 第15个指针是一个三重间接指针

这样设计的意图是:

  • inode结构固定大小固定,并支持任意大小的文件
  • 可以不连续地存储文件,并支持lseek随机访问,内核只需要计算所要遵循的指针
  • 对于有大量小文件的系统中,可以对数据进行快速访问,一次搜索就可以访问。

四 虚拟文件系统(VFS)

Linux所支持的各种文件系统,其实现细节均不相同。虚拟文件系统是一种内核特性,通过为文件系统操作创建抽象层来解决各种文件系统之间的差异问题。

原理:

  • VFS针对文件系统定义了一套通用接口,所有与文件交互的程序都会按照这一接口来进行操作。
  • 每种文件系统都会提供VFS接口的实现。

这样一来,程序只需要理解VFS接口,而无需过问具体文件系统的实现细节。

五 日志文件系统

如果系统突然崩溃,对文件的更新的只完成了一半,文件系统元数据也将处于不一致状态。

而系统对文件系统进行一致性检查需要遍历整个文件系统,这是一个非常耗时的操作。

日志文件系统就是为了解决这个问题。具体做法是

  • 在实际更新元数据之前,日志文件系统会将这些更新操作记录于专用的磁盘日志文件中。
  • 对元数据更新的操作记录是以事务的方式进行的,这样确保总是将文件元数据事务作为一个完整单元来提交。

需要注意的是,通常日志文件系统知会确保元数据的一致性,不会记录文件数据。因此,一旦系统崩溃,可能会造成数据丢失。

六 单根目录层级和挂载点

Linux上的所有文件系统中的文件都位于单根目录树下,其他文件系统都挂载在根目录下。

挂在命令:

mount device directory

下面通过实例来说明挂载后的文件系统的层级关系。

不带任何参数来执行mount命令,可以列出当前已挂载的文件系统。

挂载点和设备的映射关系如下

七 虚拟内存文件系统:tmpfs

Linux支持驻留于内存中的虚拟文件系统,对于应用程序来说,此类文件系统看起来与任何其他文件系统别无二致,不过二者的重要的差别是:

  • 由于不涉及磁盘访问,虚拟文件系统的文件操作速度极快
  • 该文件系统不仅可以使用RAM,而且在RAM资源耗尽的情况下,还会利用交换空间
  • 默认情况下,允许tmpfs文件系统的大小提高至RAM容量的一半
  • 一旦写在tmpfs文件系统,或者遭遇系统崩溃,那么该文件系统中的所有数据都将丢失

挂在虚拟文件系统命令如下:

mount -t tmpfs source target
其中source只有在/proc/mounts中可以看到,没有其他用途。
例如:
 
除了用于用户应用程序以外,tmpfs文件系统还有以下两个特殊用途:
  • 由内核内部挂在的隐形tmpfs文件系统,用于实现System V共享内存和共享匿名内存映射。
  • 挂在与/dev/shm的tmpfs文件系统,为glibc用以实现POSIX共享内存和POSIX信号量。
 
 
参考资料
 
《Linux/Unix系统编程手册(上册)》 第14章

UNIX高级环境编程(16)文件系统 < 雨后 >的更多相关文章

  1. UNIX高级环境编程1

    UNIX高级环境编程1 故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详. 首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表 ...

  2. UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 < 海棠花溪 >

    春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动.  上周末在元大都遗址公园海棠花溪拍的海棠花.   进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定o ...

  3. Unix高级环境编程

    [07] Unix进程环境==================================1. 进程终止    atexit()函数注册终止处理程序.    exit()或return语句:    ...

  4. UNIX高级环境编程(4)Files And Directories - umask、chmod、文件系统组织结构和链接

    本篇主要介绍文件和文件系统中常用的一些函数,文件系统的组织结构和硬链接.符号链接. 通过对这些知识的了解,可以对Linux文件系统有更为全面的了解.   1 umask函数 之前我们已经了解了每个文件 ...

  5. UNIX高级环境编程(15)进程和内存分配 < 故宫角楼 >

    故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详.   首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表和二叉树)分配额外内 ...

  6. UNIX高级环境编程(12)进程关联(Process Relationships)- 终端登录过程 ,进程组,Session

    在前面的章节我们了解到,进程之间是有关联的: 每个进程都有一个父进程: 子进程退出时,父进程可以感知并且获取子进程的退出状态. 本章我们将了解: 进程组的更多细节: sessions的内容: logi ...

  7. UNIX高级环境编程(10)进程控制(Process Control)- 竞态条件,exec函数,解释器文件和system函数

    本篇主要介绍一下几个内容: 竞态条件(race condition) exec系函数 解释器文件    1 竞态条件(Race Condition) 竞态条件:当多个进程共同操作一个数据,并且结果依赖 ...

  8. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid

    本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID   1 进程标识符(Process Identifie ...

  9. UNIX高级环境编程(8)进程环境(Process Environment)- 进程的启动和退出、内存布局、环境变量列表

    在学习进程控制相关知识之前,我们需要了解一个单进程的运行环境. 本章我们将了解一下的内容: 程序运行时,main函数是如何被调用的: 命令行参数是如何被传入到程序中的: 一个典型的内存布局是怎样的: ...

随机推荐

  1. C# 1.0 到 4.0 的进化 1

    定义一个产品类 Product C# 1 using System; using System.Collections; namespace C1 { public class Product { s ...

  2. Linux 下面解压.tar.gz 和.gz文件解压的方式

    Linux 下面解压.tar.gz 和.gz文件解压的方式 两种解压方式 1 .tar.gz 使用tar命令进行解压 tar -zxvf java.tar.gz 解压到指定的文件夹 tar -zxvf ...

  3. webpack4+react多页面架构

    webpack在单页面打包上应用广泛,以create-react-app为首的脚手架众多,单页面打包通常是将业务js,css打包到同一个html文件中,整个项目只有一个html文件入口,但也有许多业务 ...

  4. C# ABP WebApi与Swagger UI的集成

    本文是配置WebApi与Swagger UI,可以参照 http://www.cnblogs.com/farb/p/ABPSwaggerUIIntegration.html 1. 安装swagger ...

  5. BloomFilter布隆过滤器

    BloomFilter 简介 当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1.检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些 ...

  6. echart 数据视图 样式重写

    来源http://blog.csdn.net/u010705091/article/details/75212724 echarts折线图的数据视图样式重写 在echarts.js中,点击折线图的数据 ...

  7. 本地SQL数据库执行作业定时修改其他数据库内容

    --exec sp_addlinkedserver 'xkp', ' ', 'SQLOLEDB', '192.168.66.66'  定义链接--exec sp_addlinkedsrvlogin ' ...

  8. SQL Server T—SQL 存储过程 触发器

    一.存储过程 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1.允许模块化程序设计 2.允许更快执行如果某操作需要大量T- ...

  9. Java基础——String类(二)

    今天做了几道String常见操作.先来几个代码实例: 例一:此方法,仅把字符串前后出现的空格去掉了,中间部分不会. class TestTrim { public static void main(S ...

  10. BestCoder Round #27

    Jump and Jump... Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...