当缩小阵列及其组件时,对这个问题的准确回答非常重要。
例如,我在两个分区和/dev/md0
上设置了RAID1 。和都同意这些分区为 248832 KiB(497664 个扇区,正好是 243 MiB)。该阵列很可能是使用 Debian 安装程序创建的,以填充可用空间。/dev/sda1
/dev/sdb1
fdisk
/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)。
希望这可以帮助。