Lvm

MD,部分從 RAID1 增長到 RAID5 但被中斷,磁碟被移除,現在文件系統是 FUBAR

  • March 31, 2022

我知道我做了一些愚蠢的舉動來陷入這種情況,請不要提醒我,也不要問為什麼:-/

我有這個 Synology DS1515+,在 SHR 中有 2x6TB 驅動器,這意味著 MD RAID1,頂部有 LVM。

在開始 RAID1 到 RAID5 的轉換、中止它並擺弄磁碟後,我的 ext4 文件系統無法掛載。

有沒有可能,系統只是因為多次重新啟動和刪除磁碟而“混亂”,現在將整個磁碟空間視為一個 RAID5 卷,即使從 RAID1 到 RAID5 的轉換僅完成了大約 10%?如果是這樣,如果我添加第三個磁碟並讓 RAID 陣列重建,您認為我有機會修復文件系統嗎?或者它是否會重新建構為具有與現在完全相同的數據的邏輯卷,即其上的文件系統已損壞?

我有點好奇實際的轉換過程是如何進行的,因為 MD 和/或 LVM 必須知道塊設備的哪些部分應該被視為 RAID5 或 RAID1,直到整個空間都轉換為 RAID5。有誰知道更多嗎?

提前感謝您的幫助:-)

這就是我所做的。(到目前為止我的救援嘗試,日誌條目如下所列)

  1. 將新的 6 TB 磁碟熱插入 NAS。
  2. 告訴 Synology 的 UI 將磁碟添加到我現有的捲並將其增加到 12TB(使其成為 3x6TB RAID5)
  3. 關閉你的 NAS(shutdown -P now)進入增長過程,並移除新驅動器。 NAS 啟動良好,但報告我的捲已降級。它仍然報告了一個 6 TB 的文件系統,並且仍然可以訪問所有內容。
  4. 再次熱插拔磁碟 3,擦除它並在其上創建另一個磁碟捲。
  5. 關閉 NAS,移除磁碟 2(這是一個錯誤!)並打開它。 它開始發出嗶嗶聲,並告訴我我的音量已崩潰。
  6. 再次關閉 NAS 並重新插入失去的磁碟 2。 但 Synology 仍然報告該卷已崩潰,並且沒有提供任何修復選項。

所以,我所有的數據現在都不可用了!

我開始調查這個問題。似乎 MD 正在按應有的方式組裝陣列:

State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 0
 Spare Devices : 0

        Layout : left-symmetric
    Chunk Size : 64K

          Name : DiskStation:2  (local to host DiskStation)
          UUID : 58290cba:75757ee2:86fe074c:ada2e6d2
        Events : 31429

   Number   Major   Minor   RaidDevice State
      0       8        5        0      active sync   /dev/sda5
      1       8       21        1      active sync   /dev/sdb5
      2       0        0        2      removed

兩個原始磁碟上的元數據看起來也不錯:

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

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

LVM 還可以辨識 RAID5 卷並公開它的設備:

--- Logical volume ---
LV Path                /dev/vg1000/lv
LV Name                lv
VG Name                vg1000

但是 /dev/vg1000/lv 上的文件系統似乎已損壞,當我嘗試以只讀方式掛載它時:

mount: wrong fs type, bad option, bad superblock on /dev/vg1000/lv, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program)  
In some cases useful info is found in syslog - try dmesg | tail or so.

因此,我的文件系統損壞了,我認為無法修復(請參閱下面的嘗試列表)。

以下是我迄今為止嘗試過的步驟:

將 /dev/vg1000/lv 複製到空硬碟驅動器上的分區並執行 e2fsck 我讓這個程序執行了一周,然後才中斷它。它發現了數百萬個錯誤的 inode 和多次聲明的塊等,並且有這麼多的 FS 錯誤,我相信它不會帶回任何有用的數據,即使有一天它完成了。

將兩個帶有數據的硬碟驅動器移動到 USB 擴展塢中,並將其連接到 Ubuntu 虛擬機,並製作覆蓋設備以擷取所有寫入(使用 dmsetup)

首先,我嘗試重新創建raid 陣列。我首先找到創建具有相同參數的數組的命令,並且 mdadm -E 已經給了我,然後我嘗試交換命令,看看結果是否不同(即 sda、missing、sdb、sda、sdb、missing , 缺失, sdb, sda)。6 種組合中有 4 種使 LVM 檢測到卷組,但文件系統仍然損壞。

