文档

启动模式UEFI/BIOS(Legacy)最佳实践

更新时间:

启动模式是指创建ECS实例的过程中对系统盘进行引导的方式,包括UEFI(Unified Extensible Firmware Interface)和BIOS(Basic Input Output System)两类。本文为您介绍两种启动模式的差异、如何查看以及修改镜像的启动模式。

启动模式简介

创建ECS实例时的启动模式取决于选择的实例规格支持的启动模式属性以及选择的镜像的启动模式属性。

实例规格的启动模式

ECS实例规格支持的启动模式包括UEFI和BIOS(Legacy),或者既支持UEFI也支持BIOS(Legacy),不可修改。不同实例规格族对启动模式的支持情况如下表所示。

启动模式

规格族

仅支持BIOS(Legacy)

  • 企业级x86计算规格族群

    • ecs.i2, ecs.i2g, ecs.i2ne, ecs.i2gne, ecs.d2s, ecs.re6, ecs.d2c, ecs.u1, ecs.d3s, ecs.d3c, ecs.i3g, ecs.i4g, ecs.i4p, ecs.i4r

    • ecs.hfc5, ecs.ic5

    • ecs.g6a, ecs.c6a, ecs.r6a, ecs.g6h, ecs.re6p

    • ecs.g7a, ecs.r7a, ecs.c7a, ecs.re7p, ecs.r7p, ecs.g7nex, ecs.c7nex

  • 企业级异构计算规格族群

    • ecs.gn5, ecs.gn5i, ecs.vgn5i

    • ecs.gn6e, ecs.gn6i, ecs.gn6v, ecs.vgn6i-vws

    • ecs.gn7, ecs.gn7e, ecs.gn7i, ecs.gn7r, ecs.gn7s, ecs.sgn7i-vws, ecs.vgn7i-vws, ecs.sccgn7ex

  • 弹性裸金属服务器和超级计算集群(SCC)实例规格族群

    • ecs.ebmg5, ecs.ebmr5, ecs.ebmhfg5

    • ecs.ebmg6e, ecs.ebmc6e, ecs.hfr6, ecs.ebmc6, ecs.ebmr6, ecs.ebmgn6i, ecs.ebmgn6v

    • ecs.ebmr7, ecs.ebmg7, ecs.ebmc7, ecs.ebmhfr7, ecs.ebmhfg7, ecs.ebmhfc7, ecs.ebmgn7e, ecs.ebmgn7i

仅支持UEFI

  • 企业级x86计算规格族群

    • ecs.c6t, ecs.g6t

    • ecs.c7t, ecs.g7t, ecs.r7t

  • 企业级ARM计算规格族群

    • ecs.c6r, ecs.g6r

    • ecs.g8y, ecs.c8y, ecs.r8y

  • 弹性裸金属服务器和超级计算集群(SCC)实例规格族群

    • ecs.ebmg6a, ecs.ebmr6a, ecs.ebmc6a, ecs.ebmgn6ia

    • ecs.ebmg7a, ecs.sccc7, ecs.sccg7, ecs.ebmc7a, ecs.ebmr7a, ecs.ebmgn7ex, ecs.ebmgn7ix, ecs.ebmgn7vx

既支持BIOS(Legacy)也支持UEFI

  • 企业级x86计算规格族群

    • ecs.g5, ecs.c5, ecs.g5ne, ecs.hfg5, ecs.r5

    • ecs.g6, ecs.c6, ecs.c6e, ecs.hfg6, ecs.g6e, ecs.r6e, ecs.hfc6, ecs.r6

    • ecs.g7, ecs.c7, ecs.r7, ecs.hfg7, ecs.g7ne, ecs.hfc7, ecs.hfr7, ecs.g7nex, ecs.c7nex

    • ecs.g8i, ecs.c8i, ecs.g8a, ecs.c8a, ecs.r8a, ecs.g8ae, ecs.c8ae, ecs.r8ae, ecs.hfg8i, ecs.hfc8i, ecs.hfr8i

  • 共享型x86计算规格族群

    • ecs.n4

    • ecs.t5

    • ecs.s6, ecs.t6

在创建ECS实例过程中,选择的实例规格启动模式会约束可以选择的镜像版本。例如您选择了仅支持UEFI启动模式的安全增强型实例规格,则仅能选择UEFI版本的镜像。示例如下图所示:

image..png

镜像的启动模式

