ddrescue 磁碟對拷腳本
可能先前多少曾提及過,ddrescue 這款磁碟救援工具已是 DR 最主要的磁碟複製方案。基本上無論磁碟好壞,DR 預設都是使用這支工具來做複製。這樣做的好處,是即便中途發生非預期的讀取失敗,也無須中斷重來。而且能夠將錯誤區域註記下來,後續便可再針對錯誤區域重試,或者做其它的處置。
去年為公司的舊電腦規劃了中期延壽計畫,雖然其中有許多電腦大概都用了超過 10 年。但其實只要將 HDD 換成 SSD,就能夠獲得顯著的效能改善,足敷日常任務所需。因此便經常使用 ddrescue,將舊 HDD 的資料原封不動地對拷到新的 SSD 上。倘若新的磁碟較大,則對拷後便會再用其它工具(如 GParted 等),做分割區大小的調整。
然而磁碟對拷本身就是一個一旦做錯就會整個悲劇的動作。也就是倘若把來源跟目標磁碟顛倒了,就會反過來清除掉舊磁碟裡的資料。因此每次在操作時總是戰戰兢兢,執行指令前都要再三確認來源跟目標是否正確,生怕一個恍神就犯下嚴重錯誤。當然,是否有更保險的操作流程?確實是有,就是分成兩個步驟來進行,且每一步驟都只接上一顆磁碟。先接上來源磁碟,將來源磁碟複製成一個映像檔,完成後卸除;再接上目標磁碟,然後將映像檔輸出到目標磁碟,如此一來就能夠很大程度避免磁碟的混淆風險。
但此舉會耗費雙倍的時間,也會依賴高額的儲存空間,就效益來說並不是很理想。這使得 DR 得思考是否有其它的辦法,因為預防風險始終勝於事後補救,且總不能完全依賴「小心為上」這種心態層面的要求。是人都會犯錯,而工程思維就是要設計出合適的流程或方法,來阻隔或減緩人為錯誤的發生。就像許多飛安事故的檢討,即便事後調查確認是人為疏失,也經常會改變設計來避免類案發生。
於是乎,DR 寫了一支互動式的 Python 腳本(ddrescue_d2d.py),來協助產出 ddrescue 指令。下載後給予可執行權限,然後以 root 權限執行:
- chmod +x ddrescue_d2d.py
- sudo ./ddrescue_d2d.py
這支腳本的運作是根據 DR 平常的確認邏輯,首先它會執行 Linux 的 fdisk 工具,並將輸出結果彙整成包含磁碟代號、型號(如果有的話)、大小以及分割區數目的精簡清單,供使用者檢視,並從中選取來源及目標磁碟。完成來源及目標的選取後,會再次列出磁碟資訊,供使用者確認是否繼續下一步。倘若目標磁碟已有分割區存在,也會再要求使用者確認一次。最後會產出相應的 ddrescue 指令,但不會執行,而是由使用者自行複製指令後再執行。
倘若欲由腳本接著就執行產出的 ddrescue 指令,則可以將腳本內的 SAFE_MODE 參數從 True 改為 False。這樣腳本執行到最後,還會再詢問使用者一次,同意後便會執行 ddrescue。