Raid

使用 mdam 恢復 Synology 上失去的 RAID1 卷

  • March 22, 2015

幾天前,我發現我的 DS412+ 處於致命狀態。Volume1 崩潰了,系統卷也崩潰了。而且,Volume2 從系統中消失了!看起來 Volume1 沒有可用空間,無法將數據從幾個壞塊傳輸到新位置,這會損害系統數據。(這只是一個理論)。

我設法使用此處描述的過程( )使 Volume1 恢復了生機e2fsck, mdadm reassemble。順便說一句,必須提到syno_poweroff_task簡化流程的新命令!

然後我使用 Synology GUI 恢復了系統音量。一切開始正常,除了我無法恢復 Volume2。它是 RAID1 陣列,由 2 個相同大小的磁碟組成。/etc/space_history*.xml這是墜機前日期的摘錄:

<space path="/dev/md3" reference="/volume2" >
   <device>
       <raid path="/dev/md3" uuid="927afd83:*" level="raid1" version="1.2">
           <disks>
               <disk status="normal" dev_path="/dev/sdc3" model="WD30EFRX-68AX9N0        " serial="WD-*" partition_version="7" slot="1">
               </disk>
               <disk status="normal" dev_path="/dev/sdd3" model="WD30EFRX-68AX9N0        " serial="WD-*" partition_version="7" slot="0">
               </disk>
           </disks>
       </raid>
   </device>
   <reference>
       <volume path="/volume2" dev_path="/dev/md3">
       </volume>
   </reference>

RAID 成員(/dev/sdc3 和 /dev/sdd3)仍在他們的位置上,看起來他們還可以,至少 /dev/sdc3。

DiskStation> mdadm --misc --examine /dev/sdc3
/dev/sdc3:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : 600cff1e:0e27a96d:883007c3:610e73ef
          Name : DiskStation:3  (local to host DiskStation)
 Creation Time : Thu Mar 19 22:21:08 2015
    Raid Level : raid1
  Raid Devices : 2

Avail Dev Size : 5851088833 (2790.02 GiB 2995.76 GB)
    Array Size : 5851088512 (2790.02 GiB 2995.76 GB)
     Used Dev Size : 5851088512 (2790.02 GiB 2995.76 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : f0b910a0:1de7081f:dd65ec22:a2a16d58

   Update Time : Thu Mar 19 22:21:08 2015
      Checksum : a09b6690 - correct
        Events : 0

  Device Role : Active device 0
  Array State : A. ('A' == active, '.' == missing)

我用 mdadm 嘗試了很多技巧,有多種形式,如下所示:

mdadm -v --assemble /dev/md3 /dev/sdc3 /dev/sdd3
mdadm --verbose --create /dev/md3 --level=1 --raid-devices=2 /dev/sdc3 /dev/sdd3 --force
mdadm --verbose --create /dev/md3 --level=1 --raid-devices=2 /dev/sdc3 missing

所有這些都導致​​了類似的結果:

mdadm: ADD_NEW_DISK for /dev/sdc3 failed: Invalid argument

是否有機會恢復 RAID 卷?或者有沒有機會從卷中恢復數據?例如,直接掛載 /dev/sdc3 成員?

更多 mdadm 資訊:

DiskStation> cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md2 : active raid1 sdb3[0]
     2925544256 blocks super 1.2 [1/1] [U]

md1 : active raid1 sdb2[0] sdc2[1]
     2097088 blocks [4/2] [UU__]

md0 : active raid1 sdb1[2] sdc1[0]
     2490176 blocks [4/2] [U_U_]

最終(經過幾天的探索)我設法強制陣列工作並複制數據。

首先,原因是磁碟壞扇區——我想是在raid superblock 和/或分區表的區域。

其次,我不得不使用在ordmesg期間查看錯誤:mdadm --assemble``mdadm --create

[Thu Mar 19 23:27:04 2015] end_request: I/O error, dev sdc, sector 9437194

所以我採取了以下步驟來擺脫這種情況。請記住,我不保證這種方式在所有細節上都是正確的,並且可能會導致數據失去,但它對我有幫助。

壞扇區

首先,我會處理壞磁碟扇區(我不知道為什麼它們沒有自動重新映射)。這可能導致另一個磁碟上的數據出現一些問題。

檢查了故障一周圍的幾個扇區:

hdparm --read-sector **9437191** /dev/sdc
...
hdparm --read-sector **9437195** /dev/sdc
....
hdparm --read-sector **9437199** /dev/sdc

然後修復壞的:

hdparm --yes-i-know-what-i-am-doing --write-sector 9437198 /dev/sdc

/dev/sdc 分區表

接下來我想恢復並檢查 sdc 分區表:我使用testdisk的不是 Synology 標準發行版的一部分,但可以從[Synocommunity repository][1]. 安裝後可以通過控制台訪問/usr/local/testdisk/bin/testdisk

  1. 選擇一個磁碟,然後$$ EFI GPT $$分區圖。
  2. 分析和快速搜尋。它找到了幾個分區。
TestDisk 7.0-WIP,數據恢復實用程序,2015 年 1 月
克里斯托弗·格尼爾
http://www.cgsecurity.org

磁碟 /dev/sdc - 3000 GB / 2794 GiB - CHS 364801 255 63
扇區中的分區開始結束大小
D MS 數據 256 4980607 4980352 [1.41.10-2219]
P Linux Raid 256 4980735 4980480 [md0]
D Linux 交換 4980736 9174895 4194160
>P Linux 突襲 4980736 9175039 4194304 [md1]
P Linux Raid 9437184 5860523271 5851086088 [DiskStation:3]
  1. 將所有 Linux Raid 標記為 P(主)分區,其餘市場標記為 D(已刪除)。寫分區表。

最終 -partprobe /dev/sdc更新系統分區表(無需重新啟動)。

mdadm

現在可以恢復raid superblock。

mdadm --zero-superblock /dev/sdc3 

這幫助我清除了有關 RAID 陣列的舊資訊和可能損壞的資訊。我認為這個動作在很多情況下是危險的。

mdadm --create /dev/md3 --verbose --assume-clean --metadata=1.2 --level=1 --raid-devices=2 /dev/sdc3 missing 

但在我的情況下,它已經恢復了一個有 1 個可用磁碟的 raid1,並且沒有數據失去。

我不知道是什麼原因,但是 md3 上的文件系統大小(ext4)與 md3 的物理大小相比略有不同。所以我跑:

resize2fs /dev/md3

和文件系統檢查:

fsck.ext4 -f -C 0 /dev/md3

現在可以掛載數組了:

mount -t ext4 -o ro /dev/sdc3 /volume2

所以我成功複製了所有數據。

引用自:https://serverfault.com/questions/676878