首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从零实现文件系统之什么是文件系统的格式化

在介绍格式化的实现之前,我们先了解一下什么是格式化,同时介绍一下Linux操作系统中的挂载是干什么的。格式化文件系统相当于在块设备上创建一个文件系统,而挂载则是将该文件系统激活(在操作系统目录树呈现)的过程。

通常操作系统安装的时候,安装程序已经对系统磁盘进行了格式化操作。所以,通常情况下我们不太会感知到在使用磁盘之前需要格式化。但是,如果我们的计算机有多个硬盘的话,非系统硬盘在使用之前需要格式化才可以使用。

如果是Windows系统,格式化操作非常简单。只需要右击盘符弹出一个菜单(如下图所示),然后选择其中的“格式化…”菜单项,左击即可打开一个格式化的对话框。

在如下图所示的对话框中,我们只需要点击“开始”按钮,系统就可以帮我们完成整个格式化的过程。当然,我们在点击该按钮之前可以根据我们的需要调整文件系统的参数,比如文件系统类型,分配单元的大小等等。

当系统完成格式化之后,我们就可以双击磁盘盘符进入该磁盘了。然后我们就可以做一些具体的操作了,比如向其中拷贝文件,或者新建文件等。  

在Linux操作系统系统进行格式化稍微有些门槛,但并没有多大的难度。Linux命令行终端通过命令实现块设备的格式化操作。其语法格式大致如下:

这里/dev/sdb就是一个块设备,可以理解为磁盘。命令名称分为两部分mkfs(make filesystem的简写)表示格式化,而ext4则表示文件系统的类型。当然,该命令其实有非常丰富的参数,比如设置文件系统块大小等,大家可以通过man进一步了解,文本不再赘述。

但是在Linux操作系统中完成格式化后,我们并不能像Windows那样直接进入/dev/sdb这个磁盘设备拷贝文件,或者进行其他文件操作。这里需要额外操作一步,也就是将该块设备挂载到某个目录下面。

假设我们现在有一个目录(/mnt/ext4_test),执行如下命令就可以将刚才格式化的文件系统挂载了。

如果没有提示错误,那么这个格式化后的磁盘就挂载到Linux文件系统目录树的/mnt/ext4_test目录下面了。此时,我们对该目录的访问就是对磁盘数据的访问。这个似乎是一个很神奇的动作,具体原理是什么呢?我们后面会详细介绍挂载的相关内容。  

了解了格式化和挂载的基本操作之后,我们再深入介绍一下格式化的相关内容。格式化到底干了什么?

为了管理磁盘空间,文件系统会将磁盘空间划分为若干功能区。其中存储用户数据的地方称为数据区,而另外一些地方存储管理用户数据的数据,称为元数据区,这些管理用户数据的数据称为元数据。

元数据又分不同的种类,每一类元数据又在一个特定的区域或者称为子空间。每种子空间有具体的功能,以Linux中的ExtX文件系统为例,元数据区被划分为数据块位图区、inode位图区和inode表等区域,具体如图所示。

这里ExtX是对Ext、Ext2、Ext3和Ext4文件系统的总称,该系列文件系统是Linux操作系统原生的文件系统。

在实际时,ExtX并不是将整个磁盘划分为上图所示的功能区,而是先将磁盘划分为等份(最后一份可能会小一些)的若干个区域,这个区域称为块组(Block Group)。磁盘空间的管理则是以块组为单位进行管理。在所有块组中第一个块组(块组0)是最复杂的。

如下图所示是Ext2文件系统的磁盘布局及块组0的细节(4KB逻辑块大小为例,如果是其他逻辑块大小则略有差异)。块组0最前面空间是引导块,这个是预留给操作系统用的。然后接下来分别是超级块、块组描述符、预留GDT块、数据块位图、inode位图、inode表和数据块。除了块组0外及一些备份超级块的块组外,其他块组并没有这么复杂,大多数块组只有数据块位图、inode位图、inode表和数据块等关键的信息。  

虽然Ext2文件系统是目前Linux内核中最简单的文件系统了,但是对于我们这些初学者而言还是有点复杂。今天我们暂时先实现一个比Ext2还要简单的文件系统。这个文件系统的磁盘布局如下所示,在该文件系统中包含一个数据块位图,用于管理所有硬盘空间(但实际上管理不了太多空间);一个inode位图用于管理所有inode,一个inode表示一个文件或者目录;另外就是inode表,表中每一项是一个inode。剩下的空间用于存储用户数据,包含目录和文件等内容。

废话一箩筐,我们回到本文的正题,也就是实现文件系统格式化的功能。文件系统格式化就是按照上述区域划分写入必要数据的过程。这样在挂载文件系统的时候,文件系统程序就可以按照格式加载文件系统,并允许用户使用文件系统了。

在Linux操作系统中每个文件系统都有一个格式化的命令来进行文件系统的格式化操作,比如Ext4文件系统的格式化命令为mkfs.ext4,XFS文件系统的格式化命令为mkfs.xfs。  

为了实现格式化的功能,我们这里也实现了一个命令行工具,暂且命名为mkfs吧。这里mkfs的功能就是实现将一个文件或者硬盘格式化为我们上面描述的数据布局。限于篇幅,关于格式化的内容就先到这里,下一篇文章我们将重点介绍一下我们实现的格式化命令mkfs。   

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O3oAdWd5fhGMdkMXh8j6KgGQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券