
Em primeiro lugar, algumas questões relacionadas:
- Como passar de uma unidade para outra de tamanho diferente?
- Qual utilitário pode mover minha partição de inicialização do Windows para outro disco rígido?
Minha situação é a seguinte:
- Crie uma máquina virtual (VBox) para instalar o Linux (teste Debian, kernel 3.14).
- Uma partição de inicialização BTRFS, uma partição raiz LUKS BTRFS.
- Faça modificações intensivas de IO na VM para obter velocidade.
- 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 dd
mais. 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 --progress
os arquivos de cada partição montada (imagem VM -> unidade flash). Entrei chroot
na unidade flash e executei grub-install
no dispositivo da unidade flash, além de update-grub
atualizar 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 -u
sem 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:
- Crie uma máquina virtual conforme desejado.
- 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.
- Inicialize a VM anterior usando um ISO ativo do Linux para que você possa acessar o sistema instalado offline.
- Anexe uma unidade flash USB à VM para a transferência. (Observação: você pode criar uma
dd
imagem da unidade instalada e salvá-la fora da VM, que poderá ser usada em um sistema Linux normal.) - Prepare as partições da unidade flash.
- Opção:
dd
a 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, ondeblkid
não foi possível enumerar o UUID da inicialização partição BTRFS.) - Opção: Crie novas partições usando os mesmos UUIDs das originais. Assumindo
/dev/sda1
para boot e/dev/sda2
para root.- Para partição de inicialização BTRFS:
sudo mkfs.btrfs -f -L BOOT -U <original UUID> /dev/sda1
- Para partição raiz LUKS:
sudo cryptsetup --uuid=<original UUID> luksFormat /dev/sda2
- Partição raiz do mapa:
sudo cryptsetup --allow-discards open --type luks /dev/sda2 flash_luks
- Formate a raiz usando BTRFS:
sudo mkfs.btrfs -f -L ROOT -U <original UUID> /dev/mapper/flash_luks
- Para partição de inicialização BTRFS:
- 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
.
- Opção:
- Monte partições de imagem originais.
- Crie dispositivos de loopback somente leitura para cada partição:
sudo kpartx -ar <flash dd image file>
. Supondo que kpartx seja anexado ao loop0. - Crie diretórios para pontos de montagem:
sudo mkdir -p /media/orig_boot /media/orig_root
- Bota:
sudo mount -r /dev/mapper/loop0p1 /media/orig_boot
- Raiz LUKS:
sudo cryptsetup -r open --type luks /dev/mapper/loop0p2 orig_luks
- Raiz:
sudo mount -r /dev/mapper/orig_luks /media/orig_root
- Crie dispositivos de loopback somente leitura para cada partição:
- Monte partições da unidade flash. Assumindo
/dev/sda1
para inicialização.- Crie diretórios para pontos de montagem:
sudo mkdir -p /media/flash_boot /media/flash_root
- Bota:
sudo mount -t btrfs -o nodiratime,noatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_boot
- 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
- Crie diretórios para pontos de montagem:
- Copiar conteúdo:
- Bota:
sudo rsync -aEXS --progress /media/orig_boot/ /media/flash_boot
- Raiz:
sudo rsync -aEXS --progress /media/orig_root/ /media/flash_root
- Bota:
- Desmonte a imagem original.
- Raiz:
sudo umount /media/orig_root
- Raiz LUKS:
sudo cryptsetup close orig_luks
- Bota:
sudo umount /media/orig_boot
- kpartx:
sudo kpartx -d <flash dd image file>
- Raiz:
- Chroot na unidade flash.
- Vincular
/sys
:sudo mount --bind /sys /media/flash_root/sys
- Vincular
/dev
:sudo mount --bind /dev /media/flash_root/dev
- Vincular
/dev/pts
:sudo mount --bind /dev/pts /media/flash_root/dev/pts
- Vincular
/proc
:sudo mount --bind /proc /media/flash_root/proc
- Desmontar inicialização:
sudo umount /media/flash_boot
- Remontar dentro da raiz:
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_root/boot
- Raiz:
sudo chroot /media/flash_root
- Vincular
- Atualizar
/etc/fstab
.- Linha de inicialização:
UUID=<btrfs boot uuid> /boot btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 2
- Linha raiz:
UUID=<btrfs root uuid> / btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 1
- Linha de inicialização:
- Atualizar
/etc/crypttab
:flash_luks UUID=<luks root uuid> none discard,luks
- Instale
btrfs-tools
(se não estiver instalado):sudo apt-get install btrfs-tools
- Atualize as coisas de inicialização.
- 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 usandosudo update-initramfs -c -k all
, mas não tentei fazer isso para ter certeza.) - Grub (faz uso do fstab para atualizar as opções de inicialização do kernel e montar as partições corretas):
sudo update-grub
- Instale o grub no MBR (assumindo
/dev/sda
):sudo grub-install --recheck /dev/sda
- Saia do chroot:
exit
- 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):
- Desmonte tudo.
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