1
0
mirror of https://github.com/OpenNebula/one.git synced 2024-12-23 17:33:56 +03:00

B #5705: Fix SATA disk layout

This commit adds a SATA controller for each disk using the SATA bus. The
q35 machine adds ACHI controller in slot 0x1f function 2 (used for
context), in this case controller index starts from 1.

This should fix VMs using SD_DISK_BUS = sata or q35 machines with more
than one SATA disk.

(cherry picked from commit 67247af9fb)
This commit is contained in:
Ruben S. Montero 2024-01-04 23:38:59 +01:00
parent 53b0d9970c
commit 592a2a64f5
No known key found for this signature in database
GPG Key ID: A0CEA6FA880A1D87

View File

@ -1088,6 +1088,14 @@ int LibVirtDriver::deployment_description_kvm(
num = vm->get_template_attribute("DISK", disk); num = vm->get_template_attribute("DISK", disk);
int sata_index = 0;
string sata_controllers;
if (machine.find("q35") != std::string::npos)
{
sata_index = 1;
}
for (int i=0; i < num ;i++) for (int i=0; i < num ;i++)
{ {
type = disk[i]->vector_value("TYPE"); type = disk[i]->vector_value("TYPE");
@ -1562,22 +1570,44 @@ int LibVirtDriver::deployment_description_kvm(
file << "\t\t\t</iotune>" << endl; file << "\t\t\t</iotune>" << endl;
} }
// ---- SCSI target ---- // ---- Disk target ----
// * SATA bus
// - requires a controller per disk as it requires bus=0 and target=0
// - q35 adds ACHI controller in slot 0x1f function 2 (used for context)
// - A controller will be added for each disk starting from 1 if q35
// * SCSI bus
// - target is based on dev target to have a predictable order
if ( target[0] == 's' && target[1] == 'd' ) if ( target[0] == 's' && target[1] == 'd' )
{ {
int target_number = target[2] - 'a'; int target_number = target[2] - 'a';
if ( target_number >= 0 && target_number < 256 ) if ( disk_bus == "sata" )
{ {
file << "\t\t\t<address type='drive' controller='0' bus='0' " << sata_controllers += ("\t\t<controller type='sata' index='" +
"target='" << target_number << "' unit='0'/>" << endl; to_string(sata_index) + "'/>\n");
file << "\t\t\t<address type='drive' controller='" << sata_index
<< "' bus='0' target='0' unit='0'/>" << endl;
sata_index++;
}
else if ( target_number >= 0 && target_number < 256 )
{
file << "\t\t\t<address type='drive' controller='0' bus='0'"
<< " target='" << target_number << "' unit='0'/>"
<< endl;
} }
} }
file << "\t\t</disk>" << endl; file << "\t\t</disk>" << endl;
} }
// Add SATA controllers if needed
if (!sata_controllers.empty())
{
file << sata_controllers;
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Context Device // Context Device
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------