收縮無分區文件系統
我有一個磁碟上的數據,我想通過將該磁碟(源)的完整文件系統複製到基於相同容量的附加磁碟(目標)的虛擬塊設備(devicemapper/cryptsetup)來加密。我已經在目標磁碟上設置了 LUKS 設備。
源磁碟已初始化為無分區文件系統。這意味著我需要將該文件系統縮小 2MiB(4096 塊 4096 字節)以考慮額外的 LUKS2 標頭,然後
dd
將數據從源磁碟上的文件系統傳輸到 LUKS 設備。我做了一個
resize2fs /dev/sda <newsize>
是
<newsize>
總塊數減去 4096,這似乎按預期工作。但是,由於源磁碟是無分區的,
dd
因此仍會複製整個磁碟 - 包括文件系統已縮小的 4096 個塊。我現在的問題是:我是否可以安全地假設
resize2fs
操作中的空閒塊位於物理設備(源)的末尾,從而count=<newsize> bs=4096
作為參數傳遞給 dd?這會複製/複製完整的文件系統嗎?還是我沒有考慮到的任何其他陷阱?額外的問題:為了仔細檢查,是否已經有可用的工具來計算磁碟塊的 md5sums(而不是文件系統的文件)?
我現在的問題是:我可以安全地假設來自 resize2fs 操作的空閒塊位於物理設備的末尾
是的,這是您需要做出的假設,即使它是一個分區並且您要縮小它。
並因此
count=<newsize> bs=4096
作為參數傳遞給dd
?我們可能會。
dd
有點奇怪,這dd count=N bs=M
並不意味著將複製 N*M 字節,只是它將發出 N 次讀取,每次讀取 M 字節,並為每個寫入相應的寫入。讀取返回的字節數可能少於請求的字節數,在這種情況下,讀取和寫入的總次數將少於您想要的。實際上,我從未見過 Linux 塊設備返回部分讀取,所以它應該可以工作。您應該檢查輸出,它應該說類似“N+M 記錄”,其中第一個數字是讀取的完整塊的數量,第二個是讀取的部分塊的數量。GNU dd 也應該警告不完整的讀取。
無論如何,您不妨使用
head -c $(( nblocks * 4096 ))
.請參閱:dd vs cat - 這些天 dd 仍然相關嗎?dd什麼時候適合複製數據?(或者,什麼時候 read() 和 write() 部分)
(無論如何,在根據網際網路上陌生人的文章做任何事情之前,請仔細檢查你的號碼。這是你的文件系統,你不想因為別人的錯字而搞砸它。你可能已經知道了,但無論如何。)
為了仔細檢查,是否已經有一個工具可以計算磁碟塊的 md5sums
您應該能夠執行
md5sum /dev/sdx
, 或head -c $bytes /dev/sdx | md5sum
.MD5 應該可以很好地檢查意外損壞或被截斷的副本,但請注意,一般來說,它被認為是損壞的。可以輕鬆創建具有相同雜湊的不同文件。對於嚴重使用,請改用 SHA-2 雜湊,即
sha256sum
或sha512sum
.