使用 R-Studio 組裝陣列並蒐索文件系統

這實際上給出了一些結果 - 它能夠掃描並在我組裝的 RAID 卷上找到一個 EXT4 文件系統,我可以瀏覽文件,但文件中只顯示了我的實際文件的一個子集(如 10 個)觀眾。我嘗試切換設備順序,雖然其中 4 種組合使 R-Studio 檢測到 ext4 文件系統(就像上面一樣),但只有原始設置(sda、sdb、缺失)使 R-studio 能夠發現任何文件從驅動器的根目錄。

嘗試使用 -o sb=XXXXX 掛載,指向另一個超級塊

這給了我與未指定超級塊位置相同的錯誤。

嘗試過調試

當我輸入“ls”時,這給了我 IO 錯誤

以下是導致問題的上述操作的日誌消息。

關閉作為降級 RAID5 執行的系統,但文件系統仍在工作。

2017-02-25T18:13:27+01:00 DiskStation umount: kill the process "synoreport" [pid = 15855] using /volume1/@appstore/StorageAnalyzer/usr/syno/synoreport/synoreport
2017-02-25T18:13:28+01:00 DiskStation umount: can't umount /volume1: Device or resource busy
2017-02-25T18:13:28+01:00 DiskStation umount: can't umount /volume1: Device or resource busy
2017-02-25T18:13:28+01:00 DiskStation umount: SYSTEM:   Last message 'can't umount /volume' repeated 1 times, suppressed by syslog-ng on DiskStation
2017-02-25T18:13:28+01:00 DiskStation syno_poweroff_task: lvm_poweroff.c:49 Failed to /bin/umount -f -k /volume1
2017-02-25T18:13:29+01:00 DiskStation syno_poweroff_task: lvm_poweroff.c:58 Failed to /sbin/vgchange -an
2017-02-25T18:13:29+01:00 DiskStation syno_poweroff_task: raid_stop.c:28 Failed to mdadm stop '/dev/md2'
2017-02-25T18:13:29+01:00 DiskStation syno_poweroff_task: syno_poweroff_task.c:331 Failed to stop RAID [/dev/md2]

備註“未能停止 RAID” - 這是問題的可能原因嗎?

刪除 disk2 (sdb) 後首次啟動

2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.467975] set group disks wakeup number to 5, spinup time deno 1
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.500561] synobios: unload
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.572388] md: invalid raid superblock magic on sda5
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.578043] md: sda5 does not have a valid v0.90 superblock, not importing!
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.627381] md: invalid raid superblock magic on sdc5
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.633034] md: sdc5 does not have a valid v0.90 superblock, not importing!
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.663832] md: sda2 has different UUID to sda1
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.672513] md: sdc2 has different UUID to sda1
2017-02-25T18:15:27+01:00 DiskStation kernel: [   10.784571] Got empty serial number. Generate serial number from product.


2017-02-25T18:15:41+01:00 DiskStation spacetool.shared: raid_allow_rmw_check.c:48 fopen failed: /usr/syno/etc/.rmw.md3
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.339243] md/raid:md2: not enough operational devices (2/3 failed)
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.346371] md/raid:md2: raid level 5 active with 1 out of 3 devices, algorithm 2
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.355295] md: md2: set sda5 to auto_remap [1]
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.355299] md: reshape of RAID array md2
2017-02-25T18:15:41+01:00 DiskStation spacetool.shared: spacetool.c:1223 Try to force assemble RAID [/dev/md2]. [0x2000 file_get_key_value.c:81]
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.414839] md: md2: reshape done.
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.433218] md: md2: set sda5 to auto_remap [0]
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.494964] md: md2: set sda5 to auto_remap [0]
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.549962] md/raid:md2: not enough operational devices (2/3 failed)
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.557093] md/raid:md2: raid level 5 active with 1 out of 3 devices, algorithm 2
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.566069] md: md2: set sda5 to auto_remap [1]
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.566073] md: reshape of RAID array md2
2017-02-25T18:15:41+01:00 DiskStation spacetool.shared: raid_allow_rmw_check.c:48 fopen failed: /usr/syno/etc/.rmw.md2
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.633774] md: md2: reshape done.
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.645025] md: md2: change number of threads from 0 to 1
2017-02-25T18:15:41+01:00 DiskStation kernel: [   31.645033] md: md2: set sda5 to auto_remap [0]
2017-02-25T18:15:41+01:00 DiskStation spacetool.shared: spacetool.c:3023 [Info] Old vg path: [/dev/vg1000], New vg path: [/dev/vg1000], UUID: [Fund9t-vUVR-3yln-QYVk-8gtv-z8Wo-zz1bnF]
2017-02-25T18:15:41+01:00 DiskStation spacetool.shared: spacetool.c:3023 [Info] Old vg path: [/dev/vg1001], New vg path: [/dev/vg1001], UUID: [FHbUVK-5Rxk-k6y9-4PId-cSMf-ztmU-DfXYoL]

