Linux

為更大的塊設備創建寫記憶體循環設備

  • December 6, 2014

所以,長話短說。* 我有一個帶有 HP 控制器的 5.5TB RAID5 陣列。* HP 使用了一種非常非常痛苦的 RAID5 算法(參考:延遲奇偶校驗) * 我編寫了一個新的塊驅動程序,它將請求轉換為它創建的新塊設備,轉換為 HP 陣列的舊磁碟 - 轉換是單向的(讀取只要)。

所以我有一個 5.5TB 的“陣列”,它似乎可以正常安裝,EXT4 文件系統模組抱怨日誌不是 100%,有幾個目錄由於錯誤而無法讀取,但其餘數據似乎完好無損足以相信我的塊驅動程序正在做正確的事情。

但是,我非常謹慎。我不想只是打開只讀模式並在文件系統上執行 fsck 卻發現它完全破壞了它,因為我沒有考慮過。

我想做的是將塊設備映射到塊級的循環設備;所以我可以在它上面執行 fsck (寫入將被記憶體在循環設備中)並且讀取將被聯合化(如果沒有為該扇區記錄寫入 - 讀取塊設備,如果有,則讀取循環設備)。

問題是,我沒有足夠的磁碟空間來創建一個 5.5TB 的文件——即使是這樣配置的——來充當寫記憶體,這似乎是在浪費時間,因為可能只有幾 GB 的寫——最大,正如 fsck 所做的那樣。

問題:有沒有辦法將塊設備環回/合併到一個文件中,開始時大小基本上為零,隨著我的寫入而增長?

提前致謝。

您可以在寫時複製模式下使用 dm-snapshot 或 NBD。

這裡提供了 dm-snapshot 解決方案(抱歉不再重複):

https://raid.wiki.kernel.org/index.php/Recovering_a_failed_software_RAID#Making_the_harddisks_read-only_using_an_overlay_file

至於 NBD,你可以安裝nbd-serverand nbd-client,然後像這樣使用它:

mount /mnt/storage # something with some free space
losetup --read-only /dev/sda1 /dev/loop0 # to ensure it's readonly
ln -s /dev/loop0 /mnt/storage/loop0
nbd-server 127.0.0.1@4242 /mnt/storage/loop0 -c

符號連結是必要的,因為 nbd-server 堅持將臨時寫入記憶體文件儲存到與其正在服務的文件相同的位置。因此,如果沒有連結,它最終會/dev/變得毫無用處。

最後用客戶端連接到它:

nbd-client 127.0.0.1 4242 /dev/nbd0

此 NBD 解決方案的唯一問題是它使用大量 RAM(取決於您的設備大小),而不管臨時儲存是否可用。由於fsck它本身有時也非常消耗 RAM,因此如果您沒有安裝大量 RAM,則可能會用完。

引用自:https://unix.stackexchange.com/questions/171790