mdadm 和 4k 扇区(高级格式)

mdadm 和 4k 扇区(高级格式)

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

相关内容