guestfish - Acceder y modificar imágenes de disco de máquinas virtuales

Para realizar operaciones en una imagen de disco sin cargarlo en una máquina virtual (VM) podemos usar guestfishguestfish es un shell interactivo que se puede utilizar desde la línea de comandos o desde scripts de shell para acceder a los sistemas de archivos de la VMguestfish utiliza la librería libguestfs.

La librería libguestfs nos ofrece un conjunto de herramientas para acceder y modificar imágenes de disco de las máquinas virtuales.

Como nos indican en su web, libguestfs puede acceder a casi cualquier imagen de disco imaginable. Puede hacerlo de forma segura, sin necesidad de permisos root y con múltiples capas de defensa contra imágenes de disco falsas. Es posible acceder a imágenes de disco en máquinas remotas o en dispositivos externos como DVD / memorias USB. También podemos acceder a imágenes de sistemas propietarios como VMware e Hyper-V.

Algunas de las cosas que nos van a permitir hacer, tanto la librería libguestfs como el shell interactivo guestfish que hace uso de ella son:

  • Creer máquinas virtuales
  • Clonar máquinas virtuales
  • Personalizar máquinas virtuales
  • Ejecutar secuencias de comandos con cambios en las VM
  • Inspeccionar imágenes de VM
  • Ver y editar archivos dentro de las VM
  • Copiar archivos y directorios desde y hacia máquinas virtuales
  • Mostrar información sobre sistemas de archivos, dispositivos, LVM, etc.
  • Montar y desmontar el sistema de archivos guest en el sistema host
  • P2V (convertir una máquina física para que se ejecute virtualizada en KVM)
  • V2V (convertir una máquina de un hipervisor externo para que se ejecute en KVM)
  • Archivar, cargar y descargar archivos
  • Supervisar estadísticas de disco, memoria u otros recursos usados / libres
  • Formatear discos virtuales
  • Cambiar el tamaño de los discos virtuales
  • Realización de copias de seguridad
  • Mostrar y trabajar con los archivos del registro de Windows en VM

Para poder usar libguestfs podemos instalarlo de los repositorios: 

❯ sudo apt install libguestfs-tools

En los sistemas Ubuntu que he probado, cuando ejecutamos guestfish sin permisos root obtengo este error:

 libguestfs: error: /usr/bin/supermin exited with error status 1.
To see full error messages you may need to enable debugging.
Do:
  export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
and run the command again.  For further information, read:
  http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
You can also run 'libguestfs-test-tool' and post the *complete* output
into a bug report or message to the libguestfs mailing list.

Este es un error de permisos. Tenemos que dar permisos de lectura a las imágenes del kernel en /boot/vmlinuz-*:

❯ sudo chmod 0644 /boot/vmlinuz-*

Recuerda que si se actualiza el kernel del sistema tendrás que volver a asignar estos permisos

Otro error que podemos encontrar es:

libguestfs: warning: current user is not a member of the KVM group (group ID 108).
This user cannot access /dev/kvm, so libguestfs may run very slowly.
It is recommended that you 'chmod 0666 /dev/kvm' or add the current user to the KVM group
(you might need to log out and log in again)

En este caso vamos a añadir nuestro usuario al grupo KVM:

❯ sudo usermod -a -G kvm david

Tendremos que reiniciar la sesión para que los cambios tengan efecto.  

libguestfsguestfish no requieren privilegios de acceso root. Solo es necesario ejecutarlos como root si la imagen del disco a la que se accede necesita root para leer o escribir

Uso de guestfish

Podemos usar guestfish de forma interactiva, sería algo como:

❯ guestfish

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: ‘help’ for help on commands
      ‘man’ to read the manual
      ‘quit’ to quit the shell

><fs> add-ro u1804Desktop.qcow2
><fs> run
><fs> list-filesystems
/dev/sda1: ext4
><fs> mount /dev/sda1 /
><fs> ls /etc
.java
.pwd.lock
ImageMagick-6
NetworkManager
PackageKit
UPower
X11
acpi
.
 .
 .

Los comandos usados son:

add-ro u1804Desktop.qcow2 abrimos la imagen de la VM en modo solo lectura
run lanzar el backend (después de configurar el identificador pero antes de realizar cualquier acción)
list-filesystems mostramos los sistemas de archivos
mount /dev/sda1 / montamos sda1 en /
ls /etc listamos el contenido de /etc

