覆蓋 LUKS 容器的前幾個字節後恢復 LUKS 分區?系統還在!
我有一個 1.5 TB 的數據分區,我在開始時不小心覆蓋了一些字節,原因如下:
ssh somewhere command | dd of=/dev/sda3 // should have used quotes here, dd was executed locally by mistake!
/dev/sda3 為包含重要數據的 1.5 TB ext4 分區保存一個 LUKS 容器。
當我注意到這個問題時,我暫停並殺死了 dd;它應該覆蓋小於 4K。
有沒有辦法恢復數據?從那以後電腦沒有重新啟動,所以失去的任何數據可能仍然在 RAM 中?LUKS 容器的第一個(比如說)4k 包含什麼?
分區仍然掛載,但顯示錯誤,如
[1157706.786897] EXT4-fs error (device dm-4): htree_dirblock_to_tree:896: inode #2: block 9249: comm ls: bad entry in directory: rec_len % 4 != 0 - offset=0(0), inode=2791782547, rec_len=44529, name_len=90
嘗試訪問它時。
請幫忙!
謝謝!
PS:我做了更多的測試,似乎更多的數據被覆蓋,而不僅僅是 4K :-( 但仍然是 1.5 TB 數據中非常小的一部分!我還能從未受污染的區域轉儲數據嗎?也許可以使用 ext4 恢復工具搜尋(如果存在一個好的)在 /dev/mapper/cr_sda3 的轉儲中 - 這仍然有效嗎?
第一:執行
dmsetup table --showkeys
。將輸出保存在安全的地方——它顯示的那個大長十六進製字元串是用於保護數據的**實際加密密鑰(主密鑰)。**LUKS 通過(此處簡化)使用您的密碼加密該密鑰,因此請記住,該密鑰的妥協意味著遊戲結束 - 密碼更改無濟於事。您必須擦除並重新創建 LUKS 分區。但是,相同的屬性意味著即使使用完全破壞的 LUKS 標頭,您也可以使用該“表”(包括密鑰)來讀取數據。您要查找的行(可能有很多行,LVM 也使用 Device Mapper)看起來像這樣。除了一堆 0 之外,您將擁有隨機的十六進制數字(0 是您在沒有 –showkey 的情況下得到的):
Zia-swap_crypt: 0 11714560 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 253:1 0
(你先做上面的,因為它很快。如果斷電,機器崩潰等,你可以用它來恢復你的數據。沒有它,你的數據將無法恢復。)
你想保留整條線。更好的是,整個輸出。即使沒有 LUKS 標頭,您也可以將該行返回以
dmsetup
恢復表,從而訪問數據)。接下來,將解密設備的圖像複製到某處。
dmsetup
解密的設備是您在上面的輸出中看到的名稱;就我而言/dev/mapper/Zia-swap_crypt
。它與您輸入/etc/fstab
或傳遞給的相同mount
。現在,您可以從正在執行的系統中複製您的數據(例如,使用
tar
),或者,如果失敗,請嘗試fsck
修復文件系統。(然後複製數據關閉)。您可以使用該密鑰創建一個新的 LUKS 標頭,這應該可以工作 - 或者只是重新初始化它並重新開始。
今後,請使用
cryptsetup luksHeaderBackup
.