块设备文件与文件系统之间的关系解析

  • A+
所属分类:linux技术
摘要

  下面随笔给出块设备文件与文件系统之间的关系解析。  Linux操作系统秉承“一切皆文件”的设计思想,将所有的设备页看作文件来进行处理。目前的Linux版本中,当内核发现一个块设备时,用户空间会利用udev这一数据结构以及相关的操作来为块设备创建其所需的块设备文件。

  下面随笔给出块设备文件与文件系统之间的关系解析。

  Linux操作系统秉承“一切皆文件”的设计思想,将所有的设备页看作文件来进行处理。目前的Linux版本中,当内核发现一个块设备时,用户空间会利用udev这一数据结构以及相关的操作来为块设备创建其所需的块设备文件。

  关于块设备文件,可以从两方面来进行理解。从块设备文件的外部表现来看,它是属于某个外部文件系统上的一个文件。通常Linux内核将其存放在/dev目录下,用户像对常规文件一样来对其进行访问。从块设备文件的内部实现来看,它可以看作是一种特殊文件系统的所属文件,同时该块设备文件的文件逻辑编号与块设备逻辑编号一一对应。

  那如何对常规文件与块设备文件进行区分?当类似于/dev目录下的挂载在宿主系统中的块设备文件,主要通过文件所对应的inode结构中i_mode字段来进行判别,另外在inode结构中i_zone[0]字段中存储了所对应的块设备的编号。

  而为了对块设备文件进行便捷的组织与管理,Linux内核创建了bdev文件系统,该文件系统的目的是为了建立块设备文件在外部表现与内部实现之间的关联性。bdev文件系统是一个“伪”文件系统,它只被内核使用,而无需挂载到全局的文件系统树上。

  块设备文件除了与常规文件类似的在根文件系统上存在inode之外,其在bdev文件系统上也存在对应的inode。两个inode之间通过块设备编号相关联,需要注意的是,前者的inode称之为次inode,而后者称之为主inode。

  Linux中,存在对设备抽象之后的目录,即/dev,也就是前边所描述的宿主文件系统下的块设备文件。该目录由指向系统中硬件的特殊文件组成。所以程序员可以便捷的对硬件进行访问,而不需要使用一些特殊的接口函数。

   **这些文件其所对应的inode所具有的特征有以下几点:**

   **1. 文件模式为块设备文件**

   **2. 文件内容为块设备编号,保存在inode当中**

   **3. 文件长度为0**

   虽然bdev文件系统是一个“伪”文件系统,不会挂载在全局文件系统树中,且只存在于内存中。但是Linux内核仍然根据文件系统的数据结构来对其进行创建。 对于每个块设备,在bdev文件系统中都有一个indoe,同时磁盘和分区也会有属于自己的inode。Linux内核利用blokc_inode数据结构表示块设备的inode,其中包含了两个字段,分别是struct block_device,即块设备描述符。另一个是struct inode,即inode描述符。但是Linux系统为了能够对整体的inode进行统一的管理,因此在宿主系统中创建了与bdev文件系统中相对应的inode。