Cómo personalizar imágenes de VM y de nube con guestfish

La mayoría de los administradores de sistemas están acostumbrados a administrar imágenes base, invitadas o doradas para aprovisionar nuevas máquinas virtuales (VM) o instancias de nube en sus entornos tradicionales de virtualización o nube. El atractivo de usar estas imágenes es su pequeño tamaño, estandarización, simplicidad y configuraciones básicas, a partir de las cuales es posible realizar una personalización previa o posterior al abastecimiento. Gran parte de la personalización tiene lugar después del abastecimiento.

Sin embargo, en algunos escenarios, los administradores pueden necesitar personalizar ciertas imágenes por adelantado para cumplir con las políticas de la empresa, como garantizar que ciertos paquetes o herramientas estén disponibles en el momento de la implementación, establecer restricciones de seguridad o incluso realizar pequeños ajustes que facilitan la administración del servidor. Existen diferentes herramientas con diferentes alcances para lograr este objetivo, como por ejemplo: generador de imágenes de disco, virt-personalizar, inicialización en la nube, Y de otros. Pero si solo necesita hacer pequeños ajustes a su imagen, el pez invitado la herramienta es un ahorro de tiempo.

Te mostraré cómo usar esta herramienta simple y versátil para hacer pequeñas personalizaciones.

Índice

Definir los requisitos previos

De acuerdo a documentos oficiales, "guestfish es una herramienta de shell y línea de comandos para examinar y modificar sistemas de archivos de máquinas virtuales. Utiliza libguestfs y expone toda la funcionalidad de la API guestfs".

Para esta demostración, estoy usando un pequeño servidor KVM con el libguestfs-tools paquete instalado porque proporciona el guestfish pedido:

$ rpm -qa | grep libguestfs-tools
libguestfs-tools-c-1.40.2-27.module+el8.4.0+9282+0bdec052.x86_64
libguestfs-tools-1.40.2-27.module+el8.4.0+9282+0bdec052.noarch

También descargaré la imagen de invitado de Red Hat Enterprise Linux 8.4 Update KVM desde el Portal de clientes de Red Hat en la misma maquina:

$ qemu-img info rhel-8.4-x86_64-kvm.qcow2
image: rhel-8.4-x86_64-kvm.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 694 MiB
cluster_size: 65536
Format specific information:
    compat: 0.10
    refcount bits: 16

$ qemu-img measure rhel-8.4-x86_64-kvm.qcow2
required size: 10737418240
fully allocated size: 10737418240

Para esta demostración, creé los siguientes requisitos previos de configuración previa que quiero que tenga mi imagen después de la implementación:

  • el raíz el usuario debe tener contraseña 123456.
  • Debe haber un usuario común nombrado alexón con contraseña 123456 con privilegios sudo.
  • Debe tener el nombre de host servidor-personalizado.ejemplo.com.
  • Debe utilizar una configuración IP estática de 192.168.100.3 en el 192.168.100.x red, con 192.168.100.1 como puerta de entrada y 192.168.1.3 como servidor DNS.
  • Debe mostrar una costumbre mensaje del día en la conexión.
  • Una herramienta personalizada debe estar disponible en el /root directorio telefónico.

Así que me pondré manos a la obra y personalizaré mi imagen con estos ajustes.

