05 agosto 2017

Crear y administrar USB Multiboot, sin programas dedicados

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:

  1. Particionar imagen de disco, para pruebas
  2. 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'.



No hay comentarios:

Último post

Preparando un espacio de trabajo

            Ahora que tengo tiempo, retomo el blog. Por comodidad (y por capricho) he elegido la siguiente configuración: He optado por un ...