如何使用虚拟机的串口和控制台

qemu提供了控制台console和串口serial用来与虚拟机进行交互通讯。本文讲述如何通过console进入虚拟机的控制台,以及如何通过serial与虚拟机进行串口通讯。

libvirt给虚拟机创建serial和console

    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
       <serial type='pty'>
          <target type='isa-serial' port='1'>
            <model name='isa-serial'/>
          </target>
       </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
       <console type='pty'>
           <target type='virtio' port='1'/>
       </console>

说明:

*可以有多个pty类型的serial,每一个serial对应的pty设备都被重定向到/dev/pts/下的一个设备。

*可以有多个pyt类型的console,每一个console对应的pty设备都被重定向到/dev/pts/下的一个设备。

*只有第一个console可以是serial类型,或者说只能有一个console是serial类型的。其他console可以是virtio的。

*如果console类型是serial类型的,则qemu不再创建console设备,因为与第一个serial设备表示同一个设备。即serial0既表示一个serial又表示一个console。

在虚拟机内部的设备

给虚拟机添加了virtio类型的console设备后,在虚拟机内部对应设备文件/dev/hvc*

给虚拟机天机了serial类型的serial设备后,在虚拟机内部对应设备文件/dev/ttyS*

在主机上进入虚拟机的控制台

# virsh console cvm --devname serial0

也可以连接其他的console:# console cvm --devname console1

说明:

*devname 是console设备的名称。

*要进入虚拟机的控制台只能通过console设备,不能通过serial设备(可以通过serial0,因为serial0也是一个console设备)

*要通过virtio类型的console进入虚拟机的console,不需要对虚拟机做任何修改,要通过serial类型的console进入虚拟机的console,需要在虚拟机的cmdline中添加console=ttyS0

串口在主机上的重定向

虚拟机的串口在主机端可以实现重定向功能,用来方便的与虚拟机进行串口通信,例如:

重定向到Pseudo TTY,即/dev/pts/*

    <serial type='pty'>
      <target type='isa-serial' port='1'>
        <model name='isa-serial'/>
      </target>
    </serial>

这样就可以通过对PseudoTTY的读写来与虚拟机的串口进行通信了。

另外还可以重定向到file、virtual console、null、Host device proxy、Named pipe、TCP client/server、UDP network console、UNIX domain socket client/server、Spice channel、Nmdm device。

以重定向到PseudoTTY的方式演示串口通讯:

给虚拟机添加一个pty类型的串口(第一个pty串口默认给console使用,这里用第二个串口)

    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <serial type='pty'>
      <target type='isa-serial' port='1'>
        <model name='isa-serial'/>
      </target>
    </serial>

主机端:

虚拟机内部:

可以看到两端可以直接交互通讯。

对应的qemu中添加一个pty类型的serial:

-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0

对应的qemu中添加一个pty类型target是virtio的console:

-chardev pty,id=charconsole1 -device virtconsole,chardev=charconsole1,id=console1

serial和console被重定向到哪个pts,在qemu启动虚拟机日志中可查看:

原文发布于微信公众号 - 虚拟化云计算(openstack_openstack)

原文发表时间:2018-06-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

git init 和 git init –bare 的区别

使用命令"git init --bare"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repository)只会生成一类文件:用于记录版本...

38080
来自专栏我的小碗汤

微服务学习之thrift介绍安装

最近在做一个docker+Kubernetes微服务容器化实战项目,项目中用到了很多不熟悉的组件,也遇到了挺多的问题。项目结构是这样的:

39930
来自专栏linux系统运维

rsync工具介绍, rsync常用选项,rsync通过ssh同步

26750
来自专栏程序员同行者

Linux 双网卡绑定

87940
来自专栏自由而无用的灵魂的碎碎念

解决Windows10或者其他版本Windows Update报错的问题

最近更新系统,发现报错0x80248014,系统版本为redstone2(创意者更新)。

12730
来自专栏猿说1024

JDK 安装

22260
来自专栏蓝天

lsof和tcpdump常用命令

lsof用法 A.查看端口被谁占用 lsof -i:port,如:lsof -i:80 B.查看tcp监听端口 netstat -lpnt ...

10720
来自专栏Java开发

Linux常用命令

18020
来自专栏别先生

'mysql' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

1、C:\Users\Aiyufei>mysql -h 127.0.0.1 -u root 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。...

91830
来自专栏JetpropelledSnake

Linux学习笔记之如何让普通用户获得ROOT权限

在学习sodu的时候,我发现一些命令只能由root用户使用,普通用户使用会提示此用户没有使用sudo的权限。我想到的解方法是把正在使用的普通用户获得root权限...

17110

扫码关注云+社区

领取腾讯云代金券