Hace varias semanas, en la web de Lignux.com, los amigos Alex y Jinkros publicaron 2 post que, por mi parte, considero muy buenos.
Se trataba cómo crear un USB Multiboot, para arrancar diversas distribuciones GNU/Linux, y usando únicamente Grub2, es decir, sin hacer uso de programas dedicados que, como sabéis, los han muy buenos (multisystem, Yumi,...)
Jinkros describía el proceso de creación del USB en cuestión: formateo, transferir el GRUB2 para permitir arranque tantos en modo BIOS como en UEFI, esctructura de carpetas, copiar las ISO de las distribuciones elegidas y finalmente adaptar el archivo grub.cfg para que todas ellas fueran instalables.
Alex, por su parte, añadía una vuelta de tuerca, y describía cómo hacer lo mismo, pero primero generando lo que podríamos llamar un USB Virtual, es decir, generar una imagen de disco y hacer todo el proceso anterior sobre ella para, una vez comprobado que todo funciona, volcarlo al USB físico.
¿¿Ventaja de hacerlo como dice Alex??: pues que las pruebas podemos hacerlas sin tener que estar reiniciando el PC constantemente.
Como digo, los artículos son insuperables, por lo que no voy a repetir los mismos pasos.
Considero de obligada lectura los mismos:
- Particionar imagen de disco, para pruebas
- Proceso de creación manual del USB multiboot
En este sencillo post voy a indicar cómo administro y gestiono el llamado USB Virtual (imagen de disco para hacer pruebas), y cómo, después de comprobar que todo funciona correctamente, lo transfiero al USB físico.
Después de haber seguido los pasos anteriores es importante saber que:
- la imagen de disco (imagen_prueba.img) que hemos creado tiene todo:
- está formateada en Fat32
- tiene las particiones que necesita, y los archivos ya copiados
- para hacer uso de ella en cualquier Sistema (yo tengo varios), y poder editarla, sólo es necesario hacer lo siguiente:
- crear el dispositivo de bucle (loop) para el sistema en el que estamos en dicho momento
- entrar en "parted" y activar la primera partición como arranque
- montar el dispositivo, para hacerlo accesible a editarlo, etc...
Pasos:
sudo losetup /dev/loop0 /media/Datos/virtualUSB/imagen_prueba.img
sudo parted /dev/loop0
> (parted) set 1 boot on
Antes de salir de "parted" podemos comprobar que todo ha quedado correcto: para ello ponemos las unidades en 'mib' y luego listamos las particiones con 'p'.
En la imagen podéis ver que yo he creado una imagen de disco de 16 GB.
Si queremos acceder a nuestro USB Virtual, por ejemplo para añadir/borrar alguna ISO, simplemente tenemos que montar la partición activa. Una forma rápida es:
$ udisksctl mount --block-device /dev/loop0p1 (no se necesita privilegios root)
Ahora ya sabemos dónde está montado y vemos el UUID de la citada partición.
Con el explorador de archivos correspondiente podemos acceder a dicha ruta y realizar las modificaciones que consideremos pertinentes.
Siempre vamos a poder probar nuestro USB Virtual mediante QEMU.
En mi caso (estoy en un PC sin UEFI) voy a probar el arranque BIOS:
$ qemu-system-x86_64 \
-k es \
-vga std \
-m 2048 \
-hda /media/Datos/virtualUSB/imagen_prueba.img
Cada uno usar vuestras rutas
El resultado es el que tenéis en la primera imagen que acompaña el post.
A continuación os paso el contenido de mi archivo
grub.cfg:
set imgdevpath='/dev/disk/by-uuid/9526-CA15'
insmod png
insmod part_msdos
insmod fat
insmod ntfs
insmod ext2
insmod tga
insmod gfxterm
insmod lspci
insmod vbe
insmod chain
insmod biosdisk
insmod font
set root='hd0,msdos1'
set timeout=30
set default=0
if loadfont /boot/grub/fonts/unicode.pf2 ; then
set gfxmode=640x480
insmod gfxterm
terminal_output gfxterm
if [ "${grub_platform}" == "efi" ]; then
insmod efi_gop
insmod efi_uga
fi
if [ "${grub_platform}" == "pc" ]; then
insmod vbe
insmod vga
fi
fi
# Dentro de /boot creo una carpeta nueva: /splash y en ella meto el archivo de background
background_image -m stretch /boot/splash/fondo.png
if background_image /boot/splash/fondo.png ; then
# Texto de las opciones de menú (black = transparente en caso de existir fondo)
set color_normal=white/black
# Texto de la opción seleccionada del menú
set color_highlight=yellow/cyan
else
set menu_color_normal=white/black
set menu_color_highlight=green/white
set color_normal=white/magenta
set color_highlight=green/white
fi
menuentry '=== Instalaciones disponibles -CloroPC- ===' {
echo
}
menuentry 'Manjaro-gnome-17.0.2' --class dvd {
set isofile='/boot/isos/manjaro-gnome-17.0.2-stable-x86_64.iso'
set dri="nonfree"
search --no-floppy -f --set=root $isofile
loopback loop $isofile
linux (loop)/boot/vmlinuz-x86_64 img_dev=$imgdevpath img_loop=$isofile driver=$dri
initrd (loop)/boot/intel_ucode.img (loop)/boot/initramfs-x86_64.img
}
menuentry 'Debian-9.1.0' --class dvd {
set isofile='/boot/isos/debian-9.1.0-amd64-DVD-1.iso'
loopback loop $isofile
linux (loop)/install.amd/vmlinuz vga=788 --- quiet
initrd (loop)/install.amd/gtk/initrd.gz
}
menuentry 'Ubuntu-17.04-gnome' {
set isofile='/boot/isos/ubuntu-gnome-17.04-desktop-amd64.iso'
loopback loop $isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile
initrd (loop)/casper/initrd.lz
}
menuentry 'KDE Neon User Edition ' {
set isofile='/boot/isos/neon-useredition-20170706-1018-amd64.iso'
loopback loop $isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile quiet splash ---
initrd (loop)/casper/initrd.lz
}
menuentry 'Fedora-Workstation-26' {
set isofile='/boot/isos/Fedora-Workstation-Live-x86_64-26-1.5.iso'
loopback loop $isofile
linux (loop)/isolinux/vmlinuz root=live:CDLABEL=Fedora-WS-Live-26-1-5 iso-scan/filename=$isofile rd.live.image quiet
initrd (loop)/isolinux/initrd.img
}
menuentry 'Fedora-MATE-26' {
set isofile='/boot/isos/Fedora-MATE_Compiz-Live-x86_64-26-1.5.iso'
loopback loop $isofile
linux (loop)/isolinux/vmlinuz root=live:CDLABEL=Fedora-MATE-Live-26-1-5 iso-scan/filename=$isofile rd.live.image quiet
initrd (loop)/isolinux/initrd.img
}
menuentry 'openSUSE Tumbleweed (netinstall)' {
set isofile='/boot/isos/openSUSE-Tumbleweed-NET-x86_64-Snapshot20170801-Media.iso'
loopback loop $isofile
set gfxpayload=keep
linux (loop)/boot/x86_64/loader/linux splash=silent iso-scan/filename=$isofile
initrd (loop)/boot/x86_64/loader/initrd
}
menuentry '================================================' {
echo
}
menuentry 'Reiniciar equipo' {
reboot
}
menuentry 'Apagar equipo' {
halt
}
Una vez que veáis que todo funciona correctamente, la forma más rápida de transferir dicha imagen de disco a un USB físico (mismo tamaño o superior) es haciendo uso del comando "dd".
Este comando es 'silencioso' es decir, si lo usamos "a pelo" no sabréis con certeza cuándo ha terminado, salvo que vuestra llave usb tenga lucecitas... Personalmente, para copias de gran tamaño, lo hago pasar por la tubería 'PV', para ver una barra de avance del proceso.
PV puede que no lo tengáis insatalado, pero es fácil. Suele estar en todos los repositorios, así que, dependiendo de vuestra distro:
$ sudo pacman -S pv ......... Manjaro y otras derivadas de Arch
$ sudo dnf -y install pv ...... Fedora y derivadas
$ sudo zypper in pv ........... openSuse y derivadas
$ sudo apt install pv .......... Debian, Ubuntu y derivadas
Luego sólo nos queda transferir la imagen al USB. Para ello, siempre me cambio a 'root' (evito problemas de acceso) y hago lo siguiente:
# dd if=/dev/loop0 |pv|dd of=/dev/sdc bs=4M
En la imagen veis el grado de avance que lleva el proceso de copia...
Un saludo y espero le saquéis utilidad igual que la que le estoy sacando yo.
Problemas que me encontré:
- La instalación de GRUB2 hacia el USB virtual la hice desde Manjaro, ya que desde otros sistemas me daba problemas de geometría y otras cosas y no perdí tiempo buscando los motivos exactos.
- La imagen de fondo preferí separarla en una carpeta aparte, redimensionarla a mi resolución (1360x768) y convertirla a 'png'.