virsh:VM 控制台不显示任何输出

blu*_*ast 10 virtualization virtual-machines libvirt kvm-virtualization

我有一个可以从virsh. 根据virsh dumpxml VM1,这是分配的 pty:

<serial type='pty'>
  <source path='/dev/pts/6'/>
  <target port='0'/>
  <alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/6'>
  <source path='/dev/pts/6'/>
  <target type='serial' port='0'/>
  <alias name='serial0'/>
</console>
Run Code Online (Sandbox Code Playgroud)

虚拟机正在运行:

# virsh list
 Id Name                 State
----------------------------------
  7 VM1                  running
Run Code Online (Sandbox Code Playgroud)

在 VM 内部,这是 grub 配置:

kernel          /boot/vmlinuz-2.6.24-28-virtual root=UUID=7a1685b9-ecc8-4b70-932c-459a6faac07d ro quiet splash console=tty0 console=ttyS0,9600n8
Run Code Online (Sandbox Code Playgroud)

这是由 virsh 启动的用于启动 VM 的命令行:

/usr/bin/kvm -S -M pc-0.12 -enable-kvm -m 256 -smp 1,sockets=1,cores=1,threads=1 -name VM1 -uuid 47ff6ec2-a748-4738-16b9-2ffe5780e456 -nodefaults -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/VM1.monitor,server,nowait -mon chardev=monitor,mode=readline -rtc base=utc -boot c -drive file=/var/VMs/VM1.qcow2,if=none,id=drive-ide0-0-0,boot=on,format=raw -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:12:34:50,bus=pci.0,addr=0x3 -net tap,fd=64,vlan=0,name=hostnet0 -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -usb -vnc 127.0.0.1:0 -k de -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
Run Code Online (Sandbox Code Playgroud)

但是,如果我连接virsh console VM1,或者我连接,cat /dev/pts/6VM 控制台中不会显示任何内容。

还有什么我必须考虑的吗?

更新

我有两个虚拟机,一个直接kvmvirsh. 直接启动的有一个工作控制台。我已经验证了两种情况下打开的文件:

root@host1:~# lsof | grep 25093 | grep dev
kvm       25093         root  DEL       REG                0,4                3758780 /dev/zero
kvm       25093         root  DEL       REG                0,4                3758779 /dev/zero
kvm       25093         root  DEL       REG                0,4                3758777 /dev/zero
kvm       25093         root    0u      CHR              136,3         0t0          6 /dev/pts/3
kvm       25093         root    1u      CHR              136,3         0t0          6 /dev/pts/3
kvm       25093         root    2u      CHR              136,3         0t0          6 /dev/pts/3
kvm       25093         root    3u      CHR             10,232         0t0       8025 /dev/kvm
kvm       25093         root    7u      CHR             10,200         0t0       4983 /dev/net/tun
root@host1:~# lsof | grep 8341 | grep dev
kvm        8341 libvirt-qemu  DEL       REG                0,4                9743486 /dev/zero
kvm        8341 libvirt-qemu  DEL       REG                0,4                9743485 /dev/zero
kvm        8341 libvirt-qemu  DEL       REG                0,4                9743483 /dev/zero
kvm        8341 libvirt-qemu    0r      CHR                1,3         0t0       4640 /dev/null
kvm        8341 libvirt-qemu    4u      CHR                5,2         0t0       4897 /dev/ptmx
kvm        8341 libvirt-qemu    5u      CHR             10,232         0t0       8025 /dev/kvm
kvm        8341 libvirt-qemu   64u      CHR             10,200         0t0       4983 /dev/net/tun
Run Code Online (Sandbox Code Playgroud)

如您所见,在其中一个 VM(错误的)中,没有文件描述符 1 和 2,文件描述符 0 被重定向到 /dev/null。这就是我猜的问题。

问题是,我如何告诉 virsh 不要那样做?

dya*_*sny 12

<serial type='pty'>
  <target port='0'/>
</serial>
<console type='pty'>
  <target type='serial' port='0'/>
</console>
Run Code Online (Sandbox Code Playgroud)

这是我通常添加到 VM 定义中的内容,使用virsh edit Thenconsole=ttyS0附加在 grub.conf 中的 VM 内核行中

到目前为止从未让我失望

  • 问题出在其他地方,但由于您的提示,我找到了。使用 virt-manager 允许我打开一个 VNC 连接,我看到它根本没有启动,因为我没有在 --disk 参数中指定这是一个 qcow2 磁盘映像。显然这不能自动推断 - 即使扩展应该是一个很好的提示?。命令必须用`--disk path=$vm_drive,format=qcow2`扩展 (2认同)
  • 在 Linux 中扩展是没有意义的,只是文件名的一部分 (2认同)
  • 这只是为了方便起见,如果 hashbang 正确的话,没有什么可以阻止 .sh 文件作为 python 脚本执行 (2认同)

小智 11

使用 Debian jessie 作为主机和来宾操作系统的工作示例。

  1. 使用 virt-install 或 virt-manager 创建 VM 在任何情况下,您都会将串行控制台语句添加到 VM.xml 文件中

  2. 在来宾 VM 中运行以下命令

    systemctl enable serial-getty@ttyS0.service
    systemctl start serial-getty@ttyS0.service
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在来宾 VM 中/etc/default/grub替换

    GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    #GRUB_TERMINAL=console
    
    Run Code Online (Sandbox Code Playgroud)

    经过

    GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0"
    GRUB_TERMINAL="serial console"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在来宾 VM 中运行以下命令

    guest# update-grub
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行虚拟机的虚拟机控制台可以通过

    host# virsh console VM
    
    Run Code Online (Sandbox Code Playgroud)

    或在附加控制台的情况下启动 VM

    host# virsh start VM --console
    
    Run Code Online (Sandbox Code Playgroud)

资料来源:


小智 6

我在这里找到了最适用的答案:

假设您的虚拟域是myGuest,您首选的编辑器是vi,并且您的来宾安装并grub2使用systemd。如果最后一个假设不成立,您可以查看使用串行控制台

libguestfs-tools首先,在主机上安装: sudo apt install libguestfs-tools。与无头客人一起工作时,您将需要这个。

其次,关闭您的来宾:virsh shutdown myGuest

接下来,安装虚拟磁盘:(guestmount -d myGuest -i /mnt或使用任何其他现有目录作为安装点)。现在/mnt您应该能够看到来宾的文件系统。

使用grub2systemd,您只需修改 grub 配置:vi /mnt/etc/default/grub,并修改如下

GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,19200n8'
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
Run Code Online (Sandbox Code Playgroud)

由于您必须update-grub在来宾上运行,因此第一次启动时您还必须修改/mnt/boot/grub/grub.cfg. 找到默认的启动菜单项并将控制台信息附加到该linux条目,看起来类似于

linux   /boot/vmlinuz-4.4.0-75-generic root=UUID=76f3e237-d791-4e9d-8ad7-fe5c9165ae55 ro console=ttyS0,19200 earlyprint=serial,ttyS0,19200
Run Code Online (Sandbox Code Playgroud)

也许您需要 root 权限才能安装和编辑文件。

现在重新启动来宾并启动虚拟控制台:

virsh start myGuest && virsh console myGuest
Run Code Online (Sandbox Code Playgroud)

您应该看到内核日志,然后看到登录提示。登录后,不要忘记运行sudo update-grub


小智 5

systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service
Run Code Online (Sandbox Code Playgroud)

对于 Ubuntu guest (20.04) 来说已经足够了,VM 已使用 virt-manager 初始化。

无需更改 GRUB 配置条目,也无需将serial/添加console到 virsh XML 文件。