跳到主要內容

使用免費工具救援硬碟資料

前陣子處理一顆突然變成「未格式化」(RAW format) 的 行動硬碟,筆記一下用到的工具、指令;因為這顆硬碟只有資料沒有開機磁區,以下步驟未包含 MBR 相關的修復。

這裡紀錄的只是個人筆記,不保證適用特定系統、硬體,作者對任何衍生行為的結果不提供任何保證。

首要重點

製作一個備份硬碟,只對備份硬碟進行修復
製作一個備份硬碟,只對備份硬碟進行修復
製作一個備份硬碟,只對備份硬碟進行修復

製作備份:

我使用 dd 來達成;

  1. 找一台正常的系統, 安裝 Cygwin1
  2. 接上損壞的硬碟 (Disk 1),跟額外的備份硬碟 (Disk 2),容量必須 Disk 2 > Disk 1。
  3. 打開 terminal/cygwin,找出對應的裝置
    $ ls /dev/sd*
    /dev/sda   /dev/sda2  /dev/sda4  /dev/sda6  /dev/sdx
    /dev/sda1  /dev/sda3  /dev/sda5  /dev/sda7  /dev/sdx1
    /dev/sdy   /dev/sdy1
    
    如果不知道 /dev/sdx 的意思,或是不確定要修的硬碟對應到那個路徑,不建議繼續往下進行。
  4. 假設損壞硬碟 (Disk 1) 在 sdx ,備份硬碟 (Disk 2) 在 sdy ,而且你知道自己在做甚麼,以管理員權限執行以下指令。
    time dd if=/dev/sdx of=/dev/sdy iflag=direct conv=noerror,sync bs=64K
    
    視硬碟大小、讀寫速度,這個步驟會耗費不少時間,假設每秒 10MB ,1TB 大概需要 27.7 小時。期間請確保系統不會更新或斷電。

進行修復:

  1. 移除 (Eject) 損壞的硬碟 (Disk 1)
  2. 以管理員權限執行 cmd
  3. 確認 Disk 2 掛載點,假設是 E:,若 Disk 2 沒有正常掛載,可用 diskpartdiskmgr (GUI)手動掛載
  4. 修復指令
    chkdsk e: /offlinescanandfix
    
  5. 修復完成後再用 diskpartdiskmgr online Disk 2
  6. 復原的檔案會放在 e:\found.000 隱藏目錄下,用 File Explorer 會看不到,可以用 Cygwin 去查看,或在 File Explorer 直接輸入路徑

Written with StackEdit.


  1. https://www.cygwin.com/ ↩︎

留言

這個網誌中的熱門文章

得利油漆色卡編碼方式

得利油漆色卡編碼方式 類似 Munsell 色彩系統 ,編碼方式為 HUE LRV/CHROMA 例如 10GY 61/449 ( 色卡 ) 編碼數值 描述 10GY hue ,色輪上從 Y(ellow) 到 G(reen) 區分為 0 ~ 99 ,數值越小越靠近 Y,越大越靠近 G 61 LRV (Light Reflectance Value) 塗料反射光源的比率,數值從 0% ~ 100% ,越高越亮,反之越暗,也可理解為明度 449 chroma 可理解為彩度,數值沒有上限,越高顏色純度 (濃度) 越高 取決於測量儀器,對應至 RGB 並不保證視覺感受相同。 參考資料: 色卡對照網站 e-paint.co.uk Written with StackEdit .

C++17 新功能 try_emplace

C++17 新功能 try_emplace 回顧 emplace 大家的好朋友 Standard Template Library (STL) 容器提供如 push_back , insert 等介面,讓我們塞東西進去; C++11 之後,新增了 emplace 系列的介面,如 std::vector::emplace_back , std::map::emplace 等,差異在於 emplace 是在容器內 in-place 直接建構新元素,而不像 push_back 在傳遞參數前建構,下面用實例來說明: struct Value { // ctor1 Value ( int size ) : array ( new char [ size ] ) , size ( size ) { printf ( "ctor1: %d\n" , size ) ; } // ctor2 Value ( const Value & v ) : array ( new char [ v . size ] ) , size ( v . size ) { printf ( "ctor2: %d\n" , size ) ; memcpy ( array . get ( ) , v . array . get ( ) , size ) ; } private : std :: unique_ptr < char [ ] > array ; int size = 0 ; } ; struct Value 定義了自訂建構子 (ctor1),以指定大小 size 配置陣列,複製建構子 (ctor2) 則會配置與來源相同大小及內容的陣列,為了方便觀察加了一些 printf 。當我們如下使用 std::vector::push_back 時 std :: vector < Value > v ; v . push_back ( Value ( 2048 ) ) ; 首先 Value 會先呼叫 ctor1,傳給 push_ba...

Notes for C/C++ Programming

Notes for C/C++ Programming Notes for C/C++ Programming Off by One Error Prone # define LEN 128 char buf [ LEN ] = { 0 } ; // -1 for prevent missing NULL terminator // since strncpy doesn't preserve it for us. strncpy ( buf , something , sizeof ( buf ) - 1 ) ; // snprintf does preserve NULL terminator for us // i.e. actual size for placing characters is sizeof(buf) - 1 // but it takes extra time to parsing format snprintf ( buf , sizeof ( buf ) , something ) ; Bad things often happen when we mess with -1 or +1 to pointers point to continuous elements. Absorber # define LEN 128 char buf [ LEN + 1 ] = { 0 } ; // ^^^^ Always preserve 1 byte strncpy ( buf , somethin , sizeof ( buf ) ) ; Constant Correctness (C/C++) Bad void do_something ( char * dest , char * src ) ; struct MyList { void do_something ( std :: string & name ) ; } ; Reason : Will the name be modified by the lookup method? Will stat...