Preparación de una máquina virtual basada en CentOS para Azure

Precaución

En este artículo se hace referencia a CentOS, una distribución de Linux que está cerca de su estado Final de ciclo vida (EOL). Tenga en cuenta su uso y planifique en consecuencia. Para obtener más información, consulte la guía de fin de vida de CentOS.

Se aplica a: ✔️ máquinas virtuales Linux ✔️ conjuntos de escalado flexibles

Aprenda a crear y cargar un disco duro virtual de Azure (VHD) que contiene un sistema operativo Linux basado en CentOS.

Prerequisites

En este artículo se supone que ya ha instalado un sistema operativo Linux CentOS (o un derivado similar) en un disco duro virtual. Existen varias herramientas para crear archivos .vhd; por ejemplo, una solución de virtualización como Hyper-V. Para obtener instrucciones, consulte Instalación del rol de Hyper-V y configuración de una máquina Virtual.

Notas de instalación de CentOS

  • Para obtener más sugerencias sobre cómo preparar Linux para Azure, consulte Notas generales de instalación de Linux.
  • El formato VHDX no se admite en Azure, solo el VHD fijo. Puede convertir el disco al formato VHD con el Administrador de Hyper-V o el cmdlet Convert-VHD. Si utiliza VirtualBox, deberá seleccionar Tamaño fijo en lugar del tamaño predeterminado asignado dinámicamente al crear el disco.
  • El módulo de kernel vfat debe estar habilitado en el kernel
  • Al instalar el sistema Linux, se recomienda usar las particiones estándar en lugar de un LVM (que a menudo viene de forma predeterminada en muchas instalaciones). De este modo se impide que el nombre del LVM entre en conflicto con las máquinas virtuales clonadas, especialmente si en algún momento hace falta adjuntar un disco de SO a otra máquina virtual idéntica para solucionar problemas. LVM o RAID se pueden utilizar en discos de datos.
  • Se requiere la compatibilidad de kernel para el montaje de sistemas de archivos UDF. Al arrancar Azure la primera vez, la configuración de aprovisionamiento se pasa a la VM Linux a través de medios con formato UDF conectados al invitado. El agente Linux de Azure o cloud-init debe montar el sistema de archivos UDF para leer su configuración y aprovisionar la máquina virtual.
  • Las versiones de kernel de Linux inferiores a la versión 2.6.37 no admiten NUMA en Hyper-V con tamaños de VM más grandes. Este problema afecta principalmente a las distribuciones anteriores que usan el kernel Centos 2.6.32 de canal de subida y se ha corregido en Centos 6.6 (kernel-2.6.32-504). Los sistemas que ejecutan kernels personalizados cuyas versiones son anteriores a la versión 2.6.37, o bien kernels basados en RHEL cuyas versiones son anteriores a la versión 2.6.32-504, deben establecer el parámetro de inicio numa=off en la línea de comandos de kernel en grub.conf. Para más información, consulte Red Hat KB 436883.
  • No configure una partición de intercambio en el disco del SO.
  • En Azure, todos los discos duros virtuales deben tener un tamaño virtual alineado con 1 MB. Al convertir un disco sin formato en un disco duro virtual, tiene que asegurarse de que su tamaño es un múltiplo de 1 MB antes de la conversión. Para más información, consulte Notas sobre la instalación de Linux.

Nota:

Cloud-init >= 21.2 quita el requisito de udf. Sin embargo, sin el módulo udf habilitado, el cdrom no se montará durante el aprovisionamiento, lo que impide que se apliquen los datos personalizados. Una solución alternativa para esto es aplicar datos personalizados mediante datos de usuario. Sin embargo, a diferencia de los datos personalizados, los datos de usuario no se cifran. https://cloudinit.readthedocs.io/en/latest/topics/format.html

CentOS 6.x

Importante