Esto mismo lo podemos hacer en un solo comando:

❯ guestfish --ro -a u1804Desktop.qcow2 -i

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: ‘help’ for help on commands
      ‘man’ to read the manual
      ‘quit’ to quit the shell

Sistema operativo: Ubuntu 18.04 LTS
/dev/sda1 montado en /

><fs> ls /etc
.java
.pwd.lock
ImageMagick-6
NetworkManager
PackageKit
UPower
X11
acpi
.
.
.

--ro significa que la imagen del disco se abre en modo de solo lectura. Usando este modo podemos acceder a las imágenes de forma segura pero no permite el acceso de escritura. Si omitimos esta opción accederemos con opción de escritura en la imagen, pero debemos estar seguros de que la imagen no se esta usando por ninguna máquina virtual en ese momento.

No es posible realizar modificaciones en las imágenes de disco en vivo e intentarlo dañará la imagen de forma irreversible

Comandos en modo interactivo

Acción Comando
Mostrar dispositivos de bloques list-devices
Mostrar particiones list-partitions
Comandos generales de sistema mount, umount, ls, ll, find, cat, touch, mkdir, rm, mkfs, lvresize, lvcreate, vgcreate, pvcreate
Editar un fichero edit /ruta/a/fichero/nombre_de_fichero
Copiar ficheros o directorios en la imagen

copy-in fichero_a_copiar /ruta/destino

equivale a:

upload fichero_a_copiar /ruta/destino

Copiar ficheros o directorios a la imagen

copy-out /ruta/origen/origen fichero_destino

equivale a:

download /ruta/origen/origen fichero_destino

salir exit

Comandos directos y otros comandos equivalentes

Acción Comando
guestfish --ro -a u1804Desktop.qcow2 -i  accede a la imagen u1804Desktop.qcow2, (-a) detecta el formato de la imagen de forma automática, (-i) e inspecciona los discos y monta los sistemas de ficheros
 guestfish -N fs crea una imagen de disco
guestfish -N disco1.qcow2=fs:ext4:300M -m /dev/sda1  crea una imagen de disco con nombre disco1.qcow2, de 300M, formato ext4 y la monta en /dev/sda1
virt-filesystems -a u1804Desktop.qcow2 -lh lista los filesystems, particiones, dispositivos de bloques y LVM en la imagen de disco u1804Desktop.qcow2 (-lh parametros iguales a los del comando ls)
virt-cat -a u1804Desktop.qcow2 /etc/passwd | grep david  muestra el fichero /etc/passwd de la imagen de disco u1804Desktop.qcow2 (en este caso hace un grep david con el resultado)
 virt-ls -a u1804Desktop.qcow2 /home lista el contenido de la carpeta /home en la imagen de disco u1804Desktop.qcow2
virt-df -a u1804Desktop.qcow2 muestra el espacio libre del sistema de archivos en la imagen de disco u1804Desktop.qcow2
virt-inspector -a u1804Desktop.qcow2 muestra la información de la imagen u1804Desktop.qcow2, entre ellas identifica el sistema operativo
virt-rescue -a u1804Desktop.qcow2 -i ejecuta un shell de rescate en la máquina virtual, (-i) inspecciona los discos y monta los sistemas de ficheros

Esta es la lista de comandos disponibles a la fecha de escribir esta entrada: 

virt-admin               virt-get-kernel          virt-rescue            
virt-alignment-scan      virt-host-validate       virt-resize            
virt-builder             virt-index-validate      virt-sanlock-cleanup   
virt-builder-repository  virt-inspector           virt-sparsify          
virt-cat                 virt-install             virt-sysprep           
virt-clone               virt-list-filesystems    virt-tail              
virt-convert             virt-list-partitions     virt-tar               
virt-copy-in             virt-log                 virt-tar-in            
virt-copy-out            virt-login-shell         virt-tar-out           
virt-customize           virt-ls                  virt-v2v               
virt-df                  virt-make-fs             virt-v2v-copy-to-local
virt-dib                 virt-manager             virt-viewer            
virt-diff                virt-p2v-make-disk       virt-win-reg           
virt-edit                virt-p2v-make-kickstart  virt-xml               
virt-filesystems         virt-p2v-make-kiwi       virt-xml-validate      
virt-format              virt-pki-validate
(0 votos)
Etiquetado como :

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.