创建ECS实例过程中会根据镜像的启动模式属性值对系统盘进行引导。

  • 公共镜像

    公共镜像的启动模式不支持修改。

    • UEFI版本的公共镜像:UEFI启动模式。

      例如Alibaba Cloud Linux 2.1903 64位UEFI版、Ubuntu 18.04 64位UEFI版、Debian 11.6 64位UEFI版等操作系统名称带UEFI的公共镜像的启动模式是UEFI。

    • ARM版本的公共镜像:UEFI启动模式。

      例如Ubuntu 20.04 64位ARM版、CentOS 8.4 64位ARM版等操作系统名称带ARM的公共镜像的启动模式是UEFI。

    • 其他公共镜像:BIOS(Legacy)启动模式。

  • 自定义镜像

    自定义镜像的启动模式默认会继承原镜像的启动模式。如果您希望修改启动模式,请参见修改镜像的启动模式

UEFI相对于BIOS(Legacy)的优势

  • 支持大容量硬盘(突破大小限制)

    传统BIOS(Legacy)采用MBR(主引导记录分区)分区表,仅支持2 TB以下的硬盘。而UEFI采用GPT(全局分区)分区表,可以支持2 TB以上的硬盘。

  • 速度和性能

    UEFI启动时只需要加载必要的驱动程序,而传统BIOS(Legacy)启动时需要扫描所有设备,所以UEFI相比于BIOS(Legacy)启动速度更快一些。

  • 安全性

    UEFI还提供安全启动功能。UEFI只允许在启动时加载真实的驱动程序和服务,以确保在实例启动时不会加载任何恶意软件。UEFI还要求驱动程序和内核具有数字签名,这使其成为打击盗版和引导扇区恶意软件的有效工具。

  • 可扩展性

    UEFI是一个可扩展的、标准化的固态接口,而BIOS(Legacy)是固定的、缺乏文档的、完全基于经验和晦涩约定的一个事实标准。

  • 使用方式

    UEFI是32位或64位高级语言程序(C语言),突破实模式限制,可以达到要求的最大寻址。而BIOS(Legacy)是16位的汇编语言程序,只能运行在16位实模式,可访问的内存也只有1 MB。

查看镜像的启动模式

您可以通过ECS控制台和API接口两种方式查看镜像的启动模式。

  • 方式一:ECS控制台

    您可以在ECS控制台的镜像详情页面查看镜像的启动模式。

    image
  • 方式二:OpenAPI

    您可以通过DescribeImages接口返回值中的BootMode参数值判断镜像的启动模式。

    • BootMode=BIOS:启动模式为BIOS(Legacy)

    • BootMode=UEFI:启动模式为UEFI

制作UEFI/BIOS(Legacy)镜像

您可以通过ECS控制台和OpenAPI(导入镜像或者创建镜像)两种方式制作UEFI/BIOS(Legacy)镜像。

方式一:ECS控制台

控制台目前仅支持在导入镜像时指定镜像的启动模式。如下图所示,ARM架构默认UEFI启动模式,非ARM架构可以根据需要选择合适的启动模式。更多信息,请参见导入自定义镜像

image

方式二:OpenAPI

