![mdadm 和 4k 扇区(高级格式)](https://linux22.com/image/550704/mdadm%20%E5%92%8C%204k%20%E6%89%87%E5%8C%BA%EF%BC%88%E9%AB%98%E7%BA%A7%E6%A0%BC%E5%BC%8F%EF%BC%89.png)
Serverfault 上有许多关于对齐 4k 扇区磁盘的问题,但有一件事我还不太清楚。
我成功对齐了我的 RAID1+LVM。我做的一件事是使用 mdadm superblock 版本 1.0(它将超级块存储在磁盘末尾)。
手册页上是这么说的:
不同的子版本将超级块存储在设备上的不同位置,要么在末尾(对于 1.0),要么在开始处(对于 1.1),要么在距开始处 4K 处(对于 1.2)。“1”相当于“1.0”。“default”相当于“1.2”。
默认的 1.2 版本是为 4k 扇区驱动器设计的吗?在我看来,不是,因为从开始算起的 4k + 超级块的长度不是 4k 的倍数(如果我没记错的话,超级块大约有 200 字节长)。
欢迎对此进行任何见解。
编辑:
下面的回答是,mdadm 超级块 1.1 和 1.2 适用于 4k 对齐。我刚刚创建了一个全设备 raid,使用:
mdadm --create /dev/md4 -l 1 -n 2 /dev/sdb /dev/sdd
然后我向其中添加了一个逻辑卷:
vgcreate universe2 /dev/md4
阵列以 16 MB/s 的速度同步:
md4 : active raid1 sdd[1] sdb[0]
1465137424 blocks super 1.2 [2/2] [UU]
[>....................] resync = 0.8% (13100352/1465137424) finish=1471.6min speed=16443K/sec
所以我怀疑它是否正确对齐。
(磁盘是 1.5 TB WD EARS。我将它们安装在我的台式电脑上,它们的同步速度约为 80 MB/s。)
编辑2:
这是 --examine 输出:
# mdadm --examine /dev/sdb
/dev/sdb:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 79843828:7d939cce:1c8f0b32:cf339870
Name : brick:4 (local to host brick)
Creation Time : Sat Jul 9 10:47:33 2011
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 2930275120 (1397.26 GiB 1500.30 GB)
Array Size : 2930274848 (1397.26 GiB 1500.30 GB)
Used Dev Size : 2930274848 (1397.26 GiB 1500.30 GB)
Data Offset : 2048 sectors
Super Offset : 8 sectors
State : active
Device UUID : dd2e3b5f:33214b96:1cb88169:25deb050
Update Time : Sat Jul 9 10:49:06 2011
Checksum : 4f7cd785 - correct
Events : 1
Device Role : Active device 0
Array State : AA ('A' == active, '.' == missing)
数据偏移量为 2048 个扇区,可被 8 整除,因此人们会认为没问题。卷组的物理范围大小为 4 MiB,也可被 8 整除。但这并不重要,因为重新同步与设备包含的内容无关。
另一处修改:这似乎不是对齐问题;因为 hdparm -t 显示其中一个磁盘的读取速度非常低(30 MB/s)。其他方面有问题。
编辑 2:当我找到答案时,我从来不记得更新这篇文章。一切都很好。其中一个磁盘坏了。显然它已经快要报废了,甚至在某个时候也坏了。更换磁盘工作正常。
答案1
是的,它是为 4k 扇区对齐而设计的。
对于 1.1 和 1.2 版超级块,每个磁盘的开头都预留了空间,这样超级块就不会被破坏。超级块创建代码强制将此预留空间设置为 4kB 的倍数。所有物理读取都偏移从这个保留空间的末尾,而不是从超级块的末尾开始。因此,这可以保留任何可以整除 4kB 的扇区大小的对齐。
如果你感兴趣的话,这里有证据mdadm 源代码(super1.c
):
/* force 4K alignment */
reserved &= ~7ULL;
sb->data_offset = __cpu_to_le64(reserved);
此data_offset
参数由内核中的 RAID1 代码偏移物理读取,例如在读取路径中:
read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset