Migrating block storage volume
You can migrate your storage volume from first-generation volume profiles (tiered or custom) to the second-generation volume profile in the console, from the CLI, with API, or Terraform. During the migration, all used areas of the volume are copied and the source and target volumes are kept in sync by mirroring writes. If the volume is attached to an instance, the VSI's volume attachment is seamlessly converted from source to target volume when the copy operation is complete.
When you create a migration job, you can customize the IOPS and bandwidth limits. If you don’t specify these values, the system applies the default values of the profile. While the migration is in progress, the volume is in the updating state. You can cancel a migration while the copy process is running. You can track the status and progress of your migration jobs in the UI, from the CLI, with API and Terraform. When the migration completes, the volume moves to the available state and follows the billing model of the new profile.
Encryption at rest is not impacted by the migration process. The volume is encrypted by using the same CRK and WDEK before and after the migration.
Snapshots that were taken before the volume migration are not migrated along with the volume, and their storage generation values remain unchanged. The first snapshot taken of the volume after the migration is a full-copy of the volume and inherits the storage generation value from the volume. Subsequent snapshots that are taken after the first one become incremental snapshots.
If you are not satisfied with the migrated volume’s performance or features, create a support case to get added to the allowlist. When your account is on the allowlist, you can initiate a migration to return the volume back to generation 1.
Limitations
- Boot volumes that were created from images that are encrypted with customer-managed keys can't be migrated in this release.
- Within a 24-hour period, an account can initiate a maximum of 10 migrations per region.
- If an offline migration is in progress, any new volume attachment request fails. To proceed with the attachment, you must cancel the migration process.
- If an online migration is in progress, initiating a volume detachment can cancel the migration process.
- New snapshots cannot be created from a volume while it's migrating.
- If a volume is attached to a VSI that uses pooled bandwidth allocation, the volume cannot be migrated. Set the bandwidth allocation to
weightedto support the volume migration process. - Select availability Only those second-generation volumes can be migrated back to a first-generation profile that were originally created as first-generation volumes. Volumes that were created
with the
sdpprofile cannot be converted to a first-generation profile. - Select availability If a migrated volume's capacity is increased over 16 TB, it cannot be migrated back to use a first-generation profile. The first-generation, traditional profiles don't support capacities larger than 16 TB.
Initiating volume migration in the console
You can migrate your storage volume to the sdp profile by selecting Migrate volume from the Actions menu in the Block storage volumes for VPC list.
-
Go to the list of Block Storage for VPC volumes. In the IBM Cloud console, click the Navigation menu icon
> Infrastructure
> Storage > Block Storage volumes.
-
Select the volume that you want to migrate from the list. Click the Actions menu
and click Migrate volume.
Volume migration is only generally available for first-generation volumes. For second‑generation volumes, the Migrate volume option is visible only to accounts with special access.
-
Select the target profile. Currently, the only available second-generation volume profile is
sdp. If you want to return a migrated volume to a first-generation profile (general-purpose,5-iops,10-iops, orcustomprofiles), select the profile that supports your capacity and performance needs. The profiles that can't support your volume's current capacity are disabled. -
Click Migrate.
Initiating volume migration from the CLI
You can migrate your storage volume to a volume profile of another storage generation by using the volume-job-create command. Specify the ID
or name of the volume that you want to convert, and the target volume profile. Adding the new IOPS and Bandwidth values is optional and dependent on the target volume profile. See the following example.
ibmcloud is volume-job-create r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 --profile sdp --name my-volume-migration-job --iops 3000 --bandwidth 1000
Creating volume job for r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 under account test account as user test.user@ibm.com...
ID r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Name my-volume-migration-job
Status queued
Bandwidth(Mbps) 1000
IOPS 3000
Profile sdp
Auto Delete false
Created at 2026-03-17T14:26:02+05:30
Href https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3/jobs/r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Job type migrate
Resource type volume_job
For more information about all available command options, see the VPC CLI reference.
Initiating volume migration with the API
Before you begin, make sure that you set up your API environment. For more information, see Setting up your API and CLI environment.
You can programmatically migrate your storage volume to a volume profile of another storage generation
by making a POST /volumes/{volume_id}/jobs request to the VPC API. Specify the job type "migrate", and the target volume profile. When the volume is migrated to the sdp profile, you can optionally specify
new IOPS and bandwidth values. See the following example.
curl "$vpc_api_endpoint/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs?version=2026-03-17&generation=2" \
--header "Content-Type: application/json" \
-H "Authorization: $iam_token" \
--request POST \
--data '{
"job_type": "migrate",
"parameters": {
"profile": {
"name": "sdp"
}
},
"name": "my-volume-migration-job"
}'
A successful response shows that the volume migration job is created.
{
"auto_delete": false,
"created_at": "2026-03-17T04:15:00.000Z",
"href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d",
"id": "r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d",
"job_type": "migrate",
"name": "my-volume-migration-job",
"parameters": {
"bandwidth": 1000,
"iops": 3000,
"profile": {
"name": "sdp"
}
},
"resource_type": "volume_job",
"status": "queued",
"status_reasons": []
}
Initiating volume migration with Terraform
You can migrate your storage volume to the sdp profile by using the ibm_is_volume_job resource. Specify the job_type "migrate",
and the name of the volume job. Adding the new IOPS and bandwidth values is optional and dependent on the target volume profile. See the following example.
resource "ibm_is_volume_job" "vol-job1" {
job_type = "migrate"
name = "vol-job1"
parameters {
profile {
name = "sdp"
}
bandwidth = 2000
iops = 5000
}
}
The migration job status progression
The migration process is not instantaneous. The duration of the migration depends on the volume size. A 1‑TiB volume typically takes about 6 hours to migrate. However, migration can take longer when many volumes are being processed at the same time.
The volume job starts in queued status, then moves into running state, then into completed when the operation finishes successfully. During the migration, the volume lifecycle state is shown as updating. The following table shows the status values that you can see in the console, CLI, and API responses when you check how the migration is progressing.
| Volume job status | Activity |
|---|---|
queued |
The job is queued, waiting to start. |
running |
The job is in progress. |
failed |
The job was not completed. |
succeeded |
The job was completed successfully. |
deleting |
The job is being deleted. |
deleted |
The job was deleted. |
canceling |
The job is being canceled. |
canceled |
The job was canceled. |
Monitoring volume migration in the console
You can check the status and progress of the volume migration in the console.
- Go to the list of Block Storage for VPC volumes. In the IBM Cloud console, click the Navigation menu icon
> Infrastructure
> Storage > Block Storage volumes.
- From the list, click the name of the volume that you started to migrate.
- Click the Volume jobs tab to display the list of jobs that are associated with the volume.
- Click the migration job that is in progress to see the status and estimated completion time.
Monitoring volume migration from the CLI
You can check the status and progress of the volume migration from the CLI. First, list all the volume jobs with the ibmcloud is volume-jobs command, and select a job from the output. The following example uses the volume's ID to
list the associated volume job. You can also use the volume name.
ibmcloud is volume-jobs r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3
Listing volume job for r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 under account test account as user test.user@ibm.com...
ID Name Created at Auto Delete Job type Status Bandwidth(Mbps) IOPS Profile
r006-10d88923-1102-4859-a2b8-628bb9fb0d70 my-volume-migration-job 2026-03-17T14:26:02+05:30 false migrate succeeded 1000 3000 sdp
Then, get the details of the volume job with the ibmcloud is volume-job command. Specify either the volume name or ID as the argument, and specify the job name or ID as part of the --job option.
ibmcloud is volume-job r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 --job r006-10d88923-1102-4859-a2b8-628bb9fb0d70
When the migration is in progress, the response looks similar to the following example:
ID r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Name my-volume-migration-job
Status running
Bandwidth(Mbps) 1000
IOPS 3000
Profile sdp
Auto delete false
Created at 2026-03-17T10:54:52-06:00
Estimated completion at 2026-03-17T12:03:30-06:00
Href https://us-south.cloud.ibm.com/v1/volumes/r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3/jobs/r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Job type migrate
Started at 2026-03-17T10:55:07-06:00
Resource type volume_job
Note the estimated completion date and time in the response.
When the migration is in complete, the response looks similar to the following example:
Getting volume job r006-10d88923-1102-4859-a2b8-628bb9fb0d70 for r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 under account test account as user test.user@ibm.com...
ID r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Name my-volume-migration-job
Status succeeded
Bandwidth(Mbps) 1000
IOPS 3000
Profile sdp
Auto Delete false
Completed at 2026-03-17T14:26:23+05:30
Created at 2026-03-17T14:26:02+05:30
Href https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3/jobs/r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Job type migrate
Started at 2026-03-17T14:26:18+05:30
Resource type volume_job
For more information about all available command options, see the VPC CLI reference.
Monitoring volume migration with the API
You can check the status and progress of the volume migration programmatically with the API. First, list the volume jobs of the volume, and select a migration job from the API response. Then, retrieve the selected volume job.
-
List the migration jobs of the volume. The following example lists the migration jobs for the volume
r006-567faad4-81f4-440a-95f0-6f4c98f22c25.curl "$vpc_api_endpoint/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs?version=2026-03-17&generation=2" \ --header "Content-Type: application/json" \ -H "Authorization: $iam_token" \ --request GETA successful response looks like the following example.
{ "first": { "href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs?limit=50" }, "jobs": [ { "auto_delete": false, "created_at": "2026-03-17T06:47:41.000Z", "estimated_completion_at": "2026-03-17T06:51:58.000Z", "href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-45e29fb5-aa4a-4772-a857-da2f31a97726", "id": "r006-45e29fb5-aa4a-4772-a857-da2f31a97726", "job_type": "migrate", "name": "my-volume-migration-job-reverse", "parameters": { "bandwidth": 1000, "iops": 100, "profile": { "name": "custom" } }, "resource_type": "volume_job", "started_at": "2026-03-17T06:47:44.000Z", "status": "running", "status_reasons": [ ] }, { "auto_delete": false, "completed_at": "2026-03-17T06:44:29.000Z", "created_at": "2026-03-17T06:40:11.000Z", "estimated_completion_at": "2026-03-17T06:44:25.000Z", "href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-10d88923-1102-4859-a2b8-628bb9fb0d70", "id": "r006-10d88923-1102-4859-a2b8-628bb9fb0d70", "job_type": "migrate", "name": "my-volume-migration-job", "parameters": { "bandwidth": 1000, "iops": 3000, "profile": { "name": "sdp" } }, "resource_type": "volume_job", "started_at": "2026-03-17T06:40:14.000Z", "status": "succeeded", "status_reasons": [ ] } ], "limit": 50, "total_count": 2 } -
Retrieve details of the migration job. The following example uses the volume ID
006-567faad4-81f4-440a-95f0-6f4c98f22c25and the job IDr006-03edeeed-fae7-439e-b31c-fbdbec6f9e7dfrom the previous API request.curl "$vpc_api_endpoint/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d?version=2026-03-17&generation=2" \ --header "Content-Type: application/json" \ -H "Authorization: $iam_token" \ --request GETA successful response looks like the following example when the job is still running. Note the date and time of estimated completion in the response.
{ "auto_delete": false, "created_at": "2026-03-17T04:15:00.000Z", "estimated_completion_at": "2026-03-17T06:51:58.000Z", "href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d", "id": "r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d", "job_type": "migrate", "name": "my-volume-migration-job", "parameters": { "bandwidth": 1000, "iops": 3000, "profile": { "name": "sdp" } }, "resource_type": "volume_job", "started_at": "2026-03-17T04:15:15.000Z", "status": "running", "status_reasons": [] }A successful response looks like the following example when the job is complete.
{ "auto_delete": false, "completed_at": "2026-03-17T06:44:29.000Z", "created_at": "2026-03-17T04:15:00.000Z", "estimated_completion_at": "2026-03-17T06:51:58.000Z", "href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d", "id": "r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d", "job_type": "migrate", "name": "my-volume-migration-job", "parameters": { "bandwidth": 1000, "iops": 3000, "profile": { "name": "sdp" } }, "resource_type": "volume_job", "started_at": "2026-03-17T04:15:15.000Z", "status": "running", "status_reasons": [] }
Monitoring volume migration with Terraform
Import the list of volume jobs that belong to a volume as a read-only data source with the ibm_is_volume_job resource.
`data "ibm_is_volume_job" "example" {
volume_job_id = ibm_is_volume_job.example.id
}
Updating volume migration job in the console
While the migration job is running, you can also update the volume job's name if you want to.
- Go to the list of Block Storage for VPC volumes. In the IBM Cloud console, click the Navigation menu icon
> Infrastructure
> Storage > Block Storage volumes.
- From the list, click the name of the volume that you started to migrate.
- Click the Volume jobs tab to display the list of jobs that are associated with the volume.
- Select the job that you want to update. Click the Actions menu
and select Rename.
Updating volume migration job from the CLI
While the migration job is running, you can also update the volume job's name if you want to by using the volume-job-update command. Specify the ID of the volume job that you want to update, and the new name.
ibmcloud is volume-job-update r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 --volume-job r006-10d88923-1102-4859-a2b8-628bb9fb0d70 --name new-name-for-migration-jon
Updating volume job r006-10d88923-1102-4859-a2b8-628bb9fb0d70 for r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3 under account test account as user test.user@ibm.com...
ID r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Name new-name-for-migration-job
Status running
Bandwidth(Mbps) 1000
IOPS 3000
Profile sdp
Auto Delete false
Created at 2026-03-17T10:54:52-06:00
Estimated completion at 2026-03-17T12:03:30-06:00
Href https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-45421f23-df25-4dc7-bb5a-3cbcec26bba3/jobs/r006-10d88923-1102-4859-a2b8-628bb9fb0d70
Job type migrate
Started at 2026-03-17T10:58:52-06:00
Resource type volume_job
For more information about all available command options, see the VPC CLI reference.
Updating volume migration job with the API
While the migration job is running, you can also update the volume job's name if you want to with a PATCH/v1/volumes/{volume_id}/jobs/{job_id} request. See the following example.
curl "$vpc_api_endpoint/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d?version=2026-03-17&generation=2" \
--header "Content-Type: application/json" \
-H "Authorization: $iam_token" \
--request PATCH \
--data '{
"name": "my-updated-migration-job"
}'
A successful response shows that the volume job name is updated.
{
"auto_delete": false,
"created_at": "2026-03-17T04:15:00.000Z",
"estimated_completion_at": "2026-03-17T06:51:58.000Z",
"href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d",
"id": "r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d",
"job_type": "migrate",
"name": "my-updated-migration-job",
"parameters": {
"bandwidth": 1000,
"iops": 3000,
"profile": {
"name": "sdp"
}
},
"resource_type": "volume_job",
"started_at": "2026-03-17T04:15:15.000Z",
"status": "running",
"status_reasons": []
}
Updating volume migration job with Terraform
While the migration job is running, you can also update the volume job's name if you want to, by using the ibm_is_volume_job resource.
`resource "ibm_is_volume_job" "example" {
volume_job_id = ibm_is_volume_job.example.id
name =
}
Canceling volume migration in the console
You can cancel a migration job if it’s still within the migrating phase in the queued or running.
- Go to the list of Block Storage for VPC volumes. In the IBM Cloud console, click the Navigation menu icon
> Infrastructure
> Storage > Block Storage volumes.
- From the list, click the name of the volume that you started to migrate.
- Click the Volume jobs tab to display the list of jobs that are associated with the volume.
- Select the job that you want to update. Click the Actions menu
and select Cancel migration.
Canceling volume migration from the CLI
You can cancel a migration job if it’s still within the migrating phase by using the volume-job-cancel command. Specify the ID of the volume job that you want to cancel.
ibmcloud is volume-job-cancel r006-ef750f93-70f3-45db-bb10-71901d5371e2 --volume-job r006-55e8105d-61bd-46cc-b714-042eadfc6e17
Cancelling volume job r006-55e8105d-61bd-46cc-b714-042eadfc6e17 for r006-ef750f93-70f3-45db-bb10-71901d5371e2 under account test account as user test.user@ibm.com...
ID r006-55e8105d-61bd-46cc-b714-042eadfc6e17
Name my-volume-migration-job
Status canceling
Bandwidth(Mbps) 1000
IOPS 3000
Profile sdp
Auto delete false
Created at 2026-03-17T17:24:53+05:30
Estimated completion at 2026-03-17T17:38:39+05:30
Href https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-ef750f93-70f3-45db-bb10-71901d5371e2/jobs/r006-55e8105d-61bd-46cc-b714-042eadfc6e17
Job type migrate
Started at 2026-03-17T17:25:00+05:30
Resource type volume_job
For more information about all available command options, see the VPC CLI reference.
Canceling volume migration with the API
You can cancel a migration if it’s still within the migrating phase programmatically by making a POST /v1/volumes/{id}/jobs/{job-id}/cancel request to the VPC API.
curl "$vpc_api_endpoint/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d/cancel?version=2026-03-17&generation=2" \
--header "Content-Type: application/json" \
-H "Authorization: $iam_token" \
--request POST
A successful response shows that the volume migration job is canceled.
{
"auto_delete": false,
"created_at": "2026-03-17T04:15:00.000Z",
"href": "https://us-south.iaas.cloud.ibm.com/v1/volumes/r006-567faad4-81f4-440a-95f0-6f4c98f22c25/jobs/r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d",
"id": "r006-03edeeed-fae7-439e-b31c-fbdbec6f9e7d",
"job_type": "migrate",
"name": "my-volume-migration-job",
"parameters": {
"bandwidth": 1000,
"iops": 3000,
"profile": {
"name": "sdp"
}
},
"resource_type": "volume_job",
"started_at": "2026-03-17T04:15:15.000Z",
"status": "canceling",
"status_reasons": []
}
Canceling volume migration with Terraform
You can cancel a migration if it’s still within the migrating phase by using the ibm_is_volume_job_operations resource and adding the cancel = true argument.
resource "ibm_is_volume_job_operations" "cancel" {
cancel = true
volume_job = ibm_is_volume_job.example.id
}
For more information about the arguments and attributes, see ibm_is_volume_job_operations.