提交 76d58716 编写于 作者: J Jim Fehlig

libxl: use serial device for console when targetType is serial

When domXML contains only <console type='pty'> and no corresponding
<serial>, the console is "stolen" [1] and used as the first <serial>
device. When this "stolen" console is accessed from the libxl driver
(in libxlConsoleCallback and libxlDomainOpenConsole), check if the
targetType is VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL, and use the
"stolen" device in def->serials[0] instead. Prior to this change,
creating a domain with input XML containing only a <console> device
and subsequently attempting to access its console with
'virsh console' would fail

error: internal error: character device <null> is not using a PTY

[1] See comments associated with virDomainDefAddConsoleCompat() in
    $LIBVIRT-SRC/src/conf/domain_conf.c:
上级 a921699a
...@@ -964,13 +964,17 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) ...@@ -964,13 +964,17 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback)
virObjectLock(vm); virObjectLock(vm);
for (i = 0; i < vm->def->nconsoles; i++) { for (i = 0; i < vm->def->nconsoles; i++) {
virDomainChrDefPtr chr = vm->def->consoles[i]; virDomainChrDefPtr chr = vm->def->consoles[i];
if (chr && chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { if (i == 0 &&
chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL)
chr = vm->def->serials[0];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
libxl_console_type console_type; libxl_console_type console_type;
char *console = NULL; char *console = NULL;
int ret; int ret;
console_type = console_type =
(chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ? (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ?
LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV); LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV);
ret = libxl_console_get_tty(ctx, ev->domid, ret = libxl_console_get_tty(ctx, ev->domid,
chr->target.port, console_type, chr->target.port, console_type,
......
...@@ -4443,8 +4443,11 @@ libxlDomainOpenConsole(virDomainPtr dom, ...@@ -4443,8 +4443,11 @@ libxlDomainOpenConsole(virDomainPtr dom,
priv = vm->privateData; priv = vm->privateData;
if (vm->def->nconsoles) if (vm->def->nconsoles) {
chr = vm->def->consoles[0]; chr = vm->def->consoles[0];
if (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL)
chr = vm->def->serials[0];
}
if (!chr) { if (!chr) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册