Los libguestfs es una biblioteca C y una colección de herramientas en esta biblioteca para crear, ver, acceder y modificar imágenes de disco de máquina virtual en Linux. Puede mirar dentro de las imágenes de disco, modificar los archivos que contienen, crearlos desde cero, cambiarles el tamaño y mucho más. No requiere libvirt o KVM y tampoco requiere privilegios de root. Red Hat patrocina el desarrollo de libguestfs. Es compatible con muchas distribuciones de Linux y variantes de Unix como Mac OS.
Libguestfs funciona con casi todos los sistemas de archivos de Linux (ext2/3/4, XFS, btrfs, etc.), sistemas de archivos de Windows (vfat y ntfs), sistemas de archivos de Mac OS y BSD, volúmenes LVM2, particiones de disco MBR y GPT, discos RAW , QCOW2, VirtualBox VDI, VMWare VMDK y Hyper-V VHD/VHDX. Incluso puede acceder a archivos locales y dispositivos locales como CD y DVD ISO, tarjetas SD o de forma remota a través de FTP, HTTP, SSH, iSCSI, NBD, GlusterFS, Ceph, Sheepdog y mucho más.
Características de Libguestfs
Con las herramientas de libguest, podemos realizar una gran cantidad de tareas que se enumeran a continuación:
- Crear máquinas virtuales invitadas,
- Clonar máquinas virtuales,
- Crea máquinas virtuales,
- Personalizar máquinas virtuales,
- Cambios de secuencias de comandos en las máquinas virtuales,
- Inspeccionar imágenes de máquinas virtuales,
- Ver y editar archivos dentro de las máquinas invitadas,
- Copiar archivos y directorios hacia y desde máquinas virtuales,
- Mostrar información sobre sistemas de archivos, dispositivos, LVM,
- Archivar, cargar y descargar archivos,
- Supervise las estadísticas de disco usado/libre,
- Formatear discos virtuales,
- Cambiar el tamaño de los discos virtuales,
- Realización de copias de seguridad,
- Montar y desmontar el sistema de archivos invitado en el sistema host,
- P2V (convierta una máquina física para que se ejecute virtualizada en KVM, OpenStack, oVirt, Red Hat Virtualization),
- V2V (convertir una máquina invitada de un hipervisor externo para que se ejecute en KVM),
- Mostrar archivos de registro,
- Fusionar cambios en el registro de Windows en invitados de Windows,
- y mucho más.
Puede realizar todas estas tareas a través de un shell programable llamado guestfish , o un shell de rescate interactivo virt-rescue .
Instalar libguestfs en Linux
Ejecute el siguiente comando para instalar libguestfs en Debian, Ubuntu:
$ sudo apt install libguestfs-tools
En CentOS, RHEL:
$ sudo dnf install libguestfs-tools
Una vez instalado, verifique la versión de guestfish usando el comando:
$ guestfish --version guestfish 1.40.2
Acceda y modifique imágenes de disco de máquina virtual con Libguestfs
Asegúrese de que las máquinas invitadas estén apagadas. No debe modificar las imágenes en vivo por ningún motivo. Puede conducir a la corrupción permanente del disco y la pérdida de datos. Siempre haga una copia de seguridad de las imágenes del disco antes de realizar cambios en ellas.
1. Concha de pez huésped
Guestfish, abreviatura de shell del sistema de archivos invitado, es un shell interactivo para editar sistemas de archivos de máquinas virtuales e imágenes de disco.
1.1. Acceda a imágenes de disco existentes y monte sistemas de archivos invitados manualmente
Primero, carguemos una imagen de disco existente para inspeccionar.
Ejecute el siguiente comando para ingresar al shell interactivo de guestfish:
$ guestfish
Salida de muestra:
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>
Aquí, >
..y luego agregue las imágenes de disco usando el comando:
><fs> add ~/CentOS_8_Server.img
A continuación, ejecute el siguiente comando para iniciar la biblioteca y adjuntar (iniciar) la imagen del disco:
><fs> run
Tardará unos segundos la primera vez. Los arranques subsiguientes terminarán mucho más rápido.
Ahora necesita enumerar y montar los sistemas de archivos invitados manualmente.
Para ver la lista de sistemas de archivos en el disco, ejecute este comando desde el indicador de guestfish:
><fs> list-filesystems
Salida de muestra:
/dev/sda1: ext4 /dev/cl/root: xfs /dev/cl/swap: swap
Montar un sistema de archivos:
><fs> mount /dev/cl/root /
Mostrar puntos de montaje:
><fs> mountpoints /dev/cl/root: /
Del mismo modo, monte los otros sistemas de archivos.
1.2. Acceda a imágenes de disco existentes y monte sistemas de archivos invitados automáticamente
En lugar de enumerar y montar manualmente los sistemas de archivos invitados, puede dejar que el pez invitado inspeccione automáticamente las imágenes y monte los sistemas de archivos usando -i marca como a continuación.
$ guestfish -a CentOS_8_Server.img -i
Aquí,
- -a El parámetro (--add) detectará automáticamente el formato de la imagen del disco. Para anular esto y especificar un formato particular, use el --format opción.
- -yo (--inspector) - Inspecciona los discos y monta los sistemas de archivos.
- CentOS_8_Server.img - nombre de la imagen de disco. Tengo esta imagen en mi directorio actual.
Este comando cargará la imagen dada, montará los sistemas de archivos invitados y lo colocará dentro del caparazón del pez invitado.
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 Operating system: CentOS Linux release 8.2.2004 (Core) /dev/cl/root mounted on / /dev/sda1 mounted on /boot ><fs>
Si usaste la "-i" parámetro, no tiene que listar y montar sistemas de archivos invitados manualmente. Los sistemas de archivos se montarán automáticamente. Además, no es necesario que inicie la biblioteca y adjunte la imagen del disco usted mismo. Guestfish mismo se encargará de ello.
1.3. Acceda a máquinas virtuales en lugar de solo imágenes de disco
Guestfish tiene una opción para acceder a las máquinas virtuales (dominios) en lugar de las imágenes de disco.
Primero, obtenga el nombre de las máquinas virtuales usando el comando:
$ virsh list --all Id Name State -------------------------------- - centos8-uefi shut off - nginx_centos8 shut off
Para acceder a la VM llamada "centos8-uefi", use la opción -d o --domain como se muestra a continuación.
$ guestfish -d centos8-uefi -i
1.4. Ver y modificar el contenido de las imágenes de disco
Guestfish admite cientos de comandos para ver y modificar imágenes de disco a su gusto. Se sentirá abrumado si mira toda la página del manual. Por lo tanto, es mejor saber cómo obtener ayuda primero.
Lista de todos los comandos
Si no sabe por dónde empezar, simplemente abra la sección de ayuda usando el comando:
><fs> help
Para enumerar todos los comandos disponibles junto con una breve descripción, ejecute:
><fs> help -l
Obtener ayuda de un comando específico
Para obtener ayuda de cualquier comando, por ejemplo mkdir, ejecute:
<fs> help mkdir
Ahora veamos algunos ejemplos.
Lista de dispositivos bloqueados
Para enumerar todos los dispositivos de bloque en la imagen, ejecute:
><fs> list-devices /dev/sda
Lista de particiones
Para enumerar todas las particiones detectadas en todos los dispositivos de bloque, ejecute:
><fs> list-partitions /dev/sda1 /dev/sda2
Lista de contenidos del directorio
Para enumerar los archivos en un directorio determinado, ejecute:
><fs> ls /root .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
Ver el contenido del archivo
Para mostrar el contenido de un archivo, ejecute:
><fs> cat /etc/fstab # # /etc/fstab # Created by anaconda on Thu Feb 6 06:43:28 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=5e675dd6-7f64-46cd-8535-3617f3cf870b /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0
Crear directorios
El siguiente comando creará un directorio llamado "ostechnix" en el directorio /root del sistema invitado.
><fs> mkdir /root/ostechnix
Crear archivos vacíos
Para crear un archivo vacío dentro de la máquina invitada, haga lo siguiente:
><fs> touch /root/ostechnix/file.txt
Verifique si el archivo ha sido creado:
><fs> ls /root/ostechnix/ file.txt
Crear archivos con contenidos
Para crear un archivo con algunos contenidos, use escribir comando:
><fs> write /root/ostechnix/file2.txt https://ostechnix.com
El comando anterior creará file2.txt en el directorio /root/ostechnix/ y escribirá "https://ostechnix.com" en él.
Puedes verificarlo usando el comando "gato":
><fs> cat /root/ostechnix/file2.txt https://ostechnix.com
Adjuntar contenidos a archivos existentes
Para agregar nuevo contenido al final de un archivo ya creado, use el comando "write-append":
<fs> write-append /root/ostechnix/file2.txt /about
El comando anterior agregará la palabra "/acerca de" al final del contenido del archivo1.txt.
Verifique si se agregó la línea, use el comando cat:
><fs> cat /root/ostechnix/file2.txt https:/ostechnix.com/about
Editar archivos
Para editar un archivo en la máquina invitada, use el comando "editar":
><fs> edit /root/ostechnix/file.txt
El archivo dado se abrirá en el editor predeterminado.
Eliminar archivos y directorios
Para eliminar un archivo de la máquina invitada:
><fs> rm /root/ostechnix/file2.txt ><fs> rm /root/ostechnix/file.txt
Para eliminar un directorio, use el comando "rmdir":
><fs> rmdir /root/ostechnix/
Copiar archivos o directorios locales en la imagen del disco
El comando "copiar" copia los archivos o directorios locales de forma recursiva en la imagen del disco.
El siguiente comando copiará el archivo ostechnix.txt desde el sistema local a /root/ostechnix/ en imagen de disco.
<fs> copy-in ostechnix.txt /root/ostechnix/
Verifíquelo usando ls comando:
<fs> ls /root/ostechnix/ file.txt ostechnix.txt
Copiar archivos o directorios desde la imagen del disco al sistema host
De manera similar, podemos copiar los archivos o directorios desde una imagen de disco al sistema host local usando el comando "copiar" como se muestra a continuación.
<fs> copy-out /root/ostechnix/ /home/sk/Downloads/
En el ejemplo anterior, estoy copiando el directorio /root/ostechnix/ al directorio de descargas en el sistema host.
Descargar archivos al sistema host
Esto es lo mismo que el comando de copia.
Guestfish le permite descargar y cargar contenidos desde la máquina invitada a la máquina host y viceversa.
La sintaxis general para descargar archivos:
download <guest_file_location> <host_file_location>
El siguiente comando descargará el archivo "/etc/fstab" de la máquina invitada al directorio /home/sk/Downloads/ en el sistema host KVM.
<fs> download /etc/fstab /home/sk/Downloads/fstab
Cargar archivos del sistema host al sistema invitado
Esto es lo mismo que el comando de copia.
Para cargar un archivo desde su sistema host a la máquina invitada, ejecute:
><fs> upload /home/sk/Downloads/fstab /etc/fstab
Aquí estoy subiendo /home/sk/Downloads/fstab archivo de mi sistema local a /etc/fstab en la máquina invitada.
Mostrar la página del manual de guestfish
Para mostrar las páginas man de guestfish:
><fs> man
Salir de guestfish
Para salir del caparazón de pez huésped, ejecute:
><fs> exit
Lo que hemos visto hasta ahora es que accedimos, montamos, inspeccionamos y modificamos imágenes de disco existentes. Guestfish también puede ayudarlo a crear nuevas imágenes de disco al instante.
1.5. Creando nuevas imágenes de disco
Los siguientes comandos deben ejecutarse fuera del shell de guestfish. En otras palabras, deben ejecutarse en su terminal host.
¿Recuerdas que agregamos las imágenes existentes usando un parámetro? Sí. Para crear una nueva imagen de disco, vamos a -N (--nuevo) parámetro.
Para crear una nueva imagen de disco e iniciarla automáticamente, ejecute el siguiente comando desde el indicador del terminal host (no en el guestfish):
$ guestfish -N fs
Este comando creará un nuevo disco llamado "test1.img" en el directorio actual y lo llevará dentro del aviso de guestfish. Este disco contendrá una sola partición, con un sistema de archivos vacío. De forma predeterminada, el tamaño del disco será 1 GB . Si ejecuta el mismo comando la próxima vez, se creará un nuevo disco llamado "test2.img" con tamaño 1G y así sucesivamente.
En lugar de crear un disco de 1G de tamaño fijo, también es posible crear una imagen de disco de tamaño personalizado.
Para crear un disco en blanco de 500 MB , ejecuta:
$ guestfish -N disk:500M
También puede crear una imagen de disco formateada con un sistema de archivos específico. Por ejemplo, el siguiente comando creará un disco de 1G con un ext4 -partición formateada, llamada test1.img en el directorio actual:
$ guestfish -N fs:ext4
Cree un disco de 500 MB con un VFAT -partición formateada y montarla:
$ guestfish -N fs:vfat:500M -m /dev/sda1
Cree un disco en blanco de 500 MB llamado blankdisk.img (en lugar del nombre predeterminado test1.img):
$ guestfish -N blankdisk.img=disk:500M
1.6. Adición de imágenes de disco remoto
No solo imágenes de discos locales, también podemos agregar discos ubicados en un servidor remoto SSH, FTP, HTTP o TFTP.
Agregue un disco ubicado en un servidor SSH remoto:
$ guestfish -a ssh://[email protected]/disk.img
Reemplace el nombre de usuario y la dirección IP en el comando anterior con los suyos propios.
Agregue un disco ubicado en un servidor FTP remoto:
$ guestfish -a ftp://[email protected]:port/disk.img
$ guestfish -a ftps://[email protected]:port/disk.img
Agregue un disco ubicado en un servidor HTTP remoto:
$ guestfish -a http://[email protected]:port/disk.img
$ guestfish -a https://[email protected]:port/disk.img
Agregue un disco ubicado en un servidor TFTP remoto:
$ guestfish -a tftp://[email protected]:port/disk.img
2. Acceda, vea y modifique imágenes de disco sin ingresar al shell de guestfish
Libguestfs proporciona muchos otros comandos equivalentes para acceder, ver y modificar imágenes de disco, sin tener que ingresar al shell de guestfish.
2.1. montaje de invitados
El comando Guestmount se utiliza para montar un sistema de archivos invitado en el host mediante FUSE y libguestfs.
El siguiente comando montará el centos8-uefi sistema de archivos de la máquina invitada en ~/guestvm/ en el sistema host.
$ mkdir ~/guestvm/
$ sudo guestmount -d centos8-uefi -i ~/guestvm/
Verifique el contenido del directorio de montaje:
$ sudo ls -l ~/guestvm
Salida de muestra:
total 16 lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin dr-xr-xr-x. 6 root root 4096 Jul 18 15:46 boot drwxr-xr-x. 2 root root 6 Jul 18 15:23 dev drwxr-xr-x. 78 root root 8192 Jul 25 17:54 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt drwxr-xr-x. 2 root root 6 Jul 18 15:23 proc dr-xr-x---. 2 root root 135 Jul 18 15:46 root drwxr-xr-x. 2 root root 6 Jul 18 15:23 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv drwxr-xr-x. 2 root root 6 Jul 18 15:23 sys drwxrwxrwt. 7 root root 119 Jul 25 18:44 tmp drwxr-xr-x. 12 root root 144 Jul 18 15:24 usr drwxr-xr-x. 20 root root 278 Jul 18 15:45 var
Para desmontarlo, ejecute:
$ sudo umount ~/guestvm
Para obtener más detalles, consulte las páginas man.
$ man guestmount
2.2. gato virtual
Comando Virt-cat emitido para ver el contenido de un archivo almacenado en una imagen de disco o máquina virtual.
$ sudo virt-cat -a CentOS_8_Server.img /etc/fstab
O,
$ sudo virt-cat -d centos8-uefi /etc/fstab
Salida de muestra:
# # /etc/fstab # Created by anaconda on Sat Jul 18 05:53:25 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=6a7f6481-5eb3-4589-ad19-b2291ddfcda1 /boot ext4 defaults 1 2 UUID=6906-5D0A /boot/efi vfat umask=0077,shortname=winnt 0 2 /dev/mapper/cl-swap swap swap defaults 0 0
2.3. virt-copia-en
El comando Virt-copy-in se usa para copiar archivos y directorios del host a una imagen de disco o máquina virtual.
$ sudo virt-copy-in -a CentOS_8_Server.img ostechnix.txt /root/
O,
$ sudo virt-copy-in -d centos8-uefi ostechnix.txt /root/
2.4. copia virtual
El comando Virt-copy-out se usa para copiar archivos y directorios de una imagen de disco o máquina virtual.
$ sudo virt-copy-out -a CentOS_8_Server.img /root/ostechnix.txt ~/Downloads
O,
$ sudo virt-copy-in -d centos8-uefi /root/ostechnix.txt ~/Downloads
Los comandos anteriores copiarán el archivo /root/ostechnix.txt del disco de la máquina virtual al directorio ~/Downloads en el sistema host local.
2.4. virtual-df
El comando Virt-df muestra el espacio libre en el sistema de archivos de una máquina invitada.
Ver espacio libre en una imagen de disco:
$ sudo virt-df -a CentOS_8_Server.img
Salida de muestra:
Filesystem Size Used Available Use% CentOS_8_Server.img:/dev/sda1 976M 260M 649M 27% CentOS_8_Server.img:/dev/cl/root 17G 1.4G 16G 9%
Ver espacio en disco en una VM:
$ sudo virt-copy-in -d centos8-uefi /root/ostechnix.txt ~/Downloads
Salida de muestra:
Filesystem Size Used Available Use% centos8-uefi:/dev/sda1 599M 6.6M 592M 2% centos8-uefi:/dev/sda2 976M 121M 788M 13% centos8-uefi:/dev/cl/root 16G 1.2G 15G 8%
2.5. virt-edit
Edite un archivo en una imagen de disco o máquina virtual.
$ sudo virt-edit -a CentOS_8_Server.img /root/ostechnix.txt
O,
$ sudo virt-edit -d centos8-uefi /root/ostechnix.txt
Este comando abrirá el archivo remoto en el editor predeterminado. Simplemente haga los cambios y guarde y cierre el archivo.
2.6. sistemas de archivos virt
Enumere sistemas de archivos, particiones, dispositivos de bloque, LVM en una máquina virtual o imagen de disco.
$ sudo virt-filesystems -a CentOS_8_Server.img -l
O,
$ sudo virt-filesystems -d centos8-uefi -l
Salida de muestra:
Name Type VFS Label Size Parent /dev/sda1 filesystem vfat - 629145600 - /dev/sda2 filesystem ext4 - 1073741824 - /dev/cl/root filesystem xfs - 17620271104 -
Para mostrar los detalles de la partición, agregue --partitions en el comando anterior:
$ sudo virt-filesystems -d centos8-uefi --partitions /dev/sda1 /dev/sda2 /dev/sda3
Del mismo modo, puede utilizar --logical-volumes , --grupos de volumen , --volumen-físico , --dispositivos de bloqueo para enumerar esos artículos.
2.7. inspector virtual
Virt-inspector se utiliza para mostrar la versión del sistema operativo y otra información sobre una imagen de disco o una máquina virtual.
$ sudo virt-inspector -a CentOS_8_Server.img
O,
$ sudo virt-inspector -d centos8-uefi
2.8. virt-ls
Virt-ls se usa para mostrar los archivos y directorios y sus tamaños, atributos, sumas de verificación en una imagen de disco o máquina virtual.
$ sudo virt-ls -R -a CentOS_8_Server.img / | less
O,
$ sudo virt-ls -R -d centos8-uefi /root
Puede usar la mayoría de las opciones/indicadores normales del comando "ls" con el comando virt-ls.
2.9. registro virtual
Virt-log se utiliza para mostrar los archivos de registro de una imagen de disco o una máquina virtual.
$ sudo virt-log -a CentOS_8_Server.img
O,
$ sudo virt-log -d centos8-uefi
2.10. cola virtual
El comando Virt-tail se usa para seguir los archivos de registro en una imagen de disco o una máquina virtual.
$ sudo virt-tail -a CentOS_8_Server.img /var/log/messages
O,
$ sudo virt-tail -d centos8-uefi /var/log/messages
Hay muchos más comandos disponibles. Le sugiero que consulte el sitio web libguestfs vinculado al final de esta guía.
Leer a continuación:
- Cree rápidamente imágenes de máquinas virtuales con Virt-builder
- Muestre las estadísticas de los sistemas de virtualización con Virt-top en Linux
- Cómo rescatar máquinas virtuales con Virt-rescue
Resolución de problemas
Estas son las soluciones para algunos problemas comunes.
1. libguestfs no funciona sin permisos de root en Ubuntu
Es posible que encuentre este error al intentar acceder a las imágenes de disco en Ubuntu:
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
Para solucionar este problema, ejecute:
$ sudo chmod 0644 /boot/vmlinuz*
Es posible que deba agregarse a kvm grupo:
$ sudo usermod -a -G kvm sk
Reemplace "sk" en el comando anterior con su propio nombre de usuario.
- Si ya ha instalado libvirt o KVM en su sistema e intenta usar las herramientas libguesfs como usuario raíz, debería ver este error de permiso:
libguestfs: error: could not create appliance through libvirt. Try running qemu directly without libvirt using this environment variable: export LIBGUESTFS_BACKEND=direct Original error from libvirt: Cannot access backing file '/root/CentOS_8_Server.qcow2' of storage file '/tmp/libguestfsiPjmga/overlay1.qcow2' (as uid:107, gid:107): Permission denied [code=38 int1=13]
Esto es causado por libvirt, por lo que solo ocurre cuando se usa el backend de libvirt. Para solucionar esto, cambie al backend directo configurando esta variable de entorno:
export LIBGUESTFS_BACKEND=direct
Para que sea permanente, agregue esta línea a su ~/.bashrc archivo.