다른 파티션을 사용하여 한 드라이브에서 다른 드라이브로 Linux OS 전송

다른 파티션을 사용하여 한 드라이브에서 다른 드라이브로 Linux OS 전송

우선, 몇 가지 관련 질문이 있습니다.

내 상황은 다음과 같습니다.

  1. Linux(Debian 테스트, 3.14 커널)를 설치하기 위한 가상 머신(VBox)을 만듭니다.
  2. BTRFS 부팅 파티션 1개, LUKS BTRFS 루트 파티션 1개.
  3. 속도를 위해 VM에서 IO 집중 수정을 수행합니다.
  4. 설치를 USB 플래시 드라이브로 전송합니다.

나의 초기 시도는 VM에서 플래시 드라이브와 동일한 크기의 하드 디스크를 사용하는 것이었습니다 dd. 어떤 이유로 부팅 파티션의 UUID를 검색할 수 없으므로 플래시 드라이브 부팅에 사용됩니다.

EXT4의 부팅 파티션과 LUKS BTRFS의 루트 파티션을 사용하여 플래시 드라이브를 수동으로 분할하면 UUID 검색이 전체적으로 잘 작동합니다. 그런 다음 rsync -aEXS --progress마운트된 각 파티션(VM 이미지 -> 플래시 드라이브)에서 파일을 전송했습니다 . 나는 파일 시스템 UUID를 업데이트하기 위해 chroot플래시 드라이브에 접속하고 grub-install플래시 드라이브 장치에서 실행했습니다. update-grub이것은 작동하지 않았습니다. 루트를 얻기 위해 암호화된 파티션을 올바르게 감지/사용할 수 없습니다. 나는 update-initramfs -u성공하지 못했습니다.

이 시나리오를 수행하기 위해 내가 놓쳤거나 더 잘할 수 있었던 것은 무엇입니까?

답변1

원래 단계는 대부분 정확했지만 어떤 이유로 initrd가 계속 손상되었습니다. 동일한 작업에 관심이 있는 모든 사람을 위한 작업 시나리오로 이어지는 모든 단계가 아래에 요약되어 있습니다.

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

관련 정보