如何在給定的字節偏移量處創建文件系統
我有一個帶有 btrfs 的 3TB 磁碟,它從磁碟的開頭開始(即 /dev/sdx 而不是 /dev/sdx1)。同時,我決定要完全加密磁碟(使用 luks),但我沒有備用磁碟來獲取數據。幸運的是,這個磁碟只有大約 1TB,而且我已經縮小了文件系統。我知道可以在字節偏移處掛載文件系統,但是有沒有辦法在字節偏移處創建文件系統?
為了解決我的問題,我想創建一個 1.5TB 的文件系統,將數據移到那裡,在磁碟開頭的 luks 文件系統上創建 1TB btrfs,將數據移回,擴展 btrfs。是否有另一種不需要額外磁碟/空間的解決方案?這個解決方案可以在 SSD 上執行嗎?(最後一個問題只是出於好奇,我有一個硬碟)
注意:我會使用
dd
cp btrfs 到磁碟的其他部分,但我聽說 btrfs 由於相同的 uid 或其他原因不能很好地處理。
在磁碟上的偏移處訪問文件系統的正常方法是使用分區。但是,由於您在磁碟開頭沒有空間放置分區表,因此您必須採用更複雜的方法。
您可以使用循環設備。循環設備主要用於使文件顯示為塊設備,但是您可以使塊設備從偏移量開始(也可以在偏移量結束),並且底層文件本身可以是塊設備,因此您得到對應於另一個塊設備的段的塊設備。操作迴路設備的命令是
losetup
.losetup -o 1600g /dev/loop0 /dev/sda
確保您的文件系統確實在循環設備開始之前結束。然後你可以批發複製它。我不明白你為什麼需要創建一個不同的文件系統¹:你不應該在同一台機器上複製一個 btrfs 文件系統,但是**移動一個(即你永遠不會同時訪問兩者)是可以的。
head -c 1100g /dev/sda >/dev/loop0 mount -r /dev/loop0 /mnt # Check that the filesystem looks fine umount /mnt losetup -d /dev/loop0
您也可以通過適當呼叫 來做到這一點
dd
,但這很容易出錯。如果您首先設置塊設備,然後隨機播放數據,那麼在銷毀數據之前逐步進行並驗證大小會更容易。現在你已經移動了文件系統,創建分區,這樣你就不會再遇到這個問題了。
fdisk /dev/sda …
創建一個以您在上面傳遞的相同偏移量開始的分區
losetup
。寫入更改並驗證您是否可以掛載該分區。現在為 LUKS 卷創建一個分區,創建 LUKS 卷 (
cryptsetup luksFormat
),然後將 btrfs 文件系統再次移動到 LUKS 卷上。驗證文件系統是否仍然正常。刪除磁碟末尾的分區並擴展磁碟開頭的分區。擴展 LUKS 卷 (cryptsetup resize
),然後擴展文件系統。¹這樣做很簡單
mkfs.btrfs /dev/loop0
——但這不是解決問題的最佳方法。