Transferindo o sistema operacional Linux de uma unidade para outra com partições diferentes

Transferindo o sistema operacional Linux de uma unidade para outra com partições diferentes

Em primeiro lugar, algumas questões relacionadas:

Minha situação é a seguinte:

  1. Crie uma máquina virtual (VBox) para instalar o Linux (teste Debian, kernel 3.14).
  2. Uma partição de inicialização BTRFS, uma partição raiz LUKS BTRFS.
  3. Faça modificações intensivas de IO na VM para obter velocidade.
  4. Transfira a instalação para uma unidade flash USB.

Minha tentativa inicial foi usar um disco rígido na VM do mesmo tamanho do pen drive e tudo ddmais. Por algum motivo, o UUID da partição de inicialização não pode ser recuperado e, portanto, usado para inicializar na unidade flash.

Se eu particionar a unidade flash manualmente com uma partição de inicialização do EXT4 e uma partição raiz do LUKS BTRFS, a recuperação do UUID funcionará bem. Em seguida, transferi rsync -aEXS --progressos arquivos de cada partição montada (imagem VM -> unidade flash). Entrei chrootna unidade flash e executei grub-installno dispositivo da unidade flash, além de update-grubatualizar os UUIDs do sistema de arquivos. Isso não funcionou. Não foi possível detectar/usar corretamente a partição criptografada para obter root. Eu tentei update-initramfs -usem sucesso.

O que perdi ou poderia ter feito melhor para realizar esse cenário?

Responder1

As etapas originais estavam quase corretas, mas por algum motivo, acabei com um initrd corrompido. Abaixo estão resumidas todas as etapas que devem resultar em um cenário de trabalho para qualquer pessoa interessada em fazer o mesmo:

  1. Crie uma máquina virtual conforme desejado.
  2. Instale o Linux usando o layout de partição desejado e faça todas as alterações desejadas. Neste caso, consiste em uma partição de inicialização BTRFS e uma partição raiz BTRFS criptografada por LUKS. Outros layouts devem funcionar se for tomado cuidado para atualizar adequadamente as referências durante a transferência.
  3. Inicialize a VM anterior usando um ISO ativo do Linux para que você possa acessar o sistema instalado offline.
  4. Anexe uma unidade flash USB à VM para a transferência. (Observação: você pode criar uma ddimagem da unidade instalada e salvá-la fora da VM, que poderá ser usada em um sistema Linux normal.)
  5. Prepare as partições da unidade flash.
    1. Opção: dda imagem original na unidade flash e pule para a etapa 7 e depois para a etapa 10. (Nota: parece ter sido necessário no meu caso recriar as partições por um motivo desconhecido, onde blkidnão foi possível enumerar o UUID da inicialização partição BTRFS.)
    2. Opção: Crie novas partições usando os mesmos UUIDs das originais. Assumindo /dev/sda1para boot e /dev/sda2para root.
      1. Para partição de inicialização BTRFS:sudo mkfs.btrfs -f -L BOOT -U <original UUID> /dev/sda1
      2. Para partição raiz LUKS:sudo cryptsetup --uuid=<original UUID> luksFormat /dev/sda2
      3. Partição raiz do mapa:sudo cryptsetup --allow-discards open --type luks /dev/sda2 flash_luks
      4. Formate a raiz usando BTRFS:sudo mkfs.btrfs -f -L ROOT -U <original UUID> /dev/mapper/flash_luks
    3. Opção: Crie novas partições usando novos UUIDs. Repita as mesmas etapas da Opção 2, mas remova os argumentos relacionados ao UUID/uuid. Anote os novos UUIDs usando sudo blkid.
  6. Monte partições de imagem originais.
    1. Crie dispositivos de loopback somente leitura para cada partição: sudo kpartx -ar <flash dd image file>. Supondo que kpartx seja anexado ao loop0.
    2. Crie diretórios para pontos de montagem:sudo mkdir -p /media/orig_boot /media/orig_root
    3. Bota:sudo mount -r /dev/mapper/loop0p1 /media/orig_boot
    4. Raiz LUKS:sudo cryptsetup -r open --type luks /dev/mapper/loop0p2 orig_luks
    5. Raiz:sudo mount -r /dev/mapper/orig_luks /media/orig_root
  7. Monte partições da unidade flash. Assumindo /dev/sda1para inicialização.
    1. Crie diretórios para pontos de montagem:sudo mkdir -p /media/flash_boot /media/flash_root
    2. Bota:sudo mount -t btrfs -o nodiratime,noatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_boot
    3. Root (assumindo que já foi mapeado usando cryptsetup anteriormente):sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/mapper/flash_luks /media/flash_root
  8. Copiar conteúdo:
    1. Bota:sudo rsync -aEXS --progress /media/orig_boot/ /media/flash_boot
    2. Raiz:sudo rsync -aEXS --progress /media/orig_root/ /media/flash_root
  9. Desmonte a imagem original.
    1. Raiz:sudo umount /media/orig_root
    2. Raiz LUKS:sudo cryptsetup close orig_luks
    3. Bota:sudo umount /media/orig_boot
    4. kpartx:sudo kpartx -d <flash dd image file>
  10. Chroot na unidade flash.
    1. Vincular /sys:sudo mount --bind /sys /media/flash_root/sys
    2. Vincular /dev:sudo mount --bind /dev /media/flash_root/dev
    3. Vincular /dev/pts:sudo mount --bind /dev/pts /media/flash_root/dev/pts
    4. Vincular /proc:sudo mount --bind /proc /media/flash_root/proc
    5. Desmontar inicialização:sudo umount /media/flash_boot
    6. Remontar dentro da raiz:sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_root/boot
    7. Raiz:sudo chroot /media/flash_root
  11. Atualizar /etc/fstab.
    1. Linha de inicialização:UUID=<btrfs boot uuid> /boot btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 2
    2. Linha raiz:UUID=<btrfs root uuid> / btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 1
  12. Atualizar /etc/crypttab:flash_luks UUID=<luks root uuid> none discard,luks
  13. Instale btrfs-tools(se não estiver instalado):sudo apt-get install btrfs-tools
  14. Atualize as coisas de inicialização.
    1. Initrd (faz uso de fstab/crypttab para decidir o que é necessário antes da montagem e para solicitar a senha do LUKS na inicialização): sudo update-initramfs -u -k all(Nota: você pode recriar todos os initrds usando sudo update-initramfs -c -k all, mas não tentei fazer isso para ter certeza.)
    2. Grub (faz uso do fstab para atualizar as opções de inicialização do kernel e montar as partições corretas):sudo update-grub
    3. Instale o grub no MBR (assumindo /dev/sda):sudo grub-install --recheck /dev/sda
    4. Saia do chroot:exit
  15. Desmonte tudo.
    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

informação relacionada