2017-02-25T18:22:50+01:00 DiskStation umount: can't umount /volume2: Invalid argument
2017-02-25T18:22:50+01:00 DiskStation syno_poweroff_task: lvm_poweroff.c:49 Failed to /bin/umount -f -k /volume2
2017-02-25T18:22:50+01:00 DiskStation kernel: [  460.374192] md: md2: set sda5 to auto_remap [0]
2017-02-25T18:22:50+01:00 DiskStation kernel: [  460.404747] md: md3: set sdc5 to auto_remap [0]
2017-02-25T18:28:01+01:00 DiskStation umount: can't umount /initrd: Invalid argument

再次啟動,disk2 (sdb) 再次出現

2017-02-25T18:28:17+01:00 DiskStation spacetool.shared: raid_allow_rmw_check.c:48 fopen failed: /usr/syno/etc/.rmw.md3
2017-02-25T18:28:17+01:00 DiskStation kernel: [   32.442352] md: kicking non-fresh sdb5 from array!
2017-02-25T18:28:17+01:00 DiskStation kernel: [   32.478415] md/raid:md2: not enough operational devices (2/3 failed)
2017-02-25T18:28:17+01:00 DiskStation kernel: [   32.485547] md/raid:md2: raid level 5 active with 1 out of 3 devices, algorithm 2
2017-02-25T18:28:17+01:00 DiskStation spacetool.shared: spacetool.c:1223 Try to force assemble RAID [/dev/md2]. [0x2000 file_get_key_value.c:81]
2017-02-25T18:28:17+01:00 DiskStation kernel: [   32.515567] md: md2: set sda5 to auto_remap [0]
2017-02-25T18:28:18+01:00 DiskStation kernel: [   32.602256] md/raid:md2: raid level 5 active with 2 out of 3 devices, algorithm 2
2017-02-25T18:28:18+01:00 DiskStation spacetool.shared: raid_allow_rmw_check.c:48 fopen failed: /usr/syno/etc/.rmw.md2
2017-02-25T18:28:18+01:00 DiskStation kernel: [   32.654279] md: md2: change number of threads from 0 to 1
2017-02-25T18:28:18+01:00 DiskStation spacetool.shared: spacetool.c:3023 [Info] Old vg path: [/dev/vg1000], New vg path: [/dev/vg1000], UUID: [Fund9t-vUVR-3yln-QYVk-8gtv-z8Wo-zz1bnF]
2017-02-25T18:28:18+01:00 DiskStation spacetool.shared: spacetool.c:3023 [Info] Old vg path: [/dev/vg1001], New vg path: [/dev/vg1001], UUID: [FHbUVK-5Rxk-k6y9-4PId-cSMf-ztmU-DfXYoL]
2017-02-25T18:28:18+01:00 DiskStation spacetool.shared: spacetool.c:3030 [Info] Activate all VG

2017-02-25T18:28:18+01:00 DiskStation synovspace: virtual_space_conf_check.c:78 [INFO] "PASS" checking configuration of virtual space [FCACHE], app: [1]
2017-02-25T18:28:18+01:00 DiskStation synovspace: virtual_space_conf_check.c:74 [INFO] No implementation, skip checking configuration of virtual space [HA]
2017-02-25T18:28:18+01:00 DiskStation synovspace: virtual_space_conf_check.c:74 [INFO] No implementation, skip checking configuration of virtual space [SNAPSHOT_ORG]
2017-02-25T18:28:18+01:00 DiskStation synovspace: vspace_wrapper_load_all.c:76 [INFO] No virtual layer above space: [/volume2] / [/dev/vg1001/lv]
2017-02-25T18:28:18+01:00 DiskStation synovspace: vspace_wrapper_load_all.c:76 [INFO] No virtual layer above space: [/volume1] / [/dev/vg1000/lv]
2017-02-25T18:28:19+01:00 DiskStation kernel: [   33.792601] BTRFS: has skinny extents
2017-02-25T18:28:19+01:00 DiskStation kernel: [   34.009184] JBD2: no valid journal superblock found
2017-02-25T18:28:19+01:00 DiskStation kernel: [   34.014673] EXT4-fs (dm-0): error loading journal
mount: wrong fs type, bad option, bad superblock on /dev/vg1000/lv,
      missing codepage or helper program, or other error

      In some cases useful info is found in syslog - try
      dmesg | tail or so.
