了解Linux中的文件系统超级块

时间:2020-03-21 11:47:27  来源:igfitidea点击:

扩展文件系统是Linux中的默认文件系统,我们将在本文中重点介绍ext文件系统以了解超级块。

在了解文件系统中的超级块之前,让我们了解文件系统的一些常用术语和构建块。

文件系统中的块

格式化分区或者磁盘后,首先将Hardisk中的扇区分为几个小组。
这组扇区称为块。
当用户使用可用的命令行参数格式化分区时,可以指定块大小。

mkfs -t ext3 -b 4096 /dev/sda1

在上面的命令中,我们在格式化/dev/sda1分区时指定了块大小。
指定的大小以字节为单位。
因此,基本上一个块将是4096字节。

Ext2的块大小可以是1Kb,2Kb,4Kb,8Kb

Ext3的块大小可以是1Kb,2Kb,4Kb,8Kb

Ext4的块大小可以是1Kb到64Kb

我们选择的块大小将影响以下内容

  • 最大档案大小
  • 最大文件系统大小
  • 表现

相关:Linux读写性能测试

块大小会影响性能的原因是,文件系统驱动程序将块大小范围发送到基础驱动器,同时将内容读取和写入文件系统。
试想一下,如果我们有一个大文件,则逐个读取较小的块(将它们合并在一起将使文件变大)将花费更长的时间。
因此,如果我们打算在文件系统上存储大文件,则基本思想是保持更大的块大小。

如果文件系统的块大小较大,则将执行较少的IOPS。

相关:在Linux中监视IO

而且,如果我们愿意在文件系统上存储较小的文件,则最好使用较小的块大小,因为这样做可以节省大量磁盘空间,而且从性能的角度来看也是如此。

硬盘扇区不过是驱动器的基本存储单元,可以解决。
大多数物理驱动器的扇区大小为512字节。
请记住这一事实,硬盘扇区是驱动器的属性。
文件系统的块大小(前面已经讨论过)是一种软件结构,请勿与硬盘扇区混淆。

linux内核使用文件系统的块大小在文件系统上执行所有操作。
这里要了解的主要重要一点是,块大小永远不能小于硬盘的扇区大小,并且始终是硬盘扇区大小的倍数。
linux内核还要求文件系统块大小小于或者等于系统页面大小。

可以使用以下命令检查Linux系统页面大小。

root@localhost:~# getconf PAGE_SIZE
4096

文件系统中的块组

我们在上一节中讨论的块被进一步分组在一起,以形成块组,以便于在读写过程中进行访问。
这样做主要是为了减少读取或者写入大量数据时所花费的时间。

ext文件系统将分区的整个空间划分为相等大小的块组(这些块组以顺序的方式一个接一个地排列)。

典型的分区布局在很高的层次上看起来像下面的样子。

每组的块数是固定的,不能更改。
通常,每个块组的块数为8 *块大小。

让我们看一下mke2fs命令的输出,该输出只显示了到目前为止我们讨论过的一些信息。

root@localhost:~# mke2fs /dev/xvdf
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
6553600 inodes, 26214400 blocks
1310720 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

如果看到上面的输出,它将为我们提供以下详细信息:

  • 块大小(4096字节)
  • 800个分组
  • 每组32768个块(如前所述,它是8 * 4096)

它还显示了分区上的超级块备份位置。
那就是存储超级块备份的块组。

什么是文件系统超级块?

Superblock最简单的定义是,它是文件系统的元数据。
与智能节点存储文件元数据的方式类似,超级块存储文件系统的元数据。
由于它存储有关文件系统的重要信息,因此防止超级块损坏至关重要。

如果文件系统的超级块已损坏,那么在安装该文件系统时将遇到问题。
每次挂载文件系统时,系统都会验证和修改超级块。

超级块还存储文件系统的配置。
下面提到了存储在超级块中的一些更高级别的详细信息。

  • 文件系统中的块
  • 文件系统中没有可用块
  • 每个块组的索引节点
  • 每个块组的块数
  • 自上次fsck以来,文件系统已挂载次数。
  • 挂载时间
  • 文件系统的UUID
  • 写时间
  • 文件系统状态(即:是否完全清除,检测到错误等)
  • 文件系统类型等(即:是ext2,3还是4)。
  • 格式化文件系统的操作系统

超级块的主要副本存储在第一个块组中。
这称为主超级块,因为这是挂载文件系统时系统读取的超级块。
由于从0开始对块组进行计数,因此可以说主超级块存储在块组0的开始处。

由于超级块是文件系统中非常重要的组成部分,因此在每个“块组”中都放置了一个备份冗余副本。

