制作镜像时自定义实例初始化配置

ECS实例创建过程中,默认通过初始化工具自动执行一些预定义的配置任务,例如网络配置、主机名设置以及自定义脚本的执行等。如果您希望在实例启动过程中禁用某些自动执行的操作,可以根据需求自定义初始化工具的功能。本文将详细介绍Linux实例和Windows实例的初始化工具及其使用说明。

初始化工具介绍

不同类型的操作系统使用的初始化工具会有所不同,对于Linux实例,由cloud-init工具负责完成自动初始化,而Windows实例则由Vminit工具进行自动初始化。有关初始化工具的更多信息,请参见如下内容。

cloud-init工具介绍

Linux实例通过开源工具cloud-init来完成自动初始化实例。更多信息,请参见cloud-init官方文档

  • 在cloud-init中,定义了一系列的模块(Modules)来完成需要执行的任务和配置。每个模块都有名称、运行频率、配置参数这三大要素,其中运行频率表示该模块该在什么时候运行,通常有两种运行频率:once-per-instance表示仅在实例首次启动时运行;always表示实例每次启动时都会运行。更多信息,请参见Module reference

  • cloud-init通过配置文件/etc/cloud/cloud.cfg控制实例的初始化行为,例如运行哪些模块。在运行模块时,cloud-init可以从元数据服务中获取实例的实例ID、主机名等元数据信息。以Set Hostname模块为例,实例启动时,cloud-init会读取元数据的主机名信息,并将其设置为实例的主机名。

说明

阿里云所有公共镜像以及基于公共镜像创建的自定义镜像已默认安装cloud-init,通过公共镜像创建ECS实例会自动运行cloud-init,无需再手动安装。如果您是通过本地制作的自定义镜像创建ECS实例,且镜像未安装cloud-init,需要手动安装cloud-init,具体操作,请参见安装cloud-init

Vminit工具介绍

Windows实例通过Vminit初始化工具完成自动初始化,该工具本质上是通过顺序执行一系列插件来完成系统的初始化配置。其中,部分插件仅在实例首次创建并启动时执行一次,而某些插件则在每次实例启动时均会执行。在使用Windows镜像创建实例的过程中,将默认自动执行Vminit所有插件的初始化功能。目前,Vminit包含10个插件,具体说明见下表。

Vminit工具插件列表

插件名称

执行频率

插件功能

说明

Plugin_Main_StartDepend

仅在实例首次启动时执行。

启动Windows操作系统的IP Helper服务、DHCP客户端和Windows时间服务(W32Time) 。

Windows镜像默认开启这些系统服务,但是您可能在自定义镜像中禁用了这些服务,该插件会开启这些服务,避免因禁用系统服务导致网络和NTP设置异常。

Plugin_Main_OpenRDP

允许通过远程桌面连接服务RDP连接实例。

Windows系统默认开启RDP服务,对于禁用RDP服务的镜像,该插件会开启RDP。

Plugin_Main_NetworkClean

初始化网络配置,系统会使用DHCP方式自动获取实例中所有网卡的IP地址和DNS服务器设置。

如果实例中的IP Helper和DHCP服务未正确开启,可能导致该插件执行失败,从而无法通过内网访问实例元数据。

Plugin_Main_ConfigDisk

将随实例创建的数据盘进行初始化,包括创建分区、分配盘符等,且分区格式默认为GPT。

  • 在实例创建过程中,如果同时添加了新的数据盘,数据盘是未初始化的。为提高您的便利,本插件会自动对数据盘进行初始化并设置为联机状态。

  • 在实例创建过程中,如果添加的是带有数据的数据盘,Vminit不会对其进行初始化。

Plugin_Main_ExtendVolume

自动检测Windows系统盘的空闲空间,并利用diskpart命令来扩展系统盘。

无。

Plugin_Main_CloudinitUserData

该插件会从阿里云的元数据中获取您配置的自定义数据,并使用系统的system账户执行自定义数据脚本。

Plugin_Main_ConfigHostname

实例每次启动时都会执行。

设置实例的主机名。在实例创建阶段,阿里云会为每个实例分配一个主机名。如果您在创建实例时指定了主机名,系统将根据您设定的主机名进行配置。否则,阿里云将自动分配一个随机的主机名。

  • 设置主机名会强制重启系统,重启系统会在该插件执行完毕后立即执行。

  • 如果实例的主机名与您配置的主机名一致,则不会重复设置主机名。

  • 如果您本身不依赖阿里云修改主机名,而是由您自定义设置实例的主机名,可以禁用该插件。例如,您在自定义镜像中增加了开机启动修改主机名的逻辑,这可能与Vminit这个插件的逻辑冲突,这种情况下,建议在创建自定义镜像时,禁用该插件。具体操作,请参见通过Vminit配置文件自定义Windows实例初始化

Plugin_Main_ConfigWsus

该插件会从阿里云的元数据中获取WSUS地址,并配置到实例中。如果实例的WSUS地址已经配置成阿里云的WSUS地址,则不会重复配置。

该插件依赖内网访问能力。

Plugin_Main_ConfigKms

该插件会从阿里云的元数据中获取KMS地址,配置到实例后会进行KMS激活。如果实例KMS已经激活且KMS相同,则不会重复配置。

