lvremove로 삭제 된 논리 볼륨을 복구하는 방법


12

CentOS 5.5에 있고 Xen을 실행하고 있습니다. lvcreate를 사용하여 논리 볼륨을 만드는 큰 볼륨 그룹이 있습니다. 오늘 고객이 계정을 취소 한 후 약 한 시간 후에 마음이 바뀌 었습니다. 불행히도 나는 Xen 이미지가 있던 LVM을 이미 제거했습니다. (표준 lvremove 사용). 그 이후로이 디스크에 다른 LVM 작업이 없었습니다 (추가되거나 삭제 된 항목 없음). lvremove를 "실행 취소"하거나 논리 볼륨을 복구 할 수 있습니까? 그렇다면 어떻게해야합니까?

답변:


13

LVM은 메타 데이터를 /etc/lvm/backup및에 백업합니다 /etc/lvm/archive. 각 파일의 맨 위에는 파일이 생성 된 시간 / 데이터가 표시되므로 LV를 삭제하기 전과 같이 이전 메타 데이터의 사본을 가질 수 있습니다. 메타 데이터가 변경 될 때마다 백업이 자동이라고 생각합니다.

다음은 위험 하고 파괴적 일 수 있으므로 매우주의하고 가능한 경우 전체 백업을 수행하십시오.

이러한 볼륨 그룹 메타 데이터 백업을 복원하는 명령은 vgcfgrestore입니다. vgcfgbackup/ etc / lvm / backup 또는 / etc에있는 파일을 변경하지 않도록 -f 플래그와 함께 명령을 사용하여 기존 작업 구성의 현재 사본 을 작성하여 출력에 다른 파일을 지정하십시오. / lvm / archive 폴더 현재 구성을 복원하려는 구성과 비교하여 적용하려는 변경 사항 만 최근에 삭제 된 LV를 다시 작성하는 것임을 확인하십시오. 데이터를 전체 백업하는 것은 나쁜 생각이 아닙니다. 내가 직접 할 필요가 없었기 때문에 계속 진행하기 전에 지원 계약을 체결 한 경우 Linux 공급 업체에 지원 /지도를 문의하는 것이 좋습니다.

행운을 빕니다.


1
vgcfgrestore를 자세히 살펴보면 시도하기 전에 해당 상자의 모든 VM을 종료해야하거나 전체 어레이가 손상 될 수 있습니다. 귀하의 지시 사항이 효과가있는 것으로 보이므로 답변을 수락하지만 데이터는 위험할만한 가치가 없습니다. 감사합니다
John P

@ 존 P 그래 VM과 같은 종류의 생각과 그와 같은 환경에서 이것은 어려운 일이라고 생각합니다. 아마도 계정을 제거하는 절차에는 30 일의 삭제 기간이 필요하지 않을 것입니다.
3dinfluence

18

"백업 파일에서 EFROM 및 ETO를 좀 더 구체적으로 찾을 수 있을까요? 모든 lv의 백업 파일에 0에서"start_extend "가 0이므로 조금 잃어 버렸습니다 :) 감사합니다! – user186975 Aug 24 '13 at 17 : 06 "

좋아, 논리 볼륨을 복구하는 가장 간단한 방법으로 매우 구체적입니다.

예:

1-논리 볼륨을 제거했습니다!

$ sudo lvremove /dev/vg1/debian.root

2-가장 먼저 할 일은 /etc/lvm/archive/vg1_(xxxxx).vg에서 아카이브 파일을 찾으십시오. 논리 볼륨을 제거한 날짜를 보면서 그렇게 할 수 있습니다!

$ sudo ls -l /etc/lvm/archive |more

3- 찾았어요!

-rw------- 1 root root 16255 Mar 20 14:29 vg1_00223-235991429.vg
-rw------- 1 root root 16665 Mar 20 16:49 vg1_00224-748876387.vg
-rw------- 1 root root 17074 Mar 20 16:49 vg1_00225-931666169.vg
-rw------- 1 root root 17482 Mar 20 16:50 vg1_00226-1238302012.vg
-rw------- 1 root root 18081 **Mar 20 21:57 vg1_00227-2048533959.vg**

내가 lvremove를 한 날짜 !!! ... 분 전 ..

4-파일을 보자!

$ sudo head /etc/lvm/archive/vg1_00227-2048533959.vg
*# Generated by LVM2 version 2.02.95(2) (2012-03-06): Thu Mar 20 21:57:58 2014
contents = "Text Format Volume Group"
version = 1
description = **"Created *before* executing 'lvremove /dev/vg1/debian.root'"**
creation_host = "server"    # Linux server 3.8.0-35-generic #50-Ubuntu SMP Tue Dec 3 01:24:59 UTC 2013 x86_64
creation_time = 1395363478  # Thu Mar 20 21:57:58 2014*

5-복구하기 전에 테스트하십시오!

$ sudo vgcfgrestore vg1 --test -f /etc/lvm/archive/vg1_00227-2048533959.vg
Test mode: Metadata will NOT be updated and volumes will not be
(de)activated.   **Restored volume group vg1**

6-이제 (--test)없이 명령 행을 반복하십시오.