quotacheck: Mountpoint (or device) /volume1 not found or has no quota enabled.
quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option.
quotaon: Mountpoint (or device) /volume1 not found or has no quota enabled.
2017-02-25T18:28:19+01:00 DiskStation synocheckhotspare: synocheckhotspare.c:149 [INFO] No hotspare config, skip hotspare config check. [0x2000 virtual_space_layer_get.c:98]
2017-02-25T18:28:19+01:00 DiskStation synopkgctl: pkgtool.cpp:3035 package AudioStation is not installed or not operable

請注意它如何首先說存在 3 個設備中的 1 個,但隨後強制組裝它,因此組裝了 RAID 陣列,然後嘗試安裝它,但出現 EXT4 安裝錯誤。

嘗試在此體驗後重新啟動,沒有幫助

2017-02-25T18:36:45+01:00 DiskStation spacetool.shared: raid_allow_rmw_check.c:48 fopen failed: /usr/syno/etc/.rmw.md3
2017-02-25T18:36:45+01:00 DiskStation kernel: [   29.579136] md/raid:md2: raid level 5 active with 2 out of 3 devices, algorithm 2
2017-02-25T18:36:45+01:00 DiskStation spacetool.shared: raid_allow_rmw_check.c:48 fopen failed: /usr/syno/etc/.rmw.md2
2017-02-25T18:36:45+01:00 DiskStation kernel: [   29.629837] md: md2: change number of threads from 0 to 1
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3023 [Info] Old vg path: [/dev/vg1000], New vg path: [/dev/vg1000], UUID: [Fund9t-vUVR-3yln-QYVk-8gtv-z8Wo-zz1bnF]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3023 [Info] Old vg path: [/dev/vg1001], New vg path: [/dev/vg1001], UUID: [FHbUVK-5Rxk-k6y9-4PId-cSMf-ztmU-DfXYoL]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3030 [Info] Activate all VG
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3041 Activate LVM [/dev/vg1000]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3041 Activate LVM [/dev/vg1001]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3084 space: [/dev/vg1000]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3084 space: [/dev/vg1001]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3110 space: [/dev/vg1000], ndisk: [2]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: spacetool.c:3110 space: [/dev/vg1001], ndisk: [1]
2017-02-25T18:36:46+01:00 DiskStation spacetool.shared: hotspare_repair_config_set.c:36 Failed to hup synostoraged
2017-02-25T18:36:46+01:00 DiskStation synovspace: virtual_space_conf_check.c:78 [INFO] "PASS" checking configuration of virtual space [FCACHE], app: [1]
2017-02-25T18:36:46+01:00 DiskStation synovspace: virtual_space_conf_check.c:74 [INFO] No implementation, skip checking configuration of virtual space [HA]
2017-02-25T18:36:46+01:00 DiskStation synovspace: virtual_space_conf_check.c:74 [INFO] No implementation, skip checking configuration of virtual space [SNAPSHOT_ORG]
2017-02-25T18:36:46+01:00 DiskStation synovspace: vspace_wrapper_load_all.c:76 [INFO] No virtual layer above space: [/volume2] / [/dev/vg1001/lv]
2017-02-25T18:36:46+01:00 DiskStation synovspace: vspace_wrapper_load_all.c:76 [INFO] No virtual layer above space: [/volume1] / [/dev/vg1000/lv]
2017-02-25T18:36:47+01:00 DiskStation kernel: [   30.799110] BTRFS: has skinny extents
2017-02-25T18:36:47+01:00 DiskStation kernel: [   30.956115] JBD2: no valid journal superblock found
2017-02-25T18:36:47+01:00 DiskStation kernel: [   30.961585] EXT4-fs (dm-0): error loading journal
mount: wrong fs type, bad option, bad superblock on /dev/vg1000/lv,
      missing codepage or helper program, or other error

      In some cases useful info is found in syslog - try
      dmesg | tail or so.
