Linux

mdadm 和 4k 扇區(高級格式)

  • July 12, 2014

Serverfault 上有很多關於對齊 4k 扇區磁碟的問題,但有一件事我還不是很清楚。

我成功地對齊了我的 RAID1+LVM。我做的其中一件事是使用 mdadm superblock 1.0 版(它將超級塊儲存在磁碟的末尾)。

手冊頁是這樣說​​的:

不同的子版本將超級塊儲存在設備上的不同位置,或者在末尾(對於 1.0)、在開頭(對於 1.1)或從開始處 4K(對於 1.2)。“1”等價於“1.0”。“預設”相當於“1.2”。

預設的 1.2 版本是為 4k 扇區驅動器製作的嗎?在我看來,它不是,因為從一開始的 4k + 超級塊的長度不是 4k 的倍數(如果我沒記錯的話,超級塊大約有 200 個字節長)。

歡迎對此的任何見解。

編輯:

下面的回答是 mdadm superblock 1.1 和 1.2 用於 4k 對齊。我剛剛創建了一個完整的設備突襲:

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。我將它們放在我的台式 PC 中,它們以大約 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)。還有什麼不對勁的。

Edit2:當我找到答案時,我從來不記得更新這篇文章。一切都很好地對齊。其中一張磁碟壞了。顯然,它已經到了最後一站,甚至在某個時候打破了。更換磁碟工作正常。

是的,它是為 4k 扇區對齊而設計的。

對於 1.1 和 1.2 超級塊,在每個磁碟的開頭保留空間,這樣超級塊就不會被踐踏。超級塊創建程式碼強制此保留空間為 4kB 的倍數。所有物理讀取都從這個保留空間的末尾偏移,而不是從超級塊的末尾偏移。因此,這保留了任何平均劃分為 4kB 的扇區大小的對齊方式。

如果您有興趣,這裡是來自mdadm 原始碼的證明( super1.c):

/* force 4K alignment */
reserved &= ~7ULL;
sb->data_offset = __cpu_to_le64(reserved);

核心中的 RAID1 程式碼使用此data_offset參數來偏移物理讀取,例如在讀取路徑中:

read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset

引用自:https://serverfault.com/questions/274681