通过调用API 创建迁移任务,将Windows系统服务器迁移为新镜像或迁移到目标ECS实例。
操作步骤
在确保完成迁移前准备、已导入迁移源且已准备访问凭证的情况下,执行以下操作。
步骤一:查看磁盘及分区信息。
以包含2块数据盘的Windows实例为例。
迁移源导入成功后,可登录SMC控制台,单击迁移源id进入详情页面,在基本信息中查看磁盘及分区信息,创建任务时需要使用。

步骤二:安装Java依赖库
在pom.xml文件中,添加以下依赖。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>smc20190601</artifactId>
<!-- 请选择最新版本 -->
<version>1.1.4</version>
</dependency>步骤三:执行任务
示例如下,请根据实际情况替换参数,详细的配置参数及解释请参考 CreateReplicationJob。
创建迁移到镜像任务
import java.util.ArrayList;
import java.util.List;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisks;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksData;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksDataPart;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystem;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystemPart;
import com.aliyun.smc20190601.models.CreateReplicationJobResponse;
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用凭据初始化账号 Client</p>
* @return Client
* @throws Exception
*/
public static com.aliyun.smc20190601.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 请参考 https://api.aliyun.com/product/smc
config.endpoint = "smc.aliyuncs.com";
return new com.aliyun.smc20190601.Client(config);
}
/**
* 创建迁移任务
* 1. 生成新的ECS镜像
* 2. 迁移包含数据盘
* 3. 开启迁移演练
* 4. 使用自动增量同步
*/
public static void main(String[] args_) throws Exception {
com.aliyun.smc20190601.Client client = Sample.createClient();
CreateReplicationJobRequest request = new CreateReplicationJobRequest();
request.setRegionId("cn-beijing");
request.setSourceId("s-bp1xxxxxxxxxxxx");
// 目标类型。 Image:迁移成功后,SMC 的迁移源生成阿里云镜像。 TargetInstance:迁移成功后,SMC 将迁移源直接迁移至目标实例。当设置该参数值时,需要同时指定InstanceId参数。
request.setTargetType("Image");
// 0:服务器迁移, 1:操作系统迁移, 2:跨可用区迁移, 3:VMware 无代理迁移。
request.setJobType(0);
// 0:表示公网传输模式, 此时要求源服务器能够访问公网,迁云数据从公网传输。 2:表示内网传输模式,选用此模式必须设置 VSwitchId 参数(VpcId 参数可以不设置,服务内部可以通过接口反查出来)。
request.setNetMode(0);
/**
* 迁移复制相关参数, 参数为JSON字符串
* image_check: 是否检查镜像,默认为true。
* test_run: 是否进行迁移演练,默认为auto_running, 即演练通过后开始执行迁移。
* bandwidth_limit: 带宽限制,默认为0, 单位为Mbps。
*/
request.setReplicationParameters("{\"bandwidth_limit\":0,\"compress_level\":7,\"checksum\":false,\"image_check\":true,\"use_ssl_tunnel\":true,\"transport_mode\":\"\",\"upload_logs_enable\":true,\"test_run\":\"auto_running\"}");
/**
* 增量迁移相关参数。
* true(默认值):一次性迁移任务。
* false:增量迁移任务。任务创建后,按照设置的Frequency参数值周期性自动执行。
*/
request.setRunOnce(false);
// 增量迁移任务运行的时间间隔,单位:小时。取值范围:1~168。
request.setFrequency(1);
// 增量迁移任务默认保留的最大镜像数。取值范围:1~10。 为 1 表示只保留最近一次数据同步完成后生成的镜像
request.setMaxNumberOfImageToKeep(1);
// 设置待迁移的磁盘参数
CreateReplicationJobRequestDisks disk = new CreateReplicationJobRequestDisks();
request.setDisks(disk);
// 设置系统盘
CreateReplicationJobRequestDisksSystem systemDisk = new CreateReplicationJobRequestDisksSystem();
// 设置系统盘大小,单位:GiB。参数取值需要大于源服务器数据盘实际占用大小。
systemDisk.setSize(40);
List<CreateReplicationJobRequestDisksSystemPart> systemParts = new ArrayList<>();
CreateReplicationJobRequestDisksSystemPart systemPart = new CreateReplicationJobRequestDisksSystemPart();
// 系统盘分区是否开启块复制。windows 必须设置为 true
systemPart.setBlock(true);
// 系统盘分区路径。
systemPart.setPath("C:\\");
// 系统盘分区大小。单位:Byte。
systemPart.setSizeBytes(42842718208L);
systemParts.add(systemPart);
systemDisk.part = systemParts;
disk.setSystem(systemDisk);
List<CreateReplicationJobRequestDisksData> dataDisks = new ArrayList<>();
disk.setData(dataDisks);
// 设置第一块数据盘
CreateReplicationJobRequestDisksData dataDisk1 = new CreateReplicationJobRequestDisksData();
dataDisk1.setSize(40);
List<CreateReplicationJobRequestDisksDataPart> dataDisk1Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData1Part = new CreateReplicationJobRequestDisksDataPart();
disksData1Part.setBlock(true);
disksData1Part.setPath("D:\\");
disksData1Part.setSizeBytes(42931847168L);
dataDisk1Parts.add(disksData1Part);
dataDisk1.setPart(dataDisk1Parts);
dataDisks.add(dataDisk1);
// 设置第二块数据盘
CreateReplicationJobRequestDisksData dataDisk2 = new CreateReplicationJobRequestDisksData();
dataDisk2.setSize(60);
List<CreateReplicationJobRequestDisksDataPart> dataDisk2Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData2Part = new CreateReplicationJobRequestDisksDataPart();
disksData2Part.setBlock(true);
disksData2Part.setPath("E:\\");
disksData2Part.setSizeBytes(64406683648L);
dataDisk2Parts.add(disksData2Part);
dataDisk2.setPart(dataDisk2Parts);
dataDisks.add(dataDisk2);
try {
// 复制代码运行请自行打印 API 的返回值
CreateReplicationJobResponse response = client.createReplicationJob(request);
System.out.println(response.getBody().getJobId());
System.out.println(response.getBody().getRequestId());
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}创建迁移到实例任务
import java.util.ArrayList;
import java.util.List;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisks;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksData;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksDataPart;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystem;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystemPart;
import com.aliyun.smc20190601.models.CreateReplicationJobResponse;
import com.aliyun.tea.TeaException;
public class SampleTargetInstance {
/**
* <b>description</b> :
* <p>使用凭据初始化账号 Client</p>
* @return Client
* @throws Exception
*/
public static com.aliyun.smc20190601.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 请参考 https://api.aliyun.com/product/smc
config.endpoint = "smc.aliyuncs.com";
return new com.aliyun.smc20190601.Client(config);
}
/**
* 创建迁移任务
* 1. 生成新的ECS镜像
* 2. 迁移包含数据盘
* 3. 开启迁移演练
* 4. 使用自动增量同步
*/
public static void main(String[] args_) throws Exception {
com.aliyun.smc20190601.Client client = SampleTargetInstance.createClient();
CreateReplicationJobRequest request = new CreateReplicationJobRequest();
request.setRegionId("cn-beijing");
request.setSourceId("s-bp1xxxxxxxxx");
// 目标类型。 Image:迁移成功后,SMC 为您的迁移源生成阿里云镜像。 TargetInstance:迁移成功后,SMC 将您的迁移源直接迁移至目标实例。当您设置该参数值时,您需要同时指定InstanceId参数。
request.setTargetType("TargetInstance");
request.setInstanceId("i-2ze7xxxxxxxxxx");
// 0:服务器迁移, 1:操作系统迁移, 2:跨可用区迁移, 3:VMware 无代理迁移。
request.setJobType(0);
// 0:表示公网传输模式, 此时要求您的源服务器能够访问公网,迁云数据从公网传输。 2:表示内网传输模式,选用此模式必须设置 VSwitchId 参数(VpcId 参数可以不设置,服务内部可以通过接口反查出来)。
request.setNetMode(0);
/**
* 迁移复制相关参数, 参数为JSON字符串
* image_check: 是否检查镜像,默认为true。
* test_run: 是否进行迁移演练,默认为auto_running, 即演练通过后开始执行迁移。
* bandwidth_limit: 带宽限制,默认为0, 单位为Mbps。
*/
request.setReplicationParameters("{\"bandwidth_limit\":0,\"compress_level\":7,\"checksum\":false,\"image_check\":true,\"use_ssl_tunnel\":true,\"transport_mode\":\"\",\"upload_logs_enable\":true,\"test_run\":\"auto_running\"}");
/**
* 增量迁移相关参数。
* true(默认值):一次性迁移任务。
* false:增量迁移任务。任务创建后,按照您设置的Frequency参数值周期性自动执行。
*/
request.setRunOnce(false);
// 增量迁移任务运行的时间间隔,单位:小时。取值范围:1~168。
request.setFrequency(1);
// 增量迁移任务默认保留的最大镜像数。取值范围:1~10。 为 1 表示只保留最近一次数据同步完成后生成的镜像
request.setMaxNumberOfImageToKeep(1);
// 设置待迁移的磁盘参数
CreateReplicationJobRequestDisks disk = new CreateReplicationJobRequestDisks();
request.setDisks(disk);
// 设置系统盘
CreateReplicationJobRequestDisksSystem systemDisk = new CreateReplicationJobRequestDisksSystem();
// 设置系统盘大小,单位:GiB。参数取值需要大于源服务器数据盘实际占用大小。
systemDisk.setSize(40);
List<CreateReplicationJobRequestDisksSystemPart> systemParts = new ArrayList<>();
CreateReplicationJobRequestDisksSystemPart systemPart = new CreateReplicationJobRequestDisksSystemPart();
// 系统盘分区是否开启块复制。windows 必须设置为 true
systemPart.setBlock(true);
// 系统盘分区路径。
systemPart.setPath("C:\\");
// 系统盘分区大小。单位:Byte。
systemPart.setSizeBytes(42842718208L);
systemParts.add(systemPart);
systemDisk.part = systemParts;
disk.setSystem(systemDisk);
List<CreateReplicationJobRequestDisksData> dataDisks = new ArrayList<>();
disk.setData(dataDisks);
// 设置第一块数据盘
CreateReplicationJobRequestDisksData dataDisk1 = new CreateReplicationJobRequestDisksData();
dataDisk1.setSize(40);
// 设置源服务器数据盘对应的目标实例数据盘的磁盘ID
dataDisk1.setDiskId("d-2ze78i9koxxxxx");
List<CreateReplicationJobRequestDisksDataPart> dataDisk1Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData1Part = new CreateReplicationJobRequestDisksDataPart();
disksData1Part.setBlock(true);
disksData1Part.setPath("D:\\");
disksData1Part.setSizeBytes(42931847168L);
dataDisk1Parts.add(disksData1Part);
dataDisk1.setPart(dataDisk1Parts);
dataDisks.add(dataDisk1);
// 设置第二块数据盘
CreateReplicationJobRequestDisksData dataDisk2 = new CreateReplicationJobRequestDisksData();
dataDisk2.setSize(60);
// 设置源服务器数据盘对应的目标实例数据盘的磁盘ID
dataDisk2.setDiskId("d-2ze7xxxxxxxxxx");
List<CreateReplicationJobRequestDisksDataPart> dataDisk2Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData2Part = new CreateReplicationJobRequestDisksDataPart();
disksData2Part.setBlock(true);
disksData2Part.setPath("E:\\");
disksData2Part.setSizeBytes(64406683648L);
dataDisk2Parts.add(disksData2Part);
dataDisk2.setPart(dataDisk2Parts);
dataDisks.add(dataDisk2);
try {
// 复制代码运行请自行打印 API 的返回值
CreateReplicationJobResponse response = client.createReplicationJob(request);
System.out.println(response.getBody().getJobId());
System.out.println(response.getBody().getRequestId());
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}若使用Java SDK 创建的任务运行失败,请参见常见问题。
该文章对您有帮助吗?