나는루크스(Linux 통합 키 설정) rootfs가 포함된 파티션입니다. 동일한 rootfs가 포함된 암호화되지 않은 ext4 파티션으로 교체하고 싶습니다. 광범위하게 검색한 결과 이 프로세스에 도움이 될 수 있는 도구가 없습니다. 내가 놓친 게 무엇입니까?
그렇지 않다면 해결책은 무엇입니까? LUKS 파티션 삭제를 사용 parted
하고 ext4 파티션을 생성한 후 여기에 rootfs를 복사하시겠습니까?
답변1
이것은높은위험한 작업이므로 극도의 주의를 기울여 수행해야 합니다.
가장 간단한 수준에는 다음과 같은 유틸리티가 있습니다.cryptsetup-재암호화이 작업은 허용됩니다. 매뉴얼 페이지에는 다음과 같이 명확하게 명시되어 있습니다.
WARNING: The cryptsetup-reencrypt program is not resistant to
hardware or kernel failures during reencryption (you can lose your
data in this case).
ALWAYS BE SURE YOU HAVE RELIABLE BACKUP BEFORE USING THIS TOOL.
The reencryption can be temporarily suspended (by TERM signal or by
using ctrl+c) but you need to retain temporary files named
LUKS-<uuid>.[log|org|new]. LUKS device is unavailable until
reencryption is finished though.
매뉴얼 페이지의 "예제" 섹션에 따르면:
Remove LUKS encryption completely
cryptsetup-reencrypt /dev/sdb1 --decrypt
이 작업은 "실시간" 환경에서 수행되어야 할 수도 있습니다(다음에서 제공하는 대로 완전히 실행되는 임시 Linux 환경을 의미함).페도라 장면또는우분투 라이브.
이 워크플로의 대안으로 데이터를 백업하고 파티션을 삭제한 후 다시 생성하여 보다 명시적인 접근 방식을 취할 수도 있습니다. Arch Linux는 이 작업 흐름과 추가 문제 해결 단계에 대한 훌륭한 문서를 제공합니다.
https://wiki.archlinux.org/index.php/Removing_System_Encryption
다시 한번 말씀드리지만, 이는 단순한 작업이 아니며 치명적인 오류가 발생할 경우 모든 데이터를 백업하는 것이 중요합니다.
답변2
@BrianRedbeard가 말했듯이 이를 위한 도구가 있습니다( cryptsetup-reencrypt
). 관련 문서를 주의 깊게 읽으십시오. 이것은 위험한 작업입니다. (내부 데이터 변환의 경우 항상 그렇습니다. 한 단계만 잘못하면 모든 것이 손실됩니다.)
재미를 위해 수동 프로세스를 수행합니다.
실제로는 매우 간단합니다(그리고작동하지 않습니다.다른 방향으로! ). 실제로 다음과 같이 복사할 수 있습니다.
pv < /dev/mapper/cryptsdx1 > /dev/sdx1
그러나 동일한 물리적 장치에서 읽고 쓰기 때문에 dd
블록 크기를 사용하는 것이 더 빠를 수 있습니다(충분한 RAM이 있는 경우). HDD에서는 조회 횟수가 적고 조회 속도가 느리기 때문에 속도가 더 빠를 수 있습니다.
dd status=progress bs=1G iflag=fullblock if=/dev/mapper/cryptsdx1 of=/dev/sdx1
하지만 먼저 LUKS 헤더를 백업해야 합니다. LUKS 헤더는 이 프로세스 중에 가장 먼저 덮어쓰게 되며 원하더라도 복원할 수 없기 때문입니다.
cryptsetup luksHeaderBackup /dev/sdx1 --header-backup-file myluksheader.backup
그리고 백업이 LiveCD 환경의 RAM에만 저장되지 않고 안전한지 확인하세요.
LUKS 장치는 기본적으로 다음과 같습니다.
| LUKS HEADER | ENCRYPTED DATA |
pv/dd 이후에는 다음과 같아야 합니다:
| DECRYPTED DATA | FREE SPACE |
따라서 LUKS 헤더는 장치 시작 부분에 있으며 크기는 약 2MiB입니다(이전에는 1MiB에 몇 개의 섹터를 더한 크기). 제거하므로 장치 끝에 여유 공간이 생기고 파일 시스템을 2MiB 늘릴 수 있습니다. 아야!
따라서 데이터 자체는 오프셋(보통 2MiB, 확인 cryptsetup luksDump
)에서 찾을 수 있습니다. 여기서 이 오프셋은 중요합니다. 이는 데이터를 해독해야 할 뿐만 아니라 이동해야 함을 의미합니다. 해독 시작은 LUKS 헤더가 원래 저장된 위치에서 발생합니다.
이는 또한 프로세스 전반에 걸쳐 암호 해독 및 암호화 형태로 겹치는 영역이 있음을 의미합니다. 이는 머신이 충돌하여 복구 지점을 찾아야 하는 경우에 유용합니다.
그렇다면 교통사고를 당했다면 어떻게 해야 할까요?
먼저 백업을 사용하여 암호화된 장치를 다시 생성해야 합니다.
cryptsetup --header myluksheader.backup luksOpen /dev/sdx1 cryptsdx1
그런 다음 겹치는 점을 찾으십시오.
skip=0 # or skip=X if you're sure at least X bytes were copied
step=$((1024*1024)) # 1MiB, use 512KiB for old 1MiB headers (offset / 2)
while ! cmp --bytes=$step /dev/sdx1 /dev/mapper/cryptsdx1 $skip $skip
do
skip=$(($skip+$step))
done
cmp --bytes=$step /dev/sdx1 /dev/mapper/cryptsdx1 $skip $skip && echo $skip || echo fail
마지막으로 계속하십시오.
dd status=progress bs=1G iflag=fullblock,skip_bytes oflag=seek_bytes \
skip=$skip seek=$skip if=/dev/mapper/cryptsdx1 of=/dev/sdx1
실제 파일 시스템에서 두 방법 중 하나를 사용하기 전에 관련 없는 파티션(또는 루프 장치)에서 연습을 실행하여 여전히 작동하는지 확인하는 것이 좋습니다.
예를 들어, 여기서는 기본 형식에서 동일하게 작동하지만(4MiB 헤더) 여러 데이터 세그먼트 등과 같은 이상한 항목을 지원하는 새로운 LUKS2 형식을 고려하지 않습니다. 따라서 그러한 기능을 사용하는 경우에는 약간 복잡합니다( cryptsetup-reencrypt
아직 다루지 않은 것 같습니다).