Todos los productos
Search
Centro de documentos

Elastic Compute Service:Imagen personalizada de Linux

Última actualización: Sep 02, 2026

Agregue un script de análisis a una imagen de Linux que use una versión de sistema operativo no compatible con ECS y no admita cloud-init, para habilitar la configuración automática en el primer arranque.

Nota

Una imagen de Linux con una versión de sistema operativo no compatible se considera una imagen de plataforma no estándar. Estas imágenes se basan en sistemas operativos estándar, pero contienen archivos del sistema, entornos o aplicaciones que no cumplen los requisitos de la plataforma. Seleccione una de las opciones a continuación de OS Version al importar:

  • Others Linux: ECS no procesa las instancias creadas con este tipo de imagen. Configure manualmente la dirección IP, las rutas, la contraseña y otros parámetros después de crear la instancia.

  • Customized Linux: Requiere la configuración descrita en este tema antes de la importación.

Requisitos previos

La imagen debe cumplir los siguientes requisitos:

  • La primera partición (generalmente /dev/sda1 o /dev/vda1) tiene permisos de escritura.

  • La primera partición usa FAT32, EXT2, EXT3, EXT4 o UFS como sistema de archivos.

    Nota

    Ejecute blkid /dev/sdXn para comprobar el tipo de sistema de archivos. Reemplace /dev/sdXn por la ruta real de la primera partición, como /dev/sda1.

  • El tamaño virtual de la imagen supera los 5 GiB.

    Nota

    Ejecute df -h /dev/sdXn para verificar el espacio de la partición. Reemplace /dev/sdXn por la ruta real de la primera partición, como /dev/sda1.