quotacheck: Mountpoint (or device) /volume1 not found or has no quota enabled.
quo

在完全破壞不斷增長的 RAID5 之後,我是如何保存數據的!

我有一個 3 磁碟 RAID5 陣列,缺少 3 號設備,並且數據似乎已損壞。

/dev/sdd5: (5.45 TiB) 6TB,陣列的設備 1

/dev/sde5:(5.45 TiB)6TB,陣列的設備 2

陣列正在從 RAID1 轉換到 RAID5,此時操作被中斷並且設備 3 被移除。陣列仍在執行,直到設備 2 也被移除。放回設備 2 後,無法掛載文件系統。/dev/md2 設備被複製,並在複製的分區上執行 fsck,發現數百萬個錯誤。

在中斷轉換和移除磁碟後,MD 顯然沒有正確處理 RAID 數據。我去調查發生了什麼事:

首先,我看了看,/var/log/space_operation_error.log它告訴我到底發生了什麼。移除磁碟 2 後,RAID 將其狀態更改為損壞,因為 3 磁碟 RAID5 無法使用 1 個磁碟執行。但這也讓 RAID 忘記了它正在進行的從 RAID1 到 RAID5 的重塑。

因此,我認為數據損壞可能是由於MD將整個數據視為RAID5編碼,而其中一部分仍處於原始狀態。

檢查設備的 RAID 數據對我沒有幫助,一切看起來都很好:

# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md124 : active raid5 sda5[0] sdb5[1]
     11711575296 blocks super 1.2 level 5, 64k chunk, algorithm 2 [3/2] [UU_]

# mdadm -E /dev/sda5
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : 58290cba:75757ee2:86fe074c:ada2e6d2
          Name : DiskStation:2
 Creation Time : Thu Nov 27 11:35:34 2014
    Raid Level : raid5
  Raid Devices : 3

