Hi Jim. I was testing this and found that I could not boot from the
sata disks
I defined. When I switch them back to ide, they can be booted just fine.
Perhaps something is missing from the boot order logic?
Hmm, I didn't notice this in my testing. sda in the below config
contained /boot. Can you provide the domain config?
Thanks for taking a look!
Jim
On Wed, Sep 28, 2011 at 04:43:25PM -0600, Jim Fehlig wrote:
> Tested with multiple AHCI controllers and multiple disks attached
> to a controller. E.g.,
>
> <disk type='file' device='disk'>
> <driver name='qemu' type='raw'/>
> <source file='/var/lib/libvirt/images/test/disk0.raw'/>
> <target dev='sda' bus='sata'/>
> <address type='drive' controller='0' bus='0'
unit='0'/>
> </disk>
> <disk type='file' device='disk'>
> <driver name='qemu' type='raw'/>
> <source file='/var/lib/libvirt/images/test/disk1.raw'/>
> <target dev='sdb' bus='sata'/>
> <address type='drive' controller='0' bus='0'
unit='1'/>
> </disk>
> <disk type='file' device='disk'>
> <driver name='qemu' type='raw'/>
> <source file='/var/lib/libvirt/images/test/disk2.raw'/>
> <target dev='sdc' bus='sata'/>
> <address type='drive' controller='1' bus='0'
unit='0'/>
> </disk>
> <controller type='sata' index='0'>
> <address type='pci' domain='0x0000' bus='0x00'
slot='0x05' function='0x0'/>
> </controller>
> <controller type='sata' index='1'>
> <address type='pci' domain='0x0000' bus='0x00'
slot='0x06' function='0x0'/>
> </controller>
> ---
> docs/formatdomain.html.in | 9 +++--
> docs/schemas/domaincommon.rng | 1 +
> src/conf/domain_conf.c | 14 +++++++++
> src/qemu/qemu_capabilities.c | 3 ++
> src/qemu/qemu_capabilities.h | 1 +
> src/qemu/qemu_command.c | 30 ++++++++++++++++----
> .../qemuxml2argv-disk-sata-device.args | 6 ++++
> .../qemuxml2argv-disk-sata-device.xml | 25 ++++++++++++++++
> tests/qemuxml2argvtest.c | 3 ++
> 9 files changed, 82 insertions(+), 10 deletions(-)
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 3087d01..b6a0c66 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -972,11 +972,12 @@
> as a device ordering hint. The optional <code>bus</code>
> attribute specifies the type of disk device to emulate;
> possible values are driver specific, with typical values being
> - "ide", "scsi", "virtio", "xen" or
"usb". If omitted, the bus type is
> - inferred from the style of the device name. eg, a device named
'sda'
> - will typically be exported using a SCSI bus.
> + "ide", "scsi", "virtio", "xen",
"usb" or "sata". If omitted, the bus
> + type is inferred from the style of the device name. eg, a device named
> + 'sda' will typically be exported using a SCSI bus.
> <span class="since">Since 0.0.3;
<code>bus</code> attribute since 0.4.3;
> - "usb" attribute value since after 0.4.4</span></dd>
> + "usb" attribute value since after 0.4.4; "sata"
attribute value since
> + 0.9.7</span></dd>
> <dt><code>driver</code></dt>
> <dd>
> The optional driver element allows specifying further details
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index be98be0..675d55d 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -790,6 +790,7 @@
> <value>xen</value>
> <value>usb</value>
> <value>uml</value>
> + <value>sata</value>
> </choice>
> </attribute>
> </optional>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index a918679..6a7f296 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -2157,6 +2157,15 @@ virDomainDiskDefAssignAddress(virCapsPtr caps,
virDomainDiskDefPtr def)
> def->info.addr.drive.unit = (idx % 2);
> break;
>
> + case VIR_DOMAIN_DISK_BUS_SATA:
> + /* For SATA we define the default mapping to be 6 units
> + * per bus, 1 bus per controller, many controllers */
> + def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
> + def->info.addr.drive.controller = idx / 6;
> + def->info.addr.drive.bus = 0;
> + def->info.addr.drive.unit = idx % 6;
> + break;
> +
> case VIR_DOMAIN_DISK_BUS_FDC:
> /* For FDC we define the default mapping to be 2 units
> * per bus, 1 bus per controller, many controllers */
> @@ -8675,6 +8684,11 @@ int virDomainDefAddImplicitControllers(virDomainDefPtr def)
> VIR_DOMAIN_DISK_BUS_IDE) < 0)
> return -1;
>
> + if (virDomainDefAddDiskControllersForType(def,
> + VIR_DOMAIN_CONTROLLER_TYPE_SATA,
> + VIR_DOMAIN_DISK_BUS_SATA) < 0)
> + return -1;
> +
> if (virDomainDefMaybeAddVirtioSerialController(def) < 0)
> return -1;
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 8e20e3f..7122756 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -139,6 +139,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
> "no-shutdown",
>
> "cache-unsafe", /* 75 */
> + "ich9-ahci",
> );
>
> struct qemu_feature_flags {
> @@ -1241,6 +1242,8 @@ qemuCapsParseDeviceStr(const char *str, virBitmapPtr flags)
> qemuCapsSet(flags, QEMU_CAPS_USB_REDIR);
> if (strstr(str, "name \"usb-hub\""))
> qemuCapsSet(flags, QEMU_CAPS_USB_HUB);
> + if (strstr(str, "name \"ich9-ahci\""))
> + qemuCapsSet(flags, QEMU_CAPS_ICH9_AHCI);
>
> /* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
> if (!qemuCapsGet(flags, QEMU_CAPS_CHARDEV_SPICEVMC) &&
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index ae3de90..1e23451 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -113,6 +113,7 @@ enum qemuCapsFlags {
> QEMU_CAPS_NO_SHUTDOWN = 74, /* usable -no-shutdown */
>
> QEMU_CAPS_DRIVE_CACHE_UNSAFE = 75, /* Is cache=unsafe supported? */
> + QEMU_CAPS_ICH9_AHCI = 76, /* -device ich9-ahci */
>
> QEMU_CAPS_LAST, /* this must always be the last item */
> };
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 9174a5f..6d6e67d 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1702,6 +1702,12 @@ qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
> disk->info.addr.drive.bus,
> disk->info.addr.drive.unit);
> break;
> + case VIR_DOMAIN_DISK_BUS_SATA:
> + virBufferAddLit(&opt, "ide-drive");
> + virBufferAsprintf(&opt, ",bus=ahci%d.%d",
> + disk->info.addr.drive.controller,
> + disk->info.addr.drive.unit);
> + break;
> case VIR_DOMAIN_DISK_BUS_VIRTIO:
> virBufferAddLit(&opt, "virtio-blk-pci");
> qemuBuildIoEventFdStr(&opt, disk->ioeventfd, qemuCaps);
> @@ -1902,6 +1908,10 @@ qemuBuildControllerDevStr(virDomainControllerDefPtr def,
> virBufferAsprintf(&buf, "usb-ccid,id=ccid%d", def->idx);
> break;
>
> + case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
> + virBufferAsprintf(&buf, "ahci,id=ahci%d", def->idx);
> + break;
> +
> case VIR_DOMAIN_CONTROLLER_TYPE_USB:
> if (qemuBuildUSBControllerDevStr(def, qemuCaps, &buf) == -1)
> goto error;
> @@ -3683,14 +3693,22 @@ qemuBuildCommandLine(virConnectPtr conn,
> cont->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC)
> continue;
>
> - /* QEMU doesn't implement a SATA driver */
> + /* Only recent QEMU implements a SATA (AHCI) controller */
> if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) {
> - qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> - "%s", _("SATA is not supported with
this QEMU binary"));
> - goto error;
> - }
> + if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) {
> + qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + "%s", _("SATA is not supported
with this QEMU binary"));
> + goto error;
> + } else {
> + char *devstr;
>
> - if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB
&&
> + virCommandAddArg(cmd, "-device");
> + if (!(devstr = qemuBuildControllerDevStr(cont, qemuCaps,
NULL)))
> + goto error;
> +
> + virCommandAddArg(cmd, devstr);
> + }
> + } else if (def->controllers[i]->type ==
VIR_DOMAIN_CONTROLLER_TYPE_USB &&
> def->controllers[i]->model == -1 &&
> !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) {
> if (usblegacy) {
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args
b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args
> new file mode 100644
> index 0000000..9908da6
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args
> @@ -0,0 +1,6 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
> +pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor \
> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -device ahci,id=ahci0,\
> +bus=pci.0,addr=0x3 -drive file=/dev/HostVG/QEMUGuest1,if=none,\
> +id=drive-sata0-0-0 -device ide-drive,bus=ahci0.0,drive=drive-sata0-0-0,\
> +id=sata0-0-0 -usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.xml
b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.xml
> new file mode 100644
> index 0000000..68a14f2
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.xml
> @@ -0,0 +1,25 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory>219136</memory>
> + <currentMemory>219136</currentMemory>
> + <vcpu>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu</emulator>
> + <disk type='block' device='disk'>
> + <source dev='/dev/HostVG/QEMUGuest1'/>
> + <target dev='sda' bus='sata'/>
> + <address type='drive' controller='0' bus='0'
unit='0'/>
> + </disk>
> + <controller type='sata' index='0'/>
> + <memballoon model='virtio'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 9e174b3..f298d37 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -359,6 +359,9 @@ mymain(void)
> QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
> DO_TEST("disk-scsi-device-auto", false,
> QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
> + DO_TEST("disk-sata-device", false,
> + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE,
> + QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_ICH9_AHCI);
> DO_TEST("disk-aio", false,
> QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_AIO,
> QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
> --
> 1.7.5.4
>
> --
> libvir-list mailing list
> libvir-list(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/libvir-list
>