该插件依赖内网访问能力。

Plugin_Main_ConfigNtp

配置NTP时钟源,用于时间同步。该插件会从阿里云的元数据中获取NTP服务器地址,并配置到实例中。如果实例已经配置了相同的NTP地址,则不会重复配置。

  • 该插件依赖内网访问能力。

  • 该插件依赖W32Time服务。

说明

2023年09月份及之后的Windows公共镜像以及基于公共镜像创建的自定义镜像已默认安装Vminit,通过公共镜像创建ECS实例会自动运行Vminit,无需再手动安装。如果您是通过本地制作的自定义镜像创建ECS实例,且镜像未安装Vminit,需要手动安装Vminit,保证运行该镜像的ECS实例能成功完成初始化配置。具体操作,请参见安装Vminit

Vminit会不定期发布版本更新,以下为Vminit的版本发布信息。

Vminit版本

发布内容

发布日期

2.0.1.2

  • 清除Windows事件管理器中的报错告警。

  • Userdata的Bat脚本支持延迟变量。

2024年01月

2.0.1.0

首次发布,支持插件化可配置。

2023年09月

制作镜像时自定义实例初始化配置

如果您希望在实例启动时使用自定义配置完成实例的初始化,您可以在制作镜像时,通过自定义相应的初始化工具进行配置。具体操作,请参考如下内容。

说明

在制作镜像过程中,您可以通过自定义初始化工具完成配置的自定义,以便通过配置好的自定义镜像启动实例,有关制作Linux镜像文件的完整操作步骤,请参见制作Linux镜像文件,有关制作Windows镜像文件的完整操作步骤,请参见制作Windows镜像文件

通过cloud-init配置文件自定义Linux实例初始化

如果您不希望在实例启动过程中自动执行某些操作,您可以通过修改cloud-init配置文件以自定义cloud-init默认初始化行为。cloud-init配置文件地址为/etc/cloud/cloud.cfg,以下以禁用自动配置实例主机名及禁用自动配置网络初始化为例,为您介绍如何操作禁用相关模块。

  • 禁用阿里云自动配置实例主机名

    cloud-init默认会在实例启动时自动设置主机名并更新/etc/hosts文件,如果您不希望修改主机名以及/etc/hosts配置文件,可以按照以下操作步骤进行操作。

    1. 运行以下命令,以打开cloud-init的默认配置文件,按i进入编辑模式。

      sudo vim /etc/cloud/cloud.cfg
    2. 将配置文件中的preserve_hostname: false修改为preserve_hostname: true

    3. Esc键,输入:wq,按Enter键关闭并保存配置文件。

  • 禁用阿里云自动配置网络初始化

    如果您的cloud-init版本为18或更高版本,会自动完成网络的初始化配置,如果您不希望初始化工具自动初始化网络配置,可以按照以下操作步骤进行操作。

    1. 运行以下命令,以打开cloud-init的默认配置文件,按i进入插入模式。

      sudo vim /etc/cloud/cloud.cfg
    2. Example datasource config之前增加disabled配置,禁用cloud-init的网络自动配置功能。

      network:
        config: disabled
    3. Esc键,输入:wq,按Enter键关闭并保存配置文件。

通过Vminit配置文件自定义Windows实例初始化

实例创建过程中会默认自动执行Vminit所有插件的初始化功能。如果您是通过自定义镜像创建实例,且希望在实例启动过程中不自动执行某些操作,可以在制作镜像过程中禁用对应的插件。

  1. C:\ProgramData\aliyun\vminit目录下新建一个文件。该文件有如下要求:

    • 文件名称必须为customized_config

    • 文件不能添加任何后缀

    • 给文件添加内容时,必须是JSON格式。

    说明

    ProgramData通常是隐藏目录,请确保启用了显示隐藏的文件、文件夹和驱动器选项,以便您能看到并正确操作隐藏项目。

  2. 以下以禁用自动配置实例主机名以及初始化数据盘插件为例,为您介绍如何操作禁用相关插件。

    • 禁用阿里云自动配置实例主机名以及初始化数据盘。

      如果您不需要阿里云自动配置实例主机名以及初始化数据盘,您可以同时禁用Plugin_Main_ConfigHostname和Plugin_Main_ConfigDisk插件。在customized_config文件中复制如下信息(JSON格式)并保存文件。

      {
       "disabledPlugins": ["Plugin_Main_ConfigHostname", "Plugin_Main_ConfigDisk"]
      }
说明

如果您后续需要重新启用某个插件,可以在customized_config文件中删除对应插件的配置内容。

常见问题

创建Windows实例时为什么会有一次重启动作?

  • 原因:阿里云在创建Windows实例过程中,即使您没有指定主机名,系统也会默认分配一个主机名。而Windows实例的主机名需要系统重启才能生效,因此在创建阶段,系统会有一个重启过程。

  • 解决方案:如果您本身不依赖阿里云修改主机名,而是由您自定义设置实例的主机名,可以通过禁用Plugin_Main_ConfigHostname插件来解决。禁用后,系统将不会为实例自动分配主机名。

说明

Linux实例设置主机名后无需重启即可直接生效。

相关文档

您可以在创建实例时选择使用自定义数据来初始化该实例。具体操作,请参见自定义实例初始化配置