Browse Source

scripts/ support adding a console with the default serial device

The set_console() utility function either adds a device based on the
explicitly given device type, or adds a known good type of device
based on the machine type.

But, for a number of machine types, it may be impossible or
inconvenient to add the devices by means of "-device" command line
options, and then it may better to just use the "-serial" option and
let QEMU itself, based on the machine type, set the device

To achieve that, the behavior of set_console() now flags the intention
to add a console device on launch(), and if no explicit device type is
given the "-serial" option is going to be added to the QEMU command
line, instead of raising exceptions.

Based on testing with different machine types, the CONSOLE_DEV_TYPES
is not necessary anymore, so it's being removed, as is the logic to
use it.

Signed-off-by: Cleber Rosa <>
Reviewed-by: Cornelia Huck <>
Message-Id: <>
Signed-off-by: Eduardo Habkost <>
Cleber Rosa 6 months ago
1 changed files with 17 additions and 33 deletions
  1. 17

+ 17
- 33
python/qemu/ View File

@@ -41,17 +41,6 @@ def kvm_available(target_arch=None):
return os.access("/dev/kvm", os.R_OK | os.W_OK)

#: Maps machine types to the preferred console device types
r'^clipper$': 'isa-serial',
r'^malta': 'isa-serial',
r'^(pc.*|q35.*|isapc)$': 'isa-serial',
r'^(40p|powernv|prep)$': 'isa-serial',
r'^pseries.*': 'spapr-vty',
r'^s390-ccw-virtio.*': 'sclpconsole',

class QEMUMachineError(Exception):
Exception called when an error in QEMUMachine happens.
@@ -130,6 +119,7 @@ class QEMUMachine(object):
self._temp_dir = None
self._launched = False
self._machine = None
self._console_set = False
self._console_device_type = None
self._console_address = None
self._console_socket = None
@@ -248,13 +238,17 @@ class QEMUMachine(object):
'-display', 'none', '-vga', 'none']
if self._machine is not None:
args.extend(['-machine', self._machine])
if self._console_device_type is not None:
if self._console_set:
self._console_address = os.path.join(self._temp_dir,
self._name + "-console.sock")
chardev = ('socket,id=console,path=%s,server,nowait' %
device = '%s,chardev=console' % self._console_device_type
args.extend(['-chardev', chardev, '-device', device])
args.extend(['-chardev', chardev])
if self._console_device_type is None:
args.extend(['-serial', 'chardev:console'])
device = '%s,chardev=console' % self._console_device_type
args.extend(['-device', device])
return args

def _pre_launch(self):
@@ -480,30 +474,20 @@ class QEMUMachine(object):

This is a convenience method that will either use the provided
device type, of if not given, it will used the device type set
device type, or default to a "-serial chardev:console" command
line argument.

The actual setting of command line arguments will be be done at
machine launch time, as it depends on the temporary directory
to be created.

@param device_type: the device type, such as "isa-serial"
@raises: QEMUMachineAddDeviceError if the device type is not given
and can not be determined.
if device_type is None:
if self._machine is None:
raise QEMUMachineAddDeviceError("Can not add a console device:"
" QEMU instance without a "
"defined machine type")
for regex, device in CONSOLE_DEV_TYPES.items():
if re.match(regex, self._machine):
device_type = device
if device_type is None:
raise QEMUMachineAddDeviceError("Can not add a console device:"
" no matching console device "
"type definition")
@param device_type: the device type, such as "isa-serial". If
None is given (the default value) a "-serial
chardev:console" command line argument will
be used instead, resorting to the machine's
default device type.
self._console_set = True
self._console_device_type = device_type