Root device hints

Allow operators to pass some hints to Ironic to decide which device should be selected for the deployment.

Problem description

When the deploy ramdisk boots Ironic picks the first disk it finds to be the root device (the device where the image will be put on). If the server has more than one SATA, SCSI or IDE disk controller, the order in which their corresponding device nodes are added is arbitrary [1] [2]. This may result in devices like /dev/sda and /dev/sdb switching around on each boot and Ironic picking different disk every time the machine is being deployed.

As an operator, if my server has multiple disks I would like to choose which one Ironic should deploy the image onto. Or in case I have created a RAID device to be my root device, I’d like to tell Ironic to always use that.

Another problem, in case for the full disk image deployment, if we deploy a server twice and on each deployment Ironic picks a different disk we could end up with 2 disks containing a valid bootloader.

Proposed change

The change proposed by this blueprint is to give operators a means via the Ironic API to pass some hints about what disk should be picked in deploy time. That way Ironic can always pick the right disk to write the image on.

Also, with the addition of Ironic being able to create RAID arrays, it would be nice to be able to tell Ironic to use the device that was just created to be the root device for the deployment.

This spec is proposing having a limited number of hints that could be passed as part of the initial work, but could be extended later on. The initial proposed hint list is:

  • model (STRING): device identifier

  • vendor (STRING): device vendor

  • serial (STRING): disk serial number

  • wwn (STRING): unique storage identifier

  • hctl (STRING): Host:Channel:Target:Lun for SCSI

  • size (INT): size of the device in GB

The hints should live in the properties attribute of the Node resource, the key would be root_device and the value a dictionary so operators could combine one or more hints. For example:['root_device'] = {'wwn': '0x4000cca77fc4dba1'}

The logic about which disk will be picked will follow:

  1. If the hints are not specified Ironic will continue to pick the first disk it finds.

  2. If hints are specified and only one disk is found Ironic will pick it.

  3. If hints are specified and multiple disks are found Ironic will pick the first disk that matches the all the criteria.

  4. If hints are specified and no disks are found the deployment is aborted.

The default deploy ramdisk and IPA needs to be changed to support filtering the disks based on the hints, if specified.


We could recommend operators to avoid having multiple storage devices on the machines being managed by Ironic.

Data model impact


REST API impact

As we want to use a dictionary as a value on the properties attribute the bug 1398350 needs to be fixed.

RPC API impact


Driver API impact


Nova driver impact


Security impact


Other end user impact


Scalability impact


Performance Impact


Other deployer impact

Deployers will have a finer granularity in selecting the disk device to be used for the deployment.


When specifing device size as a hint operator needs to make sure that the value doesn’t conflict with the local_gb properties of the node. This is going to be documented as part of this spec.

Developer impact




Primary assignee:


Other contributors:


Work Items

  • Make Ironic check for hints in the

  • Pass the hint information to the deploy ramdisk and IPA

  • Add tests and documentation

  • Modify the default deploy ramdisk in diskimage-builder to consider the hints when picking the disk device

  • Modify IPA to consider the hints when picking the disk device



  • Unit tests will be added

Upgrades and Backwards Compatibility

The change is backwards compatible since if hints are not specified Ironic will continue to do what it does today (pick the first disk it found for the deployment).

Documentation Impact

A document explaining how hints works and what are the options and values supported is going to be added.