Avail Dev Size : 11711575680 (5584.51 GiB 5996.33 GB)
    Array Size : 23423150592 (11169.03 GiB 11992.65 GB)
 Used Dev Size : 11711575296 (5584.51 GiB 5996.33 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : 1a222812:ac39920b:4cec73c4:81aa9b63

   Update Time : Fri Mar 17 23:14:25 2017
      Checksum : cb34324c - correct
        Events : 31468

        Layout : left-symmetric
    Chunk Size : 64K

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

但我認為它必須有某種計數器,以便在重塑時跟踪其進度。我研究了 MD 超級塊的格式,在這裡描述: https ://raid.wiki.kernel.org/index.php/RAID_superblock_formats

我複制了一個 RAID 分區的前 10 MiB 副本(mdadm -E 不適用於較小的副本):

# dd if=/dev/sda5 of=/volume1/homes/sda5_10M.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0622844 s, 168 MB/s

我在 HEX 編輯器中打開它,並將字節 4104 處的數據從 0x00 更改為 0x04,以表明正在進行整形。

改變狀態

我還注意到從 4200 開始的 8 個字節的值。它讀取為 3856372992。

重塑位置

保存更改後,我檢查了副本:

# mdadm -E /volume1/homes/sda5_10M.img
/volume1/homes/sda5_10M.img:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x4
    Array UUID : 58290cba:75757ee2:86fe074c:ada2e6d2
          Name : DiskStation:2
 Creation Time : Thu Nov 27 11:35:34 2014
    Raid Level : raid5
  Raid Devices : 3

Avail Dev Size : 11711575680 (5584.51 GiB 5996.33 GB)
    Array Size : 23423150592 (11169.03 GiB 11992.65 GB)
 Used Dev Size : 11711575296 (5584.51 GiB 5996.33 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : 1a222812:ac39920b:4cec73c4:81aa9b63

 Reshape pos'n : 1928186496 (1838.86 GiB 1974.46 GB)
 Delta Devices : 1 (2->3)

   Update Time : Fri Mar 17 23:14:25 2017
      Checksum : cb34324c - expected cb343250
        Events : 31468

        Layout : left-symmetric
    Chunk Size : 64K

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

如您所見,它報告了重塑進度的確切位置——這也告訴我之前得到的數字是 512 字節扇區的數量。

現在知道第一個 1838.86 GiB 在整形過程中被覆蓋,我假設其餘的分區沒有被觸及。

因此,我決定組裝一個塊設備,從新的 RAID5 部分和未觸及的部分,在報告的 repape 位置切割(閱讀下面關於假設位置的註釋)。由於數據偏移量是 2048 個扇區,所以我需要在 size 上加上 1024KiB,以獲得原始分區部分的偏移量:

#losetup -f --show /dev/md124 --sizelimit=1928186496K
/dev/loop0

#losetup -f --show /dev/sda5 --offset=1928187520K 
/dev/loop1

為了組裝這些元件,我創建了一個沒有元數據的 JBOD 設備:

# mdadm --build --raid-devices=2 --level=linear /dev/md9 /dev/loop0 /dev/loop1
mdadm: array /dev/md9 built and started.

然後我檢查了新的 /dev/md9 設備的內容

# file -s /dev/md9
/dev/md9: LVM2 PV (Linux Logical Volume Manager), UUID: xmhBdx-uED6-hN53-HOeU-ONy1-29Yc-VfIDQt, size: 5996326551552

由於 RAID 包含一個 LVM 卷,我需要跳過前 576KiB 來訪問 ext4 文件系統:

# losetup -f --show /dev/md9 --offset=576K
/dev/loop2

# file -s /dev/loop2
/dev/loop2: Linux rev 1.0 ext4 filesystem data, UUID=8e240e88-4d2b-4de8-bcaa-0836f9b70bb5, volume name "1.42.6-5004" (errors) (extents) (64bit) (large files) (huge files)

現在我將文件系統掛載到我的 NAS 上的共享文件夾中:

# mount -o ro,noload /dev/loop2 /volume1/homes/fixraid/

而且我的文件是可以訪問的!

在我決定上面使用的頭寸大小/偏移量之前,我嘗試了幾個值。我的第一個想法是,由於每台設備的 1838.86 GiB 被重新整形,RAID5 部分將包含約 3.6 TiB 的有效數據,我使用的位置是整形位置的兩倍。它安裝得很好,但我的一些文件似乎包含無效數據,一些文件在讀取時出現 I/O 錯誤,並且一些文件夾失去。

由於我有很多 NEF(尼康)格式的 RAW 照片,我決定使用文件工具測試其中的一些。

預期結果:

# file DSC_7421.NEF
DSC_7421.NEF: TIFF image data, little-endian, direntries=28, height=120, bps=352, compression=none, PhotometricIntepretation=RGB, manufacturer=NIKON CORPORATION, model=NIKON D750, orientation=upper-left, width=160

數據損壞時的結果:

# file DSC_9974.NEF
DSC_9974.NEF: data

ls當我在某些文件夾中寫入時,我也遇到了一些 IO 錯誤。

我決定查看我的一些大型照片集並測試它們的完整性 - 首先列出文件併計算輸出中的行數。然後應將任何讀取錯誤寫入螢幕。接下來,通過檢查是否有任何 NEF 文件無法辨識,表明數據已損壞。我過濾了文件的輸出併計算了過濾後的行數。

# ls *.NEF -1 | wc -l
3641
# file *.NEF | grep "NEF: data" | wc -l
0

我對我的很多照片文件夾都這樣做了,以確保所有文件都是可讀的並且它們的內容被辨識。

使用 3856372992K 大小和 3856374016K 偏移量,我得到了很多無效數據和失去的文件/文件夾,我嘗試了其他幾個值。

我發現上面提到的偏移量和大小,似乎通過了我的小測試。!

如上所示,文件系統報告了一些錯誤。由於我不想在一切恢復之前將任何數據寫入我的設備,因此我決定製作快照寫入覆蓋,因此 fsck.ext4 所做的所有寫入都將寫入此文件。

製作一個 50GiB 的稀疏文件

# truncate /volume1/overlay.img -s50G

製作虛擬設備

#losetup -f --show /volume1/overlay.img 
/dev/loop3

使用數據獲取設備的大小:

# blockdev --getsz /dev/loop2
11711574528

創建覆蓋設備(在此之前,我已經在 /dev/loop2 解除安裝了文件系統)

# dmsetup create overlay --table "0 11711574528 snapshot /dev/loop2 /dev/loop3 P 8"

該設備可在/dev/mapper/overlay

最後我可以檢查並修復錯誤:

# fsck.ext4 -y -C 0 /dev/mapper/overlay

請注意,修復僅寫入覆蓋文件,如果它們應該是永久性的,則需要送出到物理磁碟。

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