您可以通过导入镜像或者创建镜像两个API接口来制作UEFI/BIOS(Legacy)镜像。

  • 导入镜像

    制作UEFI镜像(Java版)

    import com.aliyuncs.CommonRequest;
    import com.aliyuncs.CommonResponse;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.profile.DefaultProfile;
    /*
    pom.xml
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.6.0</version>
    </dependency>
    */
    
    public class ImportImage {
        public static void main(String[] args) {
    
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<your-access-key-id>", "<your-access-key-secret>");
            IAcsClient client = new DefaultAcsClient(profile);
            CommonRequest request = new CommonRequest();
    
            request.setSysMethod(MethodType.POST);
            request.setSysDomain("ecs-cn-hangzhou.aliyuncs.com");
            request.setSysVersion("2014-05-26");
            request.setSysAction("ImportImage");
            request.putQueryParameter("RegionId", "cn-hangzhou");
            request.putQueryParameter("BootMode", "UEFI");
            request.putQueryParameter("DiskDeviceMapping.1.DiskImSize", "20");
            request.putQueryParameter("DiskDeviceMapping.1.OSSBucket", "ale-test");
            request.putQueryParameter("DiskDeviceMapping.1.OSSObject", "aliyun.raw");
            request.putQueryParameter("Platform", "Aliyun");
            try {
                CommonResponse response = client.getCommonResponse(request);
                System.out.println(response.getData());
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                e.printStackTrace();
            }
        }
    }
    

    制作BIOS(Legacy)镜像(Python版)

    #!/usr/bin/env python
    #coding=utf-8
    
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.request import CommonRequest
    from aliyunsdkcore.auth.credentials import AccessKeyCredential
    from aliyunsdkcore.auth.credentials import StsTokenCredential
    
    credentials = AccessKeyCredential('<your-access-key-id>', '<your-access-key-secret>')
    client = AcsClient(region_id='cn-hangzhou', credential=credentials)
    
    request = CommonRequest()
    request.set_accept_format('json')
    request.set_domain('ecs-cn-hangzhou.aliyuncs.com')
    request.set_method('POST')
    request.set_protocol_type('https') # https | http
    request.set_version('2014-05-26')
    request.set_action_name('ImportImage')
    
    request.add_query_param('RegionId', "cn-hangzhou")
    request.add_query_param('BootMode', "BIOS")
    request.add_query_param('DiskDeviceMapping.1.DiskImSize', "20")
    request.add_query_param('DiskDeviceMapping.1.OSSBucket', "ale-test")
    request.add_query_param('DiskDeviceMapping.1.OSSObject', "aliyun.raw")
    request.add_query_param('Platform', "Aliyun")
    
    response = client.do_action(request)
    print(str(response, encoding = 'utf-8'))
    
  • 创建镜像

    制作UEFI镜像(Java版)

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.google.gson.Gson;
    import java.util.*;
    import com.aliyuncs.ecs.model.v20140526.*;
    /*
    pom.xml
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.6.0</version>
    </dependency>
    */
    
    public class CreateImage {
    
        public static void main(String[] args) {
    
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<your-access-key-id>", "<your-access-key-secret>");
            IAcsClient client = new DefaultAcsClient(profile);
    
            CreateImageRequest request = new CreateImageRequest();
            request.setRegionId("cn-hangzhou");
            request.setInstanceId("i-xxxx");
            request.setBootMode("UEFI");
            request.setImageName("test-uefi");
    
            try {
                CreateImageResponse response = client.getAcsResponse(request);
                System.out.println(new Gson().toJson(response));
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                System.out.println("ErrCode:" + e.getErrCode());
                System.out.println("ErrMsg:" + e.getErrMsg());
                System.out.println("RequestId:" + e.getRequestId());
            }
    
        }
    }
    

    制作BIOS(Legacy)镜像(Python版)

    #!/usr/bin/env python
    #coding=utf-8
    
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkcore.auth.credentials import AccessKeyCredential
    from aliyunsdkcore.auth.credentials import StsTokenCredential
    from aliyunsdkecs.request.v20140526.CreateImageRequest import CreateImageRequest
    
    credentials = AccessKeyCredential('<your-access-key-id>', '<your-access-key-secret>')
    client = AcsClient(region_id='cn-hangzhou', credential=credentials)
    
    request = CreateImageRequest()
    request.set_accept_format('json')
    
    request.set_InstanceId("i-xxxx")
    request.set_ImageName("test-bios")
    request.set_BootMode("BIOS")
    
    response = client.do_action_with_exception(request)
    print(str(response, encoding='utf-8'))
    

修改自定义镜像的启动模式

您可以通过ECS控制台和OpenAPI两种方式修改自定义镜像的启动模式。

修改镜像的启动模式适用于以下场景:

  • 如果您修改了ECS实例系统盘的引导分区配置, 并希望基于该实例创建的自定义镜像能够按照新的启动模式引导,则需要修改自定义镜像的启动模式。

  • 您导入自定义镜像时误选启动模式,希望后期修改。

说明

镜像有关联实例时,不允许修改镜像的启动模式。

方式一:ECS控制台

您可以在ECS控制台的镜像详情页面,修改镜像的启动模式。具体操作,请参见修改自定义镜像的属性信息

方式二:OpenAPI

您可以通过ModifyImageAttribute接口修改BootMode参数值来变更镜像的启动模式。

修改启动模式为UEFI模式(Java版)

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.ecs.model.v20140526.*;
/*
pom.xml
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.6.0</version>
</dependency>
*/

public class ModifyImageAttribute {

    public static void main(String[] args) {

        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<your-access-key-id>", "<your-access-key-secret>");
        IAcsClient client = new DefaultAcsClient(profile);

        ModifyImageAttributeRequest request = new ModifyImageAttributeRequest();
        request.setRegionId("cn-hangzhou");
        request.setImageId("m-xxx");
        request.setBootMode("UEFI");

        try {
            ModifyImageAttributeResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}

修改启动模式为BIOS(Legacy)模式(Python版)

#!/usr/bin/env python
#coding=utf-8

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.auth.credentials import AccessKeyCredential
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdkecs.request.v20140526.ModifyImageAttributeRequest import ModifyImageAttributeRequest

credentials = AccessKeyCredential('<your-access-key-id>', '<your-access-key-secret>')
client = AcsClient(region_id='cn-hangzhou', credential=credentials)
request = ModifyImageAttributeRequest()
request.set_accept_format('json')
request.set_ImageId("m-xxx")
request.set_BootMode("BIOS")

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

  • 本页导读 (1)
文档反馈