Linux 软件 RAID1 在其组成设备上实际占用了多少空间?

Linux 软件 RAID1 在其组成设备上实际占用了多少空间?

当缩小阵列及其组件时,对这个问题的准确回答非常重要。

例如,我在两个分区和/dev/md0上设置了RAID1 。和都同意这些分区为 248832 KiB(497664 个扇区,正好是 243 MiB)。该阵列很可能是使用 Debian 安装程序创建的,以填充可用空间。/dev/sda1/dev/sdb1fdisk/proc/partitions

mdadm --detail /dev/md0报告:

        Array Size : 248640 (242.81 MiB 254.61 MB)
     Used Dev Size : 248640 (242.81 MiB 254.61 MB)

/proc/partitions的大小也/dev/md0报告为 248640。 上的文件系统/dev/md0也声称占用了这么多 1 KiB 块。

总而言之,界限是:

  • 上限:248832 KiB(每个组件设备的大小)
  • 较低:248640 KiB(包含的文件系统的大小)

差异:192 KiB。

192 KiB 中的一部分显然是用于阵列元数据(超级块等等)所需的。

现在的问题是 - 阵列在组件设备上究竟占据了多少个扇区?换句话说,如何计算出/dev/sd[ab]1保持阵列完整的最小可能大小?

无论上面的“已使用的开发大小”是什么意思(互联网上并不确定),它显然是不是将元数据考虑进去。

看起来mdadm --examine /dev/sda1揭示了更多数据:

          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
[...]
     Raid Level : raid1
   Raid Devices : 2
[...]
 Avail Dev Size : 497408 (242.88 MiB 254.67 MB)
     Array Size : 248640 (242.81 MiB 254.61 MB)
  Used Dev Size : 497280 (242.81 MiB 254.61 MB)
    Data Offset : 256 sectors
   Super Offset : 8 sectors
   Unused Space : before=176 sectors, after=128 sectors

尤其是“Avail Dev Size”看起来很有趣,因为它似乎比阵列大小(每个组件)正好大 128 KiB。这大致符合 mdadm 手册页中 --size 描述中提到的模糊的“驱动器末尾大约有 128Kb 的空间用于 RAID 超级块。”,如果假设作者实际上是指“Kb”而不是“KiB”。

但我不太愿意假设这就是我要找的数字。

答案1

欢迎 Marcin 成为超级用户。

这取决于元数据格式。

使用旧的 0.9 格式,它非常简单,如手册页中所述md(4)

通用格式(即 0.90 版)具有 4K 长的超级块,并写入 64K 对齐的块中,该块从设备末尾至少 64K 开始,少于 128K(即获取超级块的地址,将设备大小四舍五入为 64K 的倍数,然后减去 64K)。每个设备的可用大小是超级块之前的空间量,因此当设备合并到 MD 阵列中时,64K 到 128K 之间的空间会丢失。

对于新的 1.x 格式,情况更加复杂。相同的手册页内容如下:

新格式(称为版本 1)的超级块通常为 1K,但可以更长。它通常存储在距离设备末端 8K 到 12K 之间,以 4K 为边界,但也可以存储在设备起始处(版本 1.1)或设备起始处 4K 处(版本 1.2)。

您的 RAID 阵列使用 1.2 版超级块。根据手册页,您知道超级块存储在距离设备启动位置 4kiB 的位置,并且“通常长度为 1kiB,但可能更长”。因此,数据必须至少从距离设备启动位置 5kiB 的位置开始,但这并不能告诉您具体位置。

事实上,在 1.x 版超级块中,数据的起始位置称为数据偏移量。 的手册页mdadm(8)描述了该 --data-offset参数:

具有 1.x 元数据的阵列可以在设备起始和阵列数据起始之间留出间隙。此间隙可用于各种元数据。数据的起始称为数据偏移。通常,会自动计算适当的数据偏移。但是,明确设置它会很有用,例如在重新创建最初使用不同版本的 mdadm 创建的阵列时,该版本的 mdadm 会计算不同的偏移量。

它提示您数据偏移量会有所不同。

在您的情况下,mdadm --examine报告数据偏移量是 256 个扇区。

它还报告说数据后有 128 个扇区未使用空间。我猜这是因为数据大小必须是块大小的倍数(根据手册页,默认情况下为 512kiB mdadm)。

因此,数据前有 256 个扇区(其中包括超级块、其他内容和 176 个未使用空间扇区)、数据,数据后有 128 个未使用空间扇区。

如果愿意,您可以将分区减少 128 个扇区。您也可以尝试运行mdadm --grow以更改数据偏移量,但我的系统尚不支持此功能(mdadm 4.1,linux 内核 5.10.140)。

希望这可以帮助。

相关内容