Tenga en cuenta que CentOS 6 ha alcanzado su final de la vida útil (EOL) y ya no es compatible con la comunidad CentOS. Esto significa que no se publicarán más actualizaciones ni parches de seguridad para esta versión, dejándola vulnerable a posibles riesgos de seguridad. Se recomienda actualizar a una versión más reciente de CentOS para garantizar la seguridad y la estabilidad del sistema. Consulte con el departamento de TI o con el administrador del sistema para obtener más ayuda.

  1. En el Administrador de Hyper-V, seleccione la máquina virtual.

  2. Haga clic en Conectar para abrir una ventana de consola de la máquina virtual.

  3. En CentOS 6, NetworkManager puede interferir con el Agente de Linux de Azure. Desinstale el paquete ejecutando el comando siguiente:

    sudo rpm -e --nodeps NetworkManager
    
  4. Cree o edite el archivo /etc/sysconfig/network y agregue el siguiente texto:

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  5. Cree o edite el archivo /etc/sysconfig/network-scripts/ifcfg-eth0 y agregue el siguiente texto:

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  6. Modifique las reglas udev para impedir que se generen reglas estáticas para las interfaces Ethernet. Estas reglas pueden causar problemas al clonar una máquina virtual en Microsoft Azure o Hyper-V:

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    
  7. Ejecute el comando siguiente para asegurarse de que el servicio de red se inicia en el arranque:

    sudo chkconfig network on
    
  8. Si desea utilizar los espejos OpenLogic hospedados en los centros de datos de Azure, sustituya el archivo /etc/yum.repos.d/CentOS-Base.repo por los siguientes repositorios. Así se agregará también el repositorio [openlogic], que incluye paquetes adicionales como el Agente de Linux de Azure:

    [openlogic]
    name=CentOS-$releasever - openlogic packages for $basearch
    baseurl=http://olcentgbl.trafficmanager.net/openlogic/$releasever/openlogic/$basearch/
    enabled=1
    gpgcheck=0
    
    [base]
    name=CentOS-$releasever - Base
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/extras/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #contrib - packages by Centos Users
    [contrib]
    name=CentOS-$releasever - Contrib
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/contrib/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    

    Nota

    En el resto de esta guía se supondrá que usa al menos el repositorio [openlogic], que se utilizará para instalar el agente de Linux de Azure siguiente.

  9. Agregue la línea siguiente a /etc/yum.conf:

    http_caching=packages
    
  10. Ejecute el siguiente comando para borrar los metadatos de yum actuales y actualizar el sistema con los últimos paquetes:

    sudo yum clean all
    

    A menos que vaya a crear una imagen de una versión anterior de CentOS, se recomienda actualizar todos los paquetes a la versión más reciente:

    sudo yum -y update
    

    Después de ejecutar este comando es posible que sea preciso reiniciar el equipo.

  11. (Opcional) Instale los controladores para los servicios de integración de Linux (LIS).

    Importante

    El paso se requiere para CentOS 6.3 y las versiones anteriores, y opcional para las versiones posteriores.

    sudo rpm -e hypervkvpd  ## (may return error if not installed, that's OK)
    sudo yum install microsoft-hyper-v
    

    Como alternativa, puede seguir las instrucciones de instalación manual de la página de descarga de LIS para instalar el RPM en la máquina virtual.

  12. Instale el Agente de Linux de Azure y sus dependencias. Inicie y habilite el servicio waagent:

    sudo yum install python-pyasn1 WALinuxAgent
    sudo service waagent start
    sudo chkconfig waagent on
    

    La instalación del paquete WALinuxAgent elimina los paquetes NetworkManager y NetworkManager-gnome, si es que aún no se han eliminado, como se ha indicado en el paso 3.

  13. Modifique la línea de arranque de kernel de su configuración grub para que incluya parámetros de kernel adicionales para Azure. Para ello, abra /boot/grub/menu.lst en un editor de texto y asegúrese de que el kernel predeterminado incluye los parámetros siguientes:

    console=ttyS0 earlyprintk=ttyS0 rootdelay=300
    

    Así también se asegurará de que todos los mensajes de la consola se envían al primer puerto serie, lo que puede ayudar al soporte técnico de Azure con los problemas de depuración de errores.

    Además de lo anterior, se recomienda quitar los parámetros siguientes:

    rhgb quiet crashkernel=auto
    

    Los arranques gráfico y quiet boot no resultan útiles en un entorno de nube, donde queremos que todos los registros se envíen al puerto serie. Es posible dejar la opción crashkernel configurada si así se desea, pero tenga en cuenta que este parámetro reducirá la cantidad de memoria disponible en la máquina virtual en 128 MB o más, lo cual puede resultar problemático en tamaños de VM más reducidos.

    Importante

    CentOS 6.5 y las versiones anteriores también deben establecer el parámetro numa=off del kernel. Consulte Red Hat KB 436883.

  14. Asegúrese de que el servidor SSH se haya instalado y configurado para iniciarse en el tiempo de arranque. Este es normalmente el valor predeterminado.

  15. No cree un espacio de intercambio en el disco del sistema operativo.

    El Agente de Linux de Azure puede configurar automáticamente un espacio de intercambio utilizando el disco de recursos local que se adjunta a la máquina virtual después de aprovisionarse en Azure. El disco de recursos local es un disco temporal que podría tener que vaciarse cuando la máquina virtual se desaprovisiona. Después de instalar el Agente de Linux de Azure (vea el paso anterior), modifique los parámetros siguientes en /etc/waagent.conf de la forma adecuada:

    ResourceDisk.Format=y
    ResourceDisk.Filesystem=ext4
    ResourceDisk.MountPoint=/mnt/resource
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048 ## NOTE: set this to whatever you need it to be.
    
  16. Ejecute los comandos siguientes para desaprovisionar la máquina virtual y prepararla para aprovisionarse en Azure:

    sudo waagent -force -deprovision+user
    sudo export HISTSIZE=0
    