[ Learn more in the free eBook Red Hat OpenShift and Kubernetes ... what's the difference? ]

Hacer personalizaciones de imagen

Guestfish tiene su propio shell y línea de comandos a los que puede acceder ejecutando guestfish. Puede verificar los comandos disponibles dentro de este shell y realizar los cambios que desee en su imagen, o puede usar guestfish directamente desde el shell del sistema operativo con los parámetros deseados, incluso como una herramienta de script. Para obtener una lista completa de parámetros y comandos aceptables, consulte la documentación oficial:

$ sudo 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> help
Add disk images to examine using the '-a' or '-d' options or the 'add'
command.
Or create a new disk image using '-N', 
or the 'alloc' or 'sparse' commands.
Once you have done this, use the 'run' command.

For more information about a command, use 'help cmd'.

To read the manual, type 'man'.

><fs> quit

Antes de continuar con la personalización, cree una contraseña cifrada y cifrada que el usuario root pueda usar en la imagen:

$ openssl passwd -1 123456
$1$9pskY4to$DQT/NOOjQT7E.t.NKIzJr0

Luego edita la imagen. Puede agregar permisos de lectura y escritura, habilitar redes y montar automáticamente sistemas de archivos:

$ sudo guestfish --rw --network -i -a rhel-8.4-x86_64-kvm.qcow2

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: Red Hat Enterprise Linux 8.4 (Ootpa)
/dev/sda3 mounted on /
/dev/sda2 mounted on /boot/efi
><fs> quit

Pero para demostrar mejor cómo funciona la manipulación de imágenes dentro del caparazón del pez invitado (y por diversión), agregue la imagen con permisos de lectura y escritura y haga el resto dentro. (Nota: la imagen no puede ser utilizada por una VM o instancia en ejecución en este momento:

$ sudo guestfish -w -a rhel-8.4-x86_64-kvm.qcow2

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> set-network true
><fs> run
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
><fs> list-filesystems
/dev/sda1: unknown
/dev/sda2: vfat
/dev/sda3: xfs
><fs> mount /dev/sda3 /

¿Recuerda la contraseña cifrada que creó para el usuario raíz? Es hora de usarlo dentro del /etc/shadow archivar:

><fs> vi /etc/shadow
[...]
root:$1$9pskY4to$DQT/NOOjQT7E.t.NKIzJr0:18367:0:99999:7:::
[...]

escribir la costumbre mensaje del día a la /etc/motd archivar:

><fs> cat /etc/motd

><fs> write /etc/motd "Demo Server customized with guestfish for Enable SysAdmin"
><fs> chmod 0644 /etc/motd
><fs> cat /etc/motd
Demo Server customized with guestfish for Enable Sysadmin

Establezca el nombre de host en el /etc/hostname archivar:

><fs> write /etc/hostname "custom-server.example.com"
><fs> cat /etc/hostname
custom-server.example.com

el /etc/sysconfig/network-scripts/ifcfg-eth0 debe definirse con la información de red requerida:

><fs> ls /etc/sysconfig/network-scripts/
><fs> touch /etc/sysconfig/network-scripts/ifcfg-eth0
><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
[...]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.100.3
PREFIX=24
GATEWAY=192.168.100.1
DNS1=192.168.1.3
DOMAIN=example.local
IPV6_PRIVACY=no
[...]

Hay un tarball con una herramienta personalizada en la máquina host KVM. Importa y extrae su contenido en el /root directorio de imágenes:

><fs> tar-in /tmp/images/mycustom-tools.tar /root/
><fs> ls /root/
.bash_logout
.bash_profile
.bashrc
.cshrc
.tcshrc
mycustom-tools
><fs> ls /root/mycustom-tools/
tool.sh

Cree el usuario común requerido usando los comandos del sistema, de la siguiente manera:

><fs> command "adduser -G wheel -p 123456 -c 'Alexon Oliveira' alexon"
><fs> cat /etc/passwd | grep alexon
alexon:x:1000:1000:Alexon Oliveira:/home/alexon:/bin/bash

Finalmente, para evitar problemas con los contextos de SELinux, debe ejecutar una nueva etiqueta y sincronizar el disco para que todas las escrituras pasen a la imagen de disco subyacente. Después de eso, puede salir de la edición de imágenes:

><fs> selinux-relabel /etc/selinux/targeted/contexts/files/file_contexts /
><fs> sync
><fs> exit

Comprueba que el tamaño de la imagen apenas ha cambiado:

$ qemu-img info rhel-8.4-x86_64-kvm.qcow2
image: rhel-8.4-x86_64-kvm.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 788 MiB
cluster_size: 65536
Format specific information:
    compat: 0.10
    refcount bits: 16

$ qemu-img measure rhel-8.4-x86_64-kvm.qcow2
required size: 10737418240
fully allocated size: 10737418240

Probar la imagen personalizada

¿Funcionaron todos los esfuerzos? Lo pondré a prueba. Usaré máquinas Cockpit para crear una máquina virtual a partir de la imagen personalizada:

(Alexon Oliveira CC BY-SA 4.0)

Después de crear la máquina virtual, verifique que se esté ejecutando:

(Alexon Oliveira CC BY-SA 4.0)

La máquina virtual es funcional y está lista para acceder:

(Alexon Oliveira CC BY-SA 4.0)

La primera prueba es para validar que la IP estática se ha configurado correctamente y que puedo acceder al servidor desplegado con el usuario común creado previamente y su contraseña:

$ ssh [email protected]
The authenticity of host 192.168.100.3 can't be established.
ECDSA key fingerprint is SHA256:7mBMhpf+t7Ip[...]A6R+TkIqvrDiC04wI.
Are you sure you want to continue connecting? yes
[email protected]'s password:
Demo Server customized with guestfish for Enable SysAdmin
Activate the web console with systemctl enable --now cockpit.socket

Last login: Mon Nov 1 17:25:47 2021

¡Bingo! Y también puedo ver la costumbre. mensaje del día en la conexión. ¿Qué pasa con la herramienta personalizada? Es aquí:

[alexon]$ sudo ls /root/
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for alexon:
mycustom-tools

La configuración de la red está correctamente definida:

[alexon]$ ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:1e:b7:89 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.3/24 brd 192.168.100.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe1e:b789/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[alexon]$ ip r
default via 192.168.100.1 dev eth0 proto static metric 100
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.3 metric 100

El servidor DNS también está configurado correctamente:

[alexon]$ cat /etc/resolv.conf
# Generated by NetworkManager
search example.local
nameserver 192.168.1.3

Además, el nombre de host es el que definí anteriormente:

[alexon]$ hostnamectl
   Static hostname: custom-server.example.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 53b979b8960b45af9ba5cdd94b14cb6b
           Boot ID: aa3622b750a64047821290e96b05126d
    Virtualization: kvm
  Operating System: Red Hat Enterprise Linux 8.4 (Ootpa)
       CPE OS Name: cpe:/o:redhat:enterprise_linux:8.4:GA
            Kernel: Linux 4.18.0-305.el8.x86_64
      Architecture: x86-64

Finalmente, probaré el acceso de root con la contraseña definida anteriormente:

[alexon]$ id alexon
uid=1000(alexon) gid=1000(alexon) groups=1000(alexon),10(wheel)
[alexon]$ su -
Password:
Last login: Mon Nov 1 17:35:58 EST 2021 from 192.168.100.1 on pts/0
[root]# whoami
root

Y así, usé una herramienta simple pero poderosa para hacer cambios menores en la imagen base e implementé un nuevo servidor a partir de ella, y también puedo implementar muchos otros servidores. Puedo usar otras utilidades con la imagen para aprovechar estas personalizaciones. Pero para pequeños ajustes, guestfish sirve bien a los administradores.

Concluir

Cuando se trabaja con imágenes base para la implementación en entornos de nube y virtualización, especialmente en KVM y OpenStack, se requieren ciertas personalizaciones para cumplir con las políticas de la empresa. Para personalizaciones menores, la herramienta guestfish es un gran aliado para ayudarte a brindar servicios a medida. Ahora que sabes cómo hacerlo, úsalo sabiamente.

Artículos de interés

Subir