$ sudo vgcfgrestore vg1 -f /etc/lvm/archive/vg1_00227-2048533959.vg
**Restored volume group vg1**

7-확인하세요!

$ sudo lvscan |grep debian
ACTIVE            '/dev/vg1/debian.root' [7,81 GiB] inherit

8-논리가 활성화되지 않은 경우 수행하십시오!

$ sudo lvchange -a y /dev/vg1/debian.root 

전부다

이것이 이것이이 솔루션을 찾고있는 다른 사람들을 도울 수 있기를 바랍니다!


5

lvremove에서 복구하는 가장 쉬운 방법은 LV가 상주하는 범위까지 쓰지 않았다고 가정하는 것입니다.

/ etc / lvm / archive에서 메타 데이터 백업을 찾아서 확인하십시오.

a) LV가 상주하는 범위 (EFROM, ETO)
b) LV가 상주 한 PV 및 사용중인 해당 PV를 확장하는 범위 (PFROM, PTO)

이 정보를 얻은 후에는 LV의 첫 8kB지우지 않고 정확히 동일한 PV 확장에서 똑같은 크기의 새 LV를 만듭니다 .

lvcreate --extents EFROM-ETO --zero n --name customer007 YOUR-VG-NAME /dev/yourpv:PFROM-PTO

1
백업 파일에서 EFROM 및 ETO를보다 구체적으로 찾을 수 있습니까? 모든 lv에는 백업 파일에 0의 "start_extend"가 있으므로 약간 손실됩니다. :) 감사합니다!

3

(이전에 thermoman이 대답했듯이) 삭제 된 LVM 볼륨을 쉽게 다시 만드는 방법은 lvcreate 를 사용 하여 볼륨 을 0 으로 만들지 않고 디스크에서 동일한 위치에 있는지 확인하는 것입니다. (써모 맨의 대답 명령은 작동하지 않았습니다.)

/ etc / lvm / archive에서 파일을 읽어 삭제하기 전과 같이 삭제 된 논리 볼륨의 크기와 위치를 확인하십시오. 볼륨의 크기에 extent_countsegment1(또는 합 segment*/extent_count은 여러 범위를 가지고있는 경우의 값). stripes물리 볼륨 별명 (예 :) 뒤에 섹션에 위치가 pv0있습니다.

예를 들어, 볼륨 섹션은 다음과 같습니다.

    physical_volumes {
            pv0 {
                    device = "/dev/somedisk" # Hint only
                    ...
            }
    }

    logical_volumes {
            ...
            example {
                    ...
                    segment_count = 1

                    segment1 {
                            start_extent = 0
                            extent_count = 1024     # 4 Gigabytes

                            type = "striped"
                            stripe_count = 1        # linear

                            stripes = [
                                    "pv0", 30720
                            ]
                    }
            }
            ...
    }

example볼륨 의 크기 는 1024였으며 30720에서 시작하여 / dev / somedisk에있었습니다.

마지막 범위를 시작 + 크기 -1 = 30720 + 1024-1 = 31743으로 계산하십시오. 다음과 같이 해당 볼륨 문제를 재현하십시오.

lvcreate --extents 1024 --zero n --name example vgname /dev/somedisk:30720-31743

이 답변은 방금 어제 밤을 구했습니다! API 오류로 인해 잘못된 LV를 삭제하는 XenServer가 손상되었습니다 ... : o
Elektordi

2

나는 비슷한 상황을 겪었다. 원하는 LV를 포함하는 모든 PV가 있었지만 VG에서 누락 된 PV와 0 LV가 나타났습니다. 나는 다음을 수행하여 회복했다.

  1. 루트가 되십시오
  2. pvs모든 드라이브에 대한 UUID를 수집하기 위해 실행하십시오 .
  3. 동일한 UUID를 모두 나열한 파일을 찾을 때까지 / etc / lvm / archive의 파일을 검토하십시오.
  4. 아카이브 된 구성 파일의 작업 사본을 작성하고 편집을 시작하십시오.
  5. 에서 physical_volumes섹션 설정 device =/ UUID가에 의해보고 현재 장치에 맞게 라인을 pvs, 어떤 취소 "MISSING"플래그를, 및 제거 pvN실제로 실종 된 섹션을.
  6. 에서 logical_volumes섹션에 줄무늬를 가지고 있던 명부 제거 pvN더 이상 존재하지 섹션을.
  7. 그게 다됐다.

    vgcfgrestore --test vg -f /root/dangerously_edited.vg

  8. 그것이 효과가 있었을 때, 나는 --test선택 의 여지 없이 다시 뛰었다 .

PVs sdg 및 sdh로 VG를 확장하여 특정 상황을 달성했습니다. 그런 다음 /dev/sdg /dev/sdh새 LV가 해당 드라이브에 있음을 알 수 있도록 명령 행에 새 LV를 작성했습니다 . 그런 다음 해당 드라이브 만 새 컴퓨터로 옮겼습니다. 오래된 머신은 누락 된 드라이브에 대해 매우 화가 났으며, 드라이브를 강제로 제거하면 모든 LV도 제거되었습니다. 버머.

다음에는 물론이 문제를 피하기 위해 새로운 VG를 만들겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.