mdadm 和 4k 扇區(高級格式)
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