Nota:

Si va a migrar una máquina virtual concreta y no desea crear una imagen generalizada, omita el paso de desaprovisionamiento.

  1. Haga clic en Acción> Apagar en el Administrador de Hyper-V. El disco duro virtual con Linux ya está listo para cargarse en Azure.

CentOS 7.0+

Cambios en CentOS 7 (y derivados similares)

La preparación de una máquina virtual CentOS 7 para Azure es similar a CentOS 6, aunque hay varias diferencias importantes que es necesario tener en cuenta:

  • El paquete NetworkManager ya no entra en conflicto con el agente de Linux de Azure. Este paquete está instalado de manera predeterminada y recomendamos que no se quite.

  • GRUB2 se utiliza ahora como cargador de arranque predeterminado; por ello, el proceso de edición de los parámetros de kernel ha cambiado (ver más adelante).

  • XFS es ahora el sistema de archivos predeterminado. El sistema de archivos ext4 se puede seguir utilizando si así se desea.

  • Dado que CentOS 8 Stream y las versiones más recientes ya no incluyen network.service de forma predeterminada, debe instalarlo manualmente:

    sudo yum install network-scripts
    sudo systemctl enable network.service
    

Pasos de configuración

  1. En el Administrador de Hyper-V, seleccione la máquina virtual.

  2. Haga clic en Conectar para abrir una ventana de consola de la máquina virtual.

  3. Cree o edite el archivo /etc/sysconfig/network y agregue el siguiente texto:

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  4. Cree o edite el archivo /etc/sysconfig/network-scripts/ifcfg-eth0 y agregue el siguiente texto:

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    NM_CONTROLLED=no
    
  5. Modifique las reglas udev para impedir que se generen reglas estáticas para las interfaces Ethernet. Estas reglas pueden causar problemas al clonar una máquina virtual en Microsoft Azure o Hyper-V:

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    
  6. Si desea utilizar los espejos OpenLogic hospedados en los centros de datos de Azure, sustituya el archivo /etc/yum.repos.d/CentOS-Base.repo por los siguientes repositorios. De este modo se agregará también el repositorio [openlogic] que incluye paquetes para el agente de Linux de Azure:

    [openlogic]
    name=CentOS-$releasever - openlogic packages for $basearch
    baseurl=http://olcentgbl.trafficmanager.net/openlogic/$releasever/openlogic/$basearch/
    enabled=1
    gpgcheck=0
    
    [base]
    name=CentOS-$releasever - Base
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/extras/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    

    Nota

    En el resto de esta guía se supondrá que usa al menos el repositorio [openlogic], que se utilizará para instalar el agente de Linux de Azure siguiente.

  7. Ejecute el comando siguiente para borrar los metadatos de yum actuales e instalar las actualizaciones:

    sudo yum clean all
    

    A menos que vaya a crear una imagen de una versión anterior de CentOS, se recomienda actualizar todos los paquetes a la versión más reciente:

    sudo yum -y update
    

    Después de ejecutar este comando es posible que sea preciso reiniciar el equipo.

  8. Modifique la línea de arranque de kernel de su configuración grub para que incluya parámetros de kernel adicionales para Azure. Para ello, abra /etc/default/grub en un editor de texto y edite el parámetro GRUB_CMDLINE_LINUX, por ejemplo:

    GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
    

    Así también se asegurará de que todos los mensajes de la consola se envían al primer puerto serie, lo que puede ayudar al soporte técnico de Azure con los problemas de depuración de errores. Esto también desactiva las nuevas convenciones de nomenclatura de CentOS 7 para NIC. Además de lo anterior, se recomienda quitar los parámetros siguientes:

    rhgb quiet crashkernel=auto
    

    Los arranques gráfico y silencioso no resultan útiles en un entorno en la nube en el que queremos que todos los registros se envíen al puerto serie. Es posible dejar la opción crashkernel configurada si así se desea, pero tenga en cuenta que este parámetro reducirá la cantidad de memoria disponible en la máquina virtual en 128 MB o más, lo cual puede resultar problemático en tamaños de VM más reducidos.

  9. Una vez que termine de editar /etc/default/grub tal como se indicó antes, ejecute el comando siguiente para volver a compilar la configuración de GRUB:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

