
Primero que nada, algunas preguntas relacionadas:
- ¿Cómo pasar de una unidad a otra de diferente tamaño?
- ¿Qué utilidad puede mover mi partición de arranque de Windows a otro disco duro?
Mi situación es la siguiente:
- Cree una máquina virtual (VBox) para instalar Linux (pruebas de Debian, kernel 3.14).
- Una partición de arranque BTRFS, una partición raíz LUKS BTRFS.
- Realice modificaciones intensivas de IO en la VM para aumentar la velocidad.
- Transfiera la instalación a una unidad flash USB.
Mi intento inicial fue usar un disco duro en la VM del mismo tamaño que la unidad flash y todo dd
. Por alguna razón, el UUID de la partición de inicio no se puede recuperar y, por lo tanto, no se puede utilizar para iniciar en la unidad flash.
Si particiono la unidad flash manualmente con una partición de arranque de EXT4 y una partición raíz de LUKS BTRFS, la recuperación de UUID funciona bien en todos los aspectos. Luego solía rsync -aEXS --progress
transferir los archivos desde cada partición montada (imagen de VM -> unidad flash). Ingresé chroot
a la unidad flash y ejecuté grub-install
el dispositivo de la unidad flash, además de update-grub
actualizar los UUID del sistema de archivos. Esto no funcionó. No pudo detectar/usar correctamente la partición cifrada para obtener root. Lo intenté update-initramfs -u
sin éxito.
¿Qué me perdí o qué podría haber hecho mejor para realizar este escenario?
Respuesta1
Los pasos originales fueron en su mayoría correctos, pero por alguna razón, seguía terminando con un initrd corrupto. A continuación se resumen todos los pasos que deberían dar como resultado un escenario de trabajo para cualquier persona interesada en hacer lo mismo:
- Cree una máquina virtual como desee.
- Instale Linux usando el diseño de partición deseado y realice todos los cambios deseados. En este caso, consta de una partición de arranque BTRFS y una partición raíz BTRFS cifrada con LUKS. Otros diseños deberían funcionar si se tiene cuidado de actualizar adecuadamente las referencias durante la transferencia.
- Inicie la máquina virtual anterior utilizando una ISO activa de Linux para poder acceder al sistema instalado sin conexión.
- Conecte una unidad flash USB a la VM para la transferencia. (Nota: puede crear una
dd
imagen de la unidad instalada y guardarla fuera de la VM, que luego podrá usar desde un sistema Linux normal). - Prepare las particiones de la unidad flash.
- Opción:
dd
la imagen original en la unidad flash y salte al paso 7, luego al paso 10. (Nota: en mi caso parece haber sido necesario recrear las particiones por una razón desconocida en la queblkid
no pude enumerar el UUID del archivo de arranque). partición BTRFS.) - Opción: cree nuevas particiones utilizando los mismos UUID que las originales. Asumiendo
/dev/sda1
para arranque y/dev/sda2
root.- Para la partición de arranque BTRFS:
sudo mkfs.btrfs -f -L BOOT -U <original UUID> /dev/sda1
- Para la partición raíz LUKS:
sudo cryptsetup --uuid=<original UUID> luksFormat /dev/sda2
- Asignar partición raíz:
sudo cryptsetup --allow-discards open --type luks /dev/sda2 flash_luks
- Formatee la raíz usando BTRFS:
sudo mkfs.btrfs -f -L ROOT -U <original UUID> /dev/mapper/flash_luks
- Para la partición de arranque BTRFS:
- Opción: cree nuevas particiones utilizando nuevos UUID. Repita los mismos pasos que la Opción 2, pero elimine los argumentos relacionados con UUID/uuid. Tome nota de los nuevos UUID usando
sudo blkid
.
- Opción:
- Montar particiones de imágenes originales.
- Cree dispositivos de bucle invertido de sólo lectura para cada partición:
sudo kpartx -ar <flash dd image file>
. Suponiendo que kpartx se conecte al loop0. - Cree directorios para puntos de montaje:
sudo mkdir -p /media/orig_boot /media/orig_root
- Bota:
sudo mount -r /dev/mapper/loop0p1 /media/orig_boot
- LUKS raíz:
sudo cryptsetup -r open --type luks /dev/mapper/loop0p2 orig_luks
- Raíz:
sudo mount -r /dev/mapper/orig_luks /media/orig_root
- Cree dispositivos de bucle invertido de sólo lectura para cada partición:
- Monte las particiones de la unidad flash. Asumiendo
/dev/sda1
para arrancar.- Cree directorios para puntos de montaje:
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
- Raíz (suponiendo que ya se haya mapeado usando cryptsetup anteriormente):
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/mapper/flash_luks /media/flash_root
- Cree directorios para puntos de montaje:
- Copiar contenido:
- Bota:
sudo rsync -aEXS --progress /media/orig_boot/ /media/flash_boot
- Raíz:
sudo rsync -aEXS --progress /media/orig_root/ /media/flash_root
- Bota:
- Desmontar la imagen original.
- Raíz:
sudo umount /media/orig_root
- LUKS raíz:
sudo cryptsetup close orig_luks
- Bota:
sudo umount /media/orig_boot
- kpartx:
sudo kpartx -d <flash dd image file>
- Raíz:
- Chroot en una unidad flash.
- Unir
/sys
:sudo mount --bind /sys /media/flash_root/sys
- Unir
/dev
:sudo mount --bind /dev /media/flash_root/dev
- Unir
/dev/pts
:sudo mount --bind /dev/pts /media/flash_root/dev/pts
- Unir
/proc
:sudo mount --bind /proc /media/flash_root/proc
- Desmontar el arranque:
sudo umount /media/flash_boot
- Volver a montar dentro de la raíz:
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_root/boot
- Chroot:
sudo chroot /media/flash_root
- Unir
- Actualizar
/etc/fstab
.- Línea de arranque:
UUID=<btrfs boot uuid> /boot btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 2
- Línea raíz:
UUID=<btrfs root uuid> / btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 1
- Línea de arranque:
- Actualizar
/etc/crypttab
:flash_luks UUID=<luks root uuid> none discard,luks
- Instalar
btrfs-tools
(si no está instalado):sudo apt-get install btrfs-tools
- Actualiza el material de arranque.
- Initrd (hace uso de fstab/crypttab para decidir qué se necesita antes del montaje y solicitar la contraseña de LUKS en el arranque):
sudo update-initramfs -u -k all
(Nota: puede recrear todos los initrds usandosudo update-initramfs -c -k all
, pero no lo intenté para estar seguro). - Grub (hace uso de fstab para actualizar las opciones de arranque del kernel y montar las particiones correctas):
sudo update-grub
- Instale grub en MBR (asumiendo
/dev/sda
):sudo grub-install --recheck /dev/sda
- Salir de chroot:
exit
- Initrd (hace uso de fstab/crypttab para decidir qué se necesita antes del montaje y solicitar la contraseña de LUKS en el arranque):
- Desmonta todo.
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