충돌 후 비영구 DM 스냅샷에서 데이터를 복구할 수 있습니까?

충돌 후 비영구 DM 스냅샷에서 데이터를 복구할 수 있습니까?

저는 종종 비영구적 장치 매퍼 스냅샷을 사용합니다. 샘플 테이블은 다음과 같습니다.

0 10485760 snapshot /dev/sdc3 /dev/sdc6 N 16

충돌이 발생하더라도 디스크는 비휘발성 /dev/sdc3이므로 두 가지를 모두 가지고 있습니다. 하지만 장치를 다시 가져오거나 적어도 어떻게든 변경 사항을 되돌릴 /dev/sdc6수 있습니까 ? 내 목적을 위해 영구 스냅샷이 존재한다는 것을 알고 있지만 여전히 궁금합니다. 감사해요.snapshot/dev/sdc6

답변1

이것은 정말 불가능합니다. 일부 데이터가 아직 남아 있을 수 있지만 파일 시스템에서는 이해가 되지 않습니다.


스냅샷은 블록 장치를 특정 블록 크기의 데이터 블록으로 처리합니다. 쓰기가 들어오면 영향을 받는 각 블록을 스냅샷 장치에 복사하여 보존합니다.

파일 시스템 쓰기는 일반적으로 상당히 무작위이므로 순서에 관계없이 발생할 수 있습니다. 복사된 블록은 서로 다른 오프셋에서 종료됩니다.

따라서 스냅샷은 메타데이터를 저장하며 메타데이터는 (이전 오프셋 <-> 새 오프셋) 사이의 관계입니다.

임시 스냅샷의 경우 스토리지는 메모리에만 존재합니다. 스냅샷을 재부팅하거나 비활성화하면 해당 스냅샷이 손실됩니다.


이 메타데이터가 없다면 무엇을 얻게 될까요?

기본적으로 "무작위 데이터 덩어리"를 보고 있는 것입니다.

해당 스냅샷 장치를 되찾으려면 복사된 각 블록의 원래 오프셋을 어떻게든 확인할 수 있어야 합니다.

그러나 이것은 일반적으로 불가능합니다. 이 덩어리가 원래 어디서 왔는지 알 수 없습니다. 이것이 블록인지 아니면 스냅샷이 생성되기 전에 존재했던 오래된 데이터인지조차 알 수 없습니다.

이 난제를 해결할 수 있더라도 스냅샷이 활성화되지 않은 동안 원래 장치에 더 이상 쓰기가 발생하지 않는 경우에만 작동합니다. 장치가 읽기-쓰기로 마운트되고 스냅샷에 없는 데이터 블록을 덮어쓰면 더 이상 메타데이터가 손실되지 않습니다. 데이터가 누락되었습니다.

그래서 전체적으로 그것은 회복 불가능한 것으로 간주되었습니다.


예외가 가능합니다.

여러 청크가 순서대로 복사되거나 찾고 있는 데이터가 단일 청크에 들어갈 만큼 작은 경우 운이 좋게도 해당 데이터를 찾을 수 있습니다. 마찬가지로 운이 좋다면 실패한 raid5 세트의 단일 디스크에서 무언가를 복구할 수 있습니다(단일 데이터 블록을 저장할 수 있을 만큼 작은 경우). 파일 시스템의 도움 없이 일부 데이터를 복구하려는 경우.

자체 오프셋을 알고 있는 데이터가 있을 수 있습니다. 예를 들어 출력을 hexdump -C블록 장치 에 쓴 다음 스냅샷을 찍는 경우입니다 . hexdump는 데이터에서 오프셋을 파생할 수 있도록 각 행의 오프셋을 인쇄합니다. hexdump가 어떤 줄도 건너뛰지 않았다고 가정하면...

전체 디스크 암호화(LUKS)를 사용하고 전체 LUKS 장치의 스냅샷을 찍는 경우. 스냅샷에는 완전히 무작위(암호화된) 데이터 블록이 포함됩니다. LUKS는 해당 데이터의 오프셋도 모르지만 LUKS 헤더가 있고 키를 알고 있는 한 무작위가 아닌 데이터로 해독되는 오프셋을 찾으면 모든 오프셋에서 모든 블록을 해독하려고 시도할 수 있습니다. 수량이라면 이것이 정확할 것입니다. 그러나 이는 암호화된 모든 데이터가 일반 텍스트라고 가정합니다. 임의의 데이터를 암호화하면 어느 쪽이든 알 수 없습니다.

쓰기가 무작위가 아니라 완전히 결정적인 사용 사례인 경우 새 스냅샷에서 동일한 작업을 반복하여 메타데이터를 재현할 수 있습니다. dd를 사용하여 탐색 및 계산을 통해 데이터를 어떤 순서로 기록하는지 알고 있다면 그렇게 하는 것이 가능할 수도 있습니다.

그러나 이는 일반적으로 실제로 발생하지 않는 상황입니다. 그것은 잘 작동하지 않습니다. 이 작업을 수행하는 데 도움이 되는 도구는 없습니다.

관련 정보