Use the SMC API to create a migration task that migrates a Linux server to a new image or to a target ECS instance.
Procedure
Make sure you have completed pre-migration preparation, imported the migration source, and prepared access credentials.
Step 1: View disk and partition information
The following example uses a Linux instance with two data disks.
After the migration source is imported, log on to the SMC console and click the migration source ID to open its details page. Under Basic Information, note the disk and partition details for use when creating the task.
The disk information section at the bottom of the migration source details page shows partition and mount details for three disks: Disk #0 (system disk, 40 GB), Disk #1 (data disk 1, 40 GB), and Disk #2 (data disk 2, 60 GB). Record each disk’s size and partition mount point for use when creating the migration task.
Step 2: Install Java dependency libraries
Add the following dependency to your pom.xml file.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>smc20190601</artifactId>
<!-- Choose the latest version -->
<version>1.1.4</version>
</dependency>
Step 3: Run the task
The following examples show how to create migration tasks. Replace parameters as needed. For parameter details, see CreateReplicationJob.
Create a task to migrate to an image
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 SampleLinux {
/**
* description :
* <p>Initialize the client using credentials</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"));
config.endpoint = "smc.aliyuncs.com";
return new com.aliyun.smc20190601.Client(config);
}
/**
* Create a migration task
* 1. Generate a new ECS image
* 2. Migrate data disks
* 3. Enable migration rehearsal
* 4. Use automatic incremental synchronization
*/
public static void main(String[] args_) throws Exception {
com.aliyun.smc20190601.Client client = SampleLinux.createClient();
CreateReplicationJobRequest request = new CreateReplicationJobRequest();
request.setRegionId("cn-beijing");
request.setSourceId("s-b********");
// Target type. Image: After successful migration, SMC creates an Alibaba Cloud image from the migration source.
request.setTargetType("Image");
// 0: Server migration, 1: OS migration, 2: Cross-zone migration, 3: VMware agentless migration.
request.setJobType(0);
// 0: Public network transfer mode. The source server must have Internet access. Migration data travels over the public network.
// 2: Private network transfer mode. If you choose this mode, you must set VSwitchId (VpcId is optional; the service can retrieve it internally).
request.setNetMode(0);
/**
* Migration replication parameters, provided as a JSON string.
* image_check: Whether to validate the image. Default is true.
* test_run: Whether to run a migration rehearsal. Default is auto_running, meaning migration starts automatically after a successful rehearsal.
* bandwidth_limit: Bandwidth limit in Mbps. Default is 0.
*/
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\"}");
/**
* Incremental migration parameters.
* true (default): One-time migration task.
* false: Incremental migration task. After creation, the task runs periodically based on the Frequency parameter.
*/
request.setRunOnce(false);
// Interval between incremental migration runs, in hours. Valid values: 1–168.
request.setFrequency(1);
// Maximum number of images retained by default for incremental migration tasks. Valid values: 1–10.
// A value of 1 means only the image created after the most recent data synchronization is kept.
request.setMaxNumberOfImageToKeep(1);
// Configure disks to migrate
CreateReplicationJobRequestDisks disk = new CreateReplicationJobRequestDisks();
request.setDisks(disk);
// Configure system disk
CreateReplicationJobRequestDisksSystem systemDisk = new CreateReplicationJobRequestDisksSystem();
// System disk size in GiB. Must be greater than or equal to the actual used space on the source server's system disk.
systemDisk.setSize(40);
List<CreateReplicationJobRequestDisksSystemPart> systemParts = new ArrayList<>();
CreateReplicationJobRequestDisksSystemPart systemPart = new CreateReplicationJobRequestDisksSystemPart();
// Enable block-level replication for the system disk partition.
systemPart.setBlock(true);
// System disk partition path.
systemPart.setPath("/");
// System disk partition size in bytes. 39 * 1024 * 1024 * 1024 = 41875931136
systemPart.setSizeBytes(41875931136L);
systemParts.add(systemPart);
systemDisk.part = systemParts;
disk.setSystem(systemDisk);
List<CreateReplicationJobRequestDisksData> dataDisks = new ArrayList<>();
disk.setData(dataDisks);
// Configure first data disk
CreateReplicationJobRequestDisksData dataDisk1 = new CreateReplicationJobRequestDisksData();
dataDisk1.setSize(40);
List<CreateReplicationJobRequestDisksDataPart> dataDisk1Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData1Part = new CreateReplicationJobRequestDisksDataPart();
disksData1Part.setBlock(true);
disksData1Part.setPath("/data1");
// Data disk partition size in bytes. 39 * 1024 * 1024 * 1024 = 41875931136
disksData1Part.setSizeBytes(41875931136L);
dataDisk1Parts.add(disksData1Part);
dataDisk1.setPart(dataDisk1Parts);
dataDisks.add(dataDisk1);
// Configure second data disk
CreateReplicationJobRequestDisksData dataDisk2 = new CreateReplicationJobRequestDisksData();
dataDisk2.setSize(60);
List<CreateReplicationJobRequestDisksDataPart> dataDisk2Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData2Part = new CreateReplicationJobRequestDisksDataPart();
disksData2Part.setBlock(true);
disksData2Part.setPath("/data2");
// Data disk partition size in bytes. 59 * 1024 * 1024 * 1024 = 63350767616
disksData2Part.setSizeBytes(64406683648L);
dataDisk2Parts.add(disksData2Part);
dataDisk2.setPart(dataDisk2Parts);
dataDisks.add(dataDisk2);
try {
// Print the API response when running this code
CreateReplicationJobResponse response = client.createReplicationJob(request);
System.out.println(response.getBody().getJobId());
System.out.println(response.getBody().getRequestId());
} catch (TeaException error) {
// This example prints errors for demonstration only. Handle exceptions carefully in production code—do not ignore them.
// Error message
System.out.println(error.getMessage());
// Diagnostic URL
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// This example prints errors for demonstration only. Handle exceptions carefully in production code—do not ignore them.
// Error message
System.out.println(error.getMessage());
// Diagnostic URL
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
Create a task to migrate to an instance
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 SampleLinuxTargetInstance {
/**
* description :
* <p>Initialize the client using credentials</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"));
config.endpoint = "smc.aliyuncs.com";
return new com.aliyun.smc20190601.Client(config);
}
/**
* Create a migration task
* 1. Migrate to an ECS instance
* 2. Migrate data disks
* 3. Enable migration rehearsal
* 4. Use automatic incremental synchronization
*/
public static void main(String[] args_) throws Exception {
com.aliyun.smc20190601.Client client = SampleLinuxTargetInstance.createClient();
CreateReplicationJobRequest request = new CreateReplicationJobRequest();
request.setRegionId("cn-beijing");
request.setSourceId("s-bp******");
// Target type. TargetInstance: After successful migration, SMC migrates the source directly to the target instance. You must also specify InstanceId.
request.setTargetType("TargetInstance");
request.setInstanceId("i-2******");
// 0: Server migration, 1: OS migration, 2: Cross-zone migration, 3: VMware agentless migration.
request.setJobType(0);
// 0: Public network transfer mode. The source server must have Internet access. Migration data travels over the public network.
// 2: Private network transfer mode. If you choose this mode, you must set VSwitchId (VpcId is optional; the service can retrieve it internally).
request.setNetMode(0);
/**
* Migration replication parameters, provided as a JSON string.
* image_check: Whether to validate the image. Default is true.
* test_run: Whether to run a migration rehearsal. Default is auto_running, meaning migration starts automatically after a successful rehearsal.
* bandwidth_limit: Bandwidth limit in Mbps. Default is 0.
*/
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\"}");
/**
* Incremental migration parameters.
* true (default): One-time migration task.
* false: Incremental migration task. After creation, the task runs periodically based on the Frequency parameter.
*/
request.setRunOnce(false);
// Interval between incremental migration runs, in hours. Valid values: 1–168.
request.setFrequency(1);
// Maximum number of images retained by default for incremental migration tasks. Valid values: 1–10.
// A value of 1 means only the image created after the most recent data synchronization is kept.
request.setMaxNumberOfImageToKeep(1);
// Configure disks to migrate
CreateReplicationJobRequestDisks disk = new CreateReplicationJobRequestDisks();
request.setDisks(disk);
// Configure system disk
CreateReplicationJobRequestDisksSystem systemDisk = new CreateReplicationJobRequestDisksSystem();
// System disk size in GiB. Must be greater than or equal to the actual used space on the source server's system disk.
systemDisk.setSize(40);
List<CreateReplicationJobRequestDisksSystemPart> systemParts = new ArrayList<>();
CreateReplicationJobRequestDisksSystemPart systemPart = new CreateReplicationJobRequestDisksSystemPart();
// Enable block-level replication for the system disk partition.
systemPart.setBlock(true);
// System disk partition path.
systemPart.setPath("/");
// System disk partition size in bytes. 39 * 1024 * 1024 * 1024 = 41875931136
systemPart.setSizeBytes(41875931136L);
systemParts.add(systemPart);
systemDisk.part = systemParts;
disk.setSystem(systemDisk);
List<CreateReplicationJobRequestDisksData> dataDisks = new ArrayList<>();
disk.setData(dataDisks);
// Configure first data disk
CreateReplicationJobRequestDisksData dataDisk1 = new CreateReplicationJobRequestDisksData();
dataDisk1.setSize(40);
// Set the disk ID of the target instance's data disk that corresponds to the source server's data disk
dataDisk1.setDiskId("d-2z*********");
List<CreateReplicationJobRequestDisksDataPart> dataDisk1Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData1Part = new CreateReplicationJobRequestDisksDataPart();
disksData1Part.setBlock(true);
disksData1Part.setPath("/data1");
// Data disk partition size in bytes. 39 * 1024 * 1024 * 1024 = 41875931136
disksData1Part.setSizeBytes(41875931136L);
dataDisk1Parts.add(disksData1Part);
dataDisk1.setPart(dataDisk1Parts);
dataDisks.add(dataDisk1);
// Configure second data disk
CreateReplicationJobRequestDisksData dataDisk2 = new CreateReplicationJobRequestDisksData();
dataDisk2.setSize(60);
// Set the disk ID of the target instance's data disk that corresponds to the source server's data disk
dataDisk2.setDiskId("d-2*********");
List<CreateReplicationJobRequestDisksDataPart> dataDisk2Parts = new ArrayList<>();
CreateReplicationJobRequestDisksDataPart disksData2Part = new CreateReplicationJobRequestDisksDataPart();
disksData2Part.setBlock(true);
disksData2Part.setPath("/data2");
// Data disk partition size in bytes. 59 * 1024 * 1024 * 1024 = 63350767616
disksData2Part.setSizeBytes(64406683648L);
dataDisk2Parts.add(disksData2Part);
dataDisk2.setPart(dataDisk2Parts);
dataDisks.add(dataDisk2);
try {
// Print the API response when running this code
CreateReplicationJobResponse response = client.createReplicationJob(request);
System.out.println(response.getBody().getJobId());
System.out.println(response.getBody().getRequestId());
} catch (TeaException error) {
// This example prints errors for demonstration only. Handle exceptions carefully in production code—do not ignore them.
// Error message
System.out.println(error.getMessage());
// Diagnostic URL
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// This example prints errors for demonstration only. Handle exceptions carefully in production code—do not ignore them.
// Error message
System.out.println(error.getMessage());
// Diagnostic URL
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
If a task created with the Java SDK fails, see FAQ.