换句话说,文件系统中的每个“块组”都将具有备份超级块。
基本上,这样做是为了在主块损坏时恢复超级块。

我们可以轻松想象在每个“块组”中存储超级块的备份副本会消耗大量的文件系统存储空间。
由于这个原因,以后的版本实现了一个称为“ sparse_super”的功能,该功能基本上仅在块组0、1和3、5、7的幂上存储备份超级块。
默认情况下,此选项在最新系统中是默认启用的,因此,我们将仅在几个块组上看到超级块的备份副本(从上一节中显示的mke2fs输出中可以明显看出)。

如何查看文件系统的超级块信息?

我们可以使用dumpe2fs命令查看现有文件系统的超级块信息,如下所示。

root@localhost:~# dumpe2fs -h /dev/xvda1
dumpe2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   cloudimg-rootfs
Last mounted on:          /
Filesystem UUID:          f75f9307-27dc-4af8-87b7-f414c0fe280f
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              6553600
Block count:              26212055
Reserved block count:     1069295
Free blocks:              20083290
Free inodes:              6470905
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      505
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat Sep 27 13:05:57 2014
Last mount time:          Mon Nov  2 14:43:31 2014
Last write time:          Sat Sep 27 13:06:55 2014
Mount count:              4
Maximum mount count:      20
Last checked:             Sat Sep 27 13:05:57 2014
Check interval:           15552000 (6 months)
Next check after:         Thu Mar 26 13:05:57 2014
Lifetime writes:          305 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       396056
Default directory hash:   half_md4
Directory Hash Seed:      2124542b-ea2f-4552-afaa-c5720283d2cd
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             128M
Journal length:           32768
Journal sequence:         0x0151d29d
Journal start:            11415

我们还可以使用相同的dumpe2fs命令查看超级块和备份的确切位置,如下所示。

root@localhost:~# dumpe2fs /dev/xvda1 | grep -i superblock
dumpe2fs 1.42.9 (4-Feb-2014)
  Primary superblock at 0, Group descriptors at 1-7
  Backup superblock at 32768, Group descriptors at 32769-32775
  Backup superblock at 98304, Group descriptors at 98305-98311
  Backup superblock at 163840, Group descriptors at 163841-163847
  Backup superblock at 229376, Group descriptors at 229377-229383
  Backup superblock at 294912, Group descriptors at 294913-294919
  Backup superblock at 819200, Group descriptors at 819201-819207
  Backup superblock at 884736, Group descriptors at 884737-884743
  Backup superblock at 1605632, Group descriptors at 1605633-1605639
  Backup superblock at 2654208, Group descriptors at 2654209-2654215
  Backup superblock at 4096000, Group descriptors at 4096001-4096007
  Backup superblock at 7962624, Group descriptors at 7962625-7962631
  Backup superblock at 11239424, Group descriptors at 11239425-11239431
  Backup superblock at 20480000, Group descriptors at 20480001-20480007
  Backup superblock at 23887872, Group descriptors at 23887873-23887879

如何使用备份超级块来恢复损坏的文件系统?

首先要做的是使用fsck实用程序进行文件系统检查。
这就像对所需的文件系统运行fsck命令一样简单,如下所示。

root@localhost:~# fsck.ext3 -v /dev/xvda1

如果fsck输出显示超级块读取错误,则可以执行以下操作来解决此问题。

第一步是确定备份超级块的位置。
这可以通过前面显示的使用dumpe2fs命令的方法来完成,或者使用以下命令来完成,我们也可以找到备份超级块的位置。

root@localhost:~# mke2fs -n /dev/xvda1

上例中与mke2fs一起使用的-n选项将显示备份超级块位置,而不创建文件系统。
阅读mke2fs手册页以获取有关此命令行开关的更多信息。

第二步是使用e2fsck命令简单地还原superblock的备份副本,如下所示。

root@localhost:~# e2fsck -b 32768 /dev/xvda1

在上面显示的示例中,我使用的数字32768是超级块的第一个备份副本的位置。
上面的命令成功执行后,我们可以尝试重新挂载文件系统。

另外,我们也可以使用mount命令中可用的sb选项。
sb选项使我们可以指定在挂载文件系统时要使用的超级块。
如本文前面所述,在挂载文件系统时,默认情况下会读取主超级块。
相反,我们可以强制mount命令读取备份超级块,以防主超级块损坏。
下面显示的是使用备份超级块安装文件系统的示例安装命令。

root@localhost:~# mount -o -sb=98304 /dev/xvda1 /data

上面显示的mount命令将在安装时使用位于块98304的备份超级块。