
우선, 몇 가지 관련 질문이 있습니다.
내 상황은 다음과 같습니다.
- Linux(Debian 테스트, 3.14 커널)를 설치하기 위한 가상 머신(VBox)을 만듭니다.
- BTRFS 부팅 파티션 1개, LUKS BTRFS 루트 파티션 1개.
- 속도를 위해 VM에서 IO 집중 수정을 수행합니다.
- 설치를 USB 플래시 드라이브로 전송합니다.
나의 초기 시도는 VM에서 플래시 드라이브와 동일한 크기의 하드 디스크를 사용하는 것이었습니다 dd
. 어떤 이유로 부팅 파티션의 UUID를 검색할 수 없으므로 플래시 드라이브 부팅에 사용됩니다.
EXT4의 부팅 파티션과 LUKS BTRFS의 루트 파티션을 사용하여 플래시 드라이브를 수동으로 분할하면 UUID 검색이 전체적으로 잘 작동합니다. 그런 다음 rsync -aEXS --progress
마운트된 각 파티션(VM 이미지 -> 플래시 드라이브)에서 파일을 전송했습니다 . 나는 파일 시스템 UUID를 업데이트하기 위해 chroot
플래시 드라이브에 접속하고 grub-install
플래시 드라이브 장치에서 실행했습니다. update-grub
이것은 작동하지 않았습니다. 루트를 얻기 위해 암호화된 파티션을 올바르게 감지/사용할 수 없습니다. 나는 update-initramfs -u
성공하지 못했습니다.
이 시나리오를 수행하기 위해 내가 놓쳤거나 더 잘할 수 있었던 것은 무엇입니까?
답변1
원래 단계는 대부분 정확했지만 어떤 이유로 initrd가 계속 손상되었습니다. 동일한 작업에 관심이 있는 모든 사람을 위한 작업 시나리오로 이어지는 모든 단계가 아래에 요약되어 있습니다.
- 원하는 대로 가상 머신을 생성합니다.
- 원하는 파티션 레이아웃을 사용하여 Linux를 설치하고 원하는 대로 모두 변경합니다. 이 경우 BTRFS 부팅 파티션과 LUKS 암호화된 BTRFS 루트 파티션으로 구성됩니다. 전송 중에 참조를 적절하게 업데이트하도록 주의를 기울이면 다른 레이아웃도 작동할 것입니다.
- 설치된 시스템에 오프라인으로 액세스할 수 있도록 Linux 라이브 ISO를 사용하여 이전 VM을 부팅합니다.
- 전송을 위해 USB 플래시 드라이브를 VM에 연결합니다. (참고: 설치된 드라이브의 이미지를 생성
dd
하고 VM 외부에 저장하면 일반 Linux 시스템에서 사용할 수 있습니다.) - 플래시 드라이브 파티션을 준비합니다.
- 옵션: 원본 이미지를 플래시 드라이브에 저장하고 7단계로 건너뛴 다음 10단계로 건너뜁니다. (참고: 제 경우에는 부팅 UUID를 열거할 수 없는
dd
알 수 없는 이유로 파티션을 다시 만들어야 했던 것 같습니다.blkid
BTRFS 파티션.) - 옵션: 원래 파티션과 동일한 UUID를 사용하여 새 파티션을 만듭니다.
/dev/sda1
부팅 및/dev/sda2
루트를 가정합니다 .- BTRFS 부팅 파티션의 경우:
sudo mkfs.btrfs -f -L BOOT -U <original UUID> /dev/sda1
- LUKS 루트 파티션의 경우:
sudo cryptsetup --uuid=<original UUID> luksFormat /dev/sda2
- 루트 파티션 매핑:
sudo cryptsetup --allow-discards open --type luks /dev/sda2 flash_luks
- BTRFS를 사용하여 루트 형식을 지정합니다.
sudo mkfs.btrfs -f -L ROOT -U <original UUID> /dev/mapper/flash_luks
- BTRFS 부팅 파티션의 경우:
- 옵션: 새 UUID를 사용하여 새 파티션을 만듭니다. 옵션 2와 동일한 단계를 반복하되 UUID/uuid와 관련된 인수를 제거합니다. .
sudo blkid
- 옵션: 원본 이미지를 플래시 드라이브에 저장하고 7단계로 건너뛴 다음 10단계로 건너뜁니다. (참고: 제 경우에는 부팅 UUID를 열거할 수 없는
- 원본 이미지 파티션을 마운트합니다.
- 각 파티션에 대해 읽기 전용 루프백 장치를 만듭니다
sudo kpartx -ar <flash dd image file>
. kpartx가 loop0에 연결되어 있다고 가정합니다. - 마운트 지점에 대한 디렉터리를 만듭니다.
sudo mkdir -p /media/orig_boot /media/orig_root
- 신병:
sudo mount -r /dev/mapper/loop0p1 /media/orig_boot
- 루트 LUKS:
sudo cryptsetup -r open --type luks /dev/mapper/loop0p2 orig_luks
- 뿌리:
sudo mount -r /dev/mapper/orig_luks /media/orig_root
- 각 파티션에 대해 읽기 전용 루프백 장치를 만듭니다
- 플래시 드라이브 파티션을 마운트합니다. 부팅을 가정합니다
/dev/sda1
.- 마운트 지점에 대한 디렉터리를 만듭니다.
sudo mkdir -p /media/flash_boot /media/flash_root
- 신병:
sudo mount -t btrfs -o nodiratime,noatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_boot
- 루트(이전에 cryptsetup을 사용하여 이미 매핑되었다고 가정):
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/mapper/flash_luks /media/flash_root
- 마운트 지점에 대한 디렉터리를 만듭니다.
- 내용 복사:
- 신병:
sudo rsync -aEXS --progress /media/orig_boot/ /media/flash_boot
- 뿌리:
sudo rsync -aEXS --progress /media/orig_root/ /media/flash_root
- 신병:
- 원본 이미지를 마운트 해제합니다.
- 뿌리:
sudo umount /media/orig_root
- 루트 LUKS:
sudo cryptsetup close orig_luks
- 신병:
sudo umount /media/orig_boot
- kpartx:
sudo kpartx -d <flash dd image file>
- 뿌리:
- 플래시 드라이브에 Chroot를 추가합니다.
- 바인드
/sys
:sudo mount --bind /sys /media/flash_root/sys
- 바인드
/dev
:sudo mount --bind /dev /media/flash_root/dev
- 바인드
/dev/pts
:sudo mount --bind /dev/pts /media/flash_root/dev/pts
- 바인드
/proc
:sudo mount --bind /proc /media/flash_root/proc
- 부팅 마운트 해제:
sudo umount /media/flash_boot
- 루트 내부에 다시 마운트합니다.
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_root/boot
- Chroot:
sudo chroot /media/flash_root
- 바인드
- 업데이트
/etc/fstab
.- 부팅 라인:
UUID=<btrfs boot uuid> /boot btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 2
- 루트 라인:
UUID=<btrfs root uuid> / btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 1
- 부팅 라인:
- 업데이트
/etc/crypttab
:flash_luks UUID=<luks root uuid> none discard,luks
- 설치
btrfs-tools
(설치되지 않은 경우):sudo apt-get install btrfs-tools
- 부팅 항목을 업데이트합니다.
- Initrd(마운트하기 전에 필요한 사항을 결정하고 부팅 시 LUKS 비밀번호를 묻는 메시지를 표시하기 위해 fstab/crypttab을 사용합니다.):
sudo update-initramfs -u -k all
(참고: 를 사용하여 모든 initrd를 다시 생성할 수 있지만sudo update-initramfs -c -k all
확실하게 시도하지는 않았습니다.) - Grub(fstab을 사용하여 커널 부팅 옵션을 업데이트하고 올바른 파티션을 마운트함):
sudo update-grub
- MBR에 grub을 설치합니다(가정
/dev/sda
):sudo grub-install --recheck /dev/sda
- chroot 종료:
exit
- Initrd(마운트하기 전에 필요한 사항을 결정하고 부팅 시 LUKS 비밀번호를 묻는 메시지를 표시하기 위해 fstab/crypttab을 사용합니다.):
- 모든 것을 마운트 해제합니다.
sudo umount /media/flash_root/boot
sudo umount /media/flash_root/proc
sudo umount /media/flash_root/dev/pts
sudo umount /media/flash_root/dev
sudo umount /media/flash_root/sys
sudo umount /media/flash_root
sudo cryptsetup close flash_luks