Procedimiento

  1. Inicie sesión en la máquina virtual de origen como usuario root.

  2. Cree un directorio llamado aliyun_custom_image en el directorio raíz de la primera partición.

    mkdir /aliyun_custom_image

    En el primer arranque, Alibaba Cloud escribe información de la instancia, como el nombre de host, la contraseña del usuario root y las direcciones de los servidores DNS, en el archivo os.conf dentro del directorio aliyun_custom_image. El sistema crea os.conf automáticamente si no existe.

    Contenido de ejemplo de os.conf:

    hostname=<yourHostName>
    password=<yourPassword>
    eth0_ip_addr=10.0.0.2
    eth0_mac_addr=00:xx:xx:xx:xx:23
    eth0_netmask=255.255.255.0
    eth0_gateway=10.0.0.1
    eth0_route="0.0.0.0/0 10.0.0.1"
    dns_nameserver="7.7.X.X 8.8.8.8"

    Parámetros del ejemplo:

    Parámetro

    Descripción

    hostname

    Nombre de host de la instancia.

    password

    Contraseña del usuario root.

    eth0_ip_addr

    Dirección IP de la NIC eth0.

    eth0_mac_addr

    Dirección MAC de la NIC eth0.

    eth0_netmask

    Máscara de subred de la NIC eth0.

    eth0_gateway

    Dirección IP de la puerta de enlace predeterminada de eth0.

    eth0_route

    Rutas internas para eth0. Separadas por espacios.

    dns_nameserver

    Direcciones de servidores DNS. Separadas por espacios.

  3. Cree un script de análisis, como un archivo de servicio llamado customized-config.service, para leer y aplicar configuraciones del sistema desde el archivo os.conf.

    Este script se ejecuta en el primer arranque para configurar el nombre de host, la contraseña del usuario root, las direcciones de los servidores DNS y los ajustes de red.

    Script de ejemplo:

    #!/bin/bash
    
    ### BEGIN INIT INFO
    # Provides:          os-conf
    # Required-Start:    $local_fs $network $named $remote_fs
    # Required-Stop:
    # Should-Stop:
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: The initial os-conf job, config the system.
    ### END INIT INFO
    
    first_partition_dir='/boot/'
    os_conf_dir=${first_partition_dir}/aliyun_custom_image
    os_conf_file=${os_conf_dir}/os.conf
    
    load_os_conf() {
        if [[ -f $os_conf_file ]]; then
            . $os_conf_file
            return 0
        else
            return 1
        fi
    }
    
    cleanup() {
        # ensure $os_conf_file is deleted, to avoid repeating config system
        rm $os_conf_file >& /dev/null
        # ensure $os_conf_dir exists
        mkdir -p $os_conf_dir
    }
    
    config_password() {
        if [[ -n $password ]]; then
            password=$(echo $password | base64 -d)
            if [[ $? == 0 && -n $password ]]; then
                echo "root:$password" | chpasswd
            fi
        fi
    }
    
    config_hostname() {
        if [[ -n $hostname ]]; then
            sed -i "s/^HOSTNAME=.*/HOSTNAME=$hostname/" /etc/sysconfig/network
            hostname $hostname
        fi
    }
    
    config_dns() {
        if [[ -n $dns_nameserver ]]; then
            dns_conf=/etc/resolv.conf
            sed -i '/^nameserver.*/d' $dns_conf
            for i in $dns_nameserver; do
                echo "nameserver $i" >> $dns_conf
            done
        fi
    }
    
    is_classic_network() {
        # vpc: eth0
        # classic: eth0 eth1
        grep -q 'eth1' $os_conf_file
    }
    
    config_network() {
        /etc/init.d/network stop
        config_interface eth0 ${eth0_ip_addr} ${eth0_netmask} ${eth0_mac_addr}
        config_route eth0 "${eth0_route}"
        if is_classic_network ; then
            config_interface eth1 ${eth1_ip_addr} ${eth1_netmask} ${eth1_mac_addr}
            config_route eth1 "${eth1_route}"
        fi
        /etc/init.d/network start
    }
    
    config_interface() {
        local interface=$1
        local ip=$2
        local netmask=$3
        local mac=$4
        interface_cfg="/etc/sysconfig/network-scripts/ifcfg-${interface}"
        cat << EOF > $interface_cfg
    DEVICE=$interface
    IPADDR=$ip
    NETMASK=$netmask
    HWADDR=$mac
    ONBOOT=yes
    BOOTPROTO=static
    EOF
    }
    
    config_default_gateway() {
        local gateway=$1
        sed -i "s/^GATEWAY=.*/GATEWAY=$gateway/" /etc/sysconfig/network
    }
    
    config_route() {
        local interface=$1
        local route="$2"
        route_conf=/etc/sysconfig/network-scripts/route-${interface}
        > $route_conf
        echo $route | sed 's/;/\n/' | \
            while read line; do
                dst=$(echo $line | awk '{print $1}')
                gw=$(echo $line | awk '{print $2}')
                if ! grep -q "$dst" $route_conf 2> /dev/null; then
                    echo "$dst via $gw dev $interface" >> $route_conf
                fi
                if [[ "$dst" == "0.0.0.0/0" ]]; then
                    config_default_gateway $gw
                fi
            done
    }
    
    ################## sysvinit service portal ####################
    
    start() {
        if load_os_conf ; then
            config_password
            config_network
            config_hostname
            config_dns
            cleanup
            return 0
        else
            echo "not load $os_conf_file"
            return 0
        fi
    }
    
    RETVAL=0
    
    case "$1" in
        start)
            start
            RETVAL=$?
        ;;
        *)
            echo "Usage: $0 {start}"
            RETVAL=3
        ;;
    esac
    
    exit $RETVAL
  4. Habilite la ejecución del script al inicio del sistema.

    Los comandos a continuación son para Ubuntu. Ajústelos según su sistema operativo.

    sudo systemctl daemon-reload
    sudo systemctl enable customized-config.service
    Nota

    Las imágenes personalizadas creadas a partir de una instancia Customized Linux heredan este script de inicio. Alibaba Cloud aplica la configuración de os.conf únicamente en el primer arranque.

Referencias

Después de configurar la imagen, seleccione Customized Linux como OS Version cuando importe la imagen personalizada.