Nota

Si va a cargar una máquina virtual habilitada para UEFI, el comando para actualizar grub es grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg. Además, el módulo de kernel vfat debe estar habilitado en el kernel; de lo contrario, se producirá un error en el aprovisionamiento.

Asegúrese de que el módulo "udf" está habilitado. Quitarlos o deshabilitarlos provocará un error de aprovisionamiento o arranque. (_Cloud-init >= 21.2 quita el requisito de udf. Lea la parte superior del documento para obtener más detalles).

  1. Si la imagen se crea desde VMware, VirtualBox o KVM: asegúrese de que los controladores de Hyper-V están incluidos en los initramfs:

    Edite /etc/dracut.confy agregue contenido:

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    Vuelva a generar initramfs:

    sudo dracut -f -v
    
  2. Instale el agente de Linux de Azure y las dependencias de las extensiones de máquina virtual de Azure:

    sudo yum install python-pyasn1 WALinuxAgent
    sudo systemctl enable waagent
    
  3. Instalación de cloud-init para controlar el aprovisionamiento

    sudo yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
    
    1. Configure waagent para cloud-init
    sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=auto/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    
    sudo echo "Adding mounts and disk_setup to init stage"
    sudo sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
    sudo sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
    sudo sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
    sudo sed -i '/cloud_init_modules/a\\ - disk_setup' /etc/cloud/cloud.cfg
    
    sudo echo "Allow only Azure datasource, disable fetching network setting via IMDS"
    sudo cat > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
    datasource_list: [ Azure ]
    datasource:
        Azure:
            apply_network_config: False
    EOF
    
    if [[ -f /mnt/swapfile ]]; then
    echo Removing swapfile - RHEL uses a swapfile by default
    swapoff /mnt/swapfile
    rm /mnt/swapfile -f
    fi
    
    echo "Add console log file"
    cat >> /etc/cloud/cloud.cfg.d/05_logging.cfg <<EOF
    
    # This tells cloud-init to redirect its stdout and stderr to
    # 'tee -a /var/log/cloud-init-output.log' so the user can see output
    # there without needing to look on the console.
    output: {all: '| tee -a /var/log/cloud-init-output.log'}
    EOF
    
  4. Configuración de intercambio

    No cree un espacio de intercambio en el disco del sistema operativo.

    Anteriormente, el agente Linux de Azure se usaba para configurar automáticamente un espacio de intercambio mediante el disco de recursos local que se asocia a la máquina virtual, después de que la máquina virtual se aprovisione en Azure. Ahora, en cambio, esto se administra mediante cloud-init; no tiene que usar el agente de Linux para formatear el disco de recursos, crear el archivo de intercambio y modificar los parámetros siguientes en /etc/waagent.conf adecuadamente:

    sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    

    Si quiere montar, formatear y crear un intercambio, puede:

    • Pasarlo como una configuración de cloud-init cada vez que cree una máquina virtual

    • Usar una directiva de cloud-init preparada en la imagen que hará esto cada vez que se cree la máquina virtual:

      sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
      sudo cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
      #cloud-config
      # Generated by Azure cloud image build
      disk_setup:
        ephemeral0:
          table_type: mbr
          layout: [66, [33, 82]]
          overwrite: True
      fs_setup:
        - device: ephemeral0.1
          filesystem: ext4
        - device: ephemeral0.2
          filesystem: swap
      mounts:
        - ["ephemeral0.1", "/mnt"]
        - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
      EOF
      
  5. Ejecute los comandos siguientes para desaprovisionar la máquina virtual y prepararla para aprovisionarse en Azure:

    Nota:

    Si va a migrar una máquina virtual concreta y no desea crear una imagen generalizada, omita el paso de desaprovisionamiento.

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    
  6. Haga clic en Acción> Apagar en el Administrador de Hyper-V. El VHD de Linux ya está listo para cargarse en Azure.

Pasos siguientes

Ya está listo para usar el disco duro virtual de CentOS para crear nuevas máquinas virtuales de Azure. Si es la primera vez que carga el archivo .vhd en Azure, vea Crear una VM Linux a partir de un disco personalizado.