Linux

LVM 文件系統恢復

  • August 15, 2015

我試圖在此https://wiki.archlinux.org/index.php/Resizing_LVM-on-LUKS之後調整我的 LUKS crypt的大小,然後我用 parted 和嚴重搞砸了事情來調整分區大小。我輸入870了新的尺寸,忘了在最後加一個 G。它把我的分區縮小到870M我立即調整它的大小,870G但到那時損壞已經完成。幸運的是,我仍然可以解密 LUKS crypt,但我的邏輯卷甚至無法在系統上擁有設備文件。LVM 將捲辨識為存在並顯示它附加到的設備文件,但該文件不存在並且顯示它沒有文件系統。我做到了vgscan --mknodes,它成功生成了設備文件,但是testdisk仍然不會顯示它。我重新創建了卷並在其上放置了一個新的 ext4 文件系統,現在testdisk將顯示驅動器,但掃描沒有產生任何結果。我得到一大堆 ext4 條目,但它們要麼都說不能打開文件系統要麼找不到文件。無論如何我可以恢復磁碟上的文件系統嗎?我不想向它寫入任何數據,直到我從中得到什麼,除非那是不可能的。

編輯:在探索了我需要幫助的真實事情之後,我需要從以前的 ext4 文件系統中恢復文件。我的驅動器上有一個 ext4 系統,該系統已被新系統覆蓋,但舊系統中的所有數據仍然存在,如sudo dd if=/dev/Storage/Storage bs=1M | strings -fn 16. 搞砸後我唯一做的就是安裝了一個新的 ext4 FS,沒有別的,所以我的大部分數據可能仍然完好無損。我需要恢復那些數據。

pvdisplay顯示以下

--- Physical volume ---
PV Name               /dev/mapper/Storage
VG Name               Storage
PV Size               931.51 GiB / not usable 3.68 MiB
Allocatable           yes (but full)
PE Size               4.00 MiB
Total PE              238466
Free PE               0
Allocated PE          238466
PV UUID               CAueGx-Glzx-zCd0-H00m-R8d5-KTRc-9Ff7ay

--- Physical volume ---
PV Name               /dev/mapper/sda3_crypt
VG Name               mint-vg
PV Size               118.50 GiB / not usable 0   
Allocatable           yes 
PE Size               4.00 MiB
Total PE              30336
Free PE               10
Allocated PE          30326
PV UUID               UJJfu8-S2Ac-pEZl-PlPa-uUzJ-axEs-ckbDWG

我的備份顯示

# Generated by LVM2 version 2.02.98(2) (2012-10-15): Thu Aug 13 20:45:52 2015

contents = "Text Format Volume Group"
version = 1

description = "Created *before* executing '/sbin/lvreduce --config log{command_names=0} -f -l 217600 /dev/Storage/Storage'"

creation_host = "desktop"   # Linux desktop 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64
creation_time = 1439523952  # Thu Aug 13 20:45:52 2015

Storage {
    id = "lM3S9T-inH1-mKsq-5doN-H8hT-zO3F-LF9jDx"
   seqno = 2
   format = "lvm2" # informational
   status = ["RESIZEABLE", "READ", "WRITE"]
   flags = []
   extent_size = 8192      # 4 Megabytes
   max_lv = 256
   max_pv = 256
   metadata_copies = 0

   physical_volumes {

       pv0 {
           id = "nH1Axo-5nBo-WcyA-Xc4E-KwRt-K0Ib-ScK8Ch"
           device = "/dev/mapper/Storage"  # Hint only

           status = ["ALLOCATABLE"]
           flags = []
           dev_size = 1953520999   # 931.511 Gigabytes
           pe_start = 2048
           pe_count = 238466   # 931.508 Gigabytes
       }
   }

   logical_volumes {

       Storage {
           id = "Qb01kz-y1RG-PVQp-cGjB-sj77-xgnJ-w9kn3n"
           status = ["READ", "WRITE", "VISIBLE"]
           flags = []
           creation_host = "desktop"
           creation_time = 1436247513  # 2015-07-06 22:38:33 -0700
           segment_count = 1

           segment1 {
               start_extent = 0
               extent_count = 238466   # 931.508 Gigabytes

               type = "striped"
               stripe_count = 1    # linear

               stripes = [
                   "pv0", 0
               ]
           }
       }
   }
}

您無法通過將大小恢復到原始大小來修復 LVM,除非您非常幸運並且 LV 由於之前的大小調整而沒有任何碎片。新的 LV 可能會擁有20G您原始文件系統的第一個左右,但剩餘的780G(或其他)是炒雞蛋(錯誤的數據、錯誤的偏移量、錯誤的順序)。

這是假設您使用的是 HDD 媒體。如果它是 SSD,issue_discards=1在你的lvm.conf中,數據就會消失,這就是我從不使用這個選項的原因。

您必須檢查/etc/lvm/{archive,backup}/元數據的舊版本。那裡的每個文件都說明了它的創建時間,例如:

description = "Created *before* executing 'lvremove HDD/mdtest1'"

你正在尋找那個說失踪Created before lvresize 850的人。G然後vgcfgrestore使用該備份的 LVM 元數據,希望它能夠恢復正常工作。

如果您在 中沒有此類文件/etc/lvm,或者是因為您從失去此數據的 Live CD 執行此操作,或者您的根 LV 上發生損壞,事情會變得更加複雜,因為您必須希望磁碟上的 LVM 元數據能夠在其循環緩衝區中包含這段歷史。

粗略的方法來看看那裡可能有什麼:

dd if=/dev/pvdevice bs=1M count=1 | strings -w -n 16

引用自:https://unix.stackexchange.com/questions/223177