我有一个可以启动的 VM 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>
虚拟机正在运行:
# virsh list
Id Name State
----------------------------------
7 VM1 running
在虚拟机内部,这是 grub 配置:
kernel /boot/vmlinuz-2.6.24-28-virtual root=UUID=7a1685b9-ecc8-4b70-932c-459a6faac07d ro quiet splash console=tty0 console=ttyS0,9600n8
这是 virsh 启动虚拟机的命令行:
/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
但是如果我连接virsh console VM1
,或者我执行cat /dev/pts/6
,VM 控制台中不会显示任何内容。
还有什么我必须考虑的吗?
更新
我有两个虚拟机,一个直接用 启动kvm
,另一个通过 启动virsh
。直接启动的那个有一个工作控制台。我已经验证了两种情况下打开的文件:
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
如您所见,在其中一个虚拟机(错误的虚拟机)中,没有文件描述符 1 和 2,并且文件描述符 0 被重定向到 /dev/null。我猜这就是问题所在。
问题是,我该如何告诉 virsh 不要这样做?
答案1
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
这是我通常添加到虚拟机定义中的内容,使用virsh edit
然后console=ttyS0
在 grub.conf 中的虚拟机内核行中附加
至今从未让我失望过
答案2
使用 Debian jessie 作为主机和客户操作系统的工作示例。
使用 virt-install 或 virt-manager 创建虚拟机 无论如何,你都会得到添加到 VM.xml 文件中的串行控制台语句
在客户虚拟机中运行以下命令
systemctl enable [email protected] systemctl start [email protected]
在客户虚拟机中
/etc/default/grub
替换GRUB_CMDLINE_LINUX_DEFAULT="quiet" #GRUB_TERMINAL=console
经过
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0"
GRUB_TERMINAL="serial console"
在客户虚拟机中运行以下命令
guest# update-grub
可以通过以下方式获取运行 VM 的 VM 控制台
host# virsh console VM
或者启动连接控制台的虚拟机
host# virsh start VM --console
资料来源:
答案3
我找到了最适用的答案这里:
假设您的虚拟域是myGuest
,您首选的编辑器是vi
,并且您的客户端已安装grub2
并使用systemd
。如果最后一个假设不成立,您可以查看使用串行控制台。
首先,libguestfs-tools
在主机上安装:sudo apt install libguestfs-tools
。在使用无头客户端时,您将需要它。
其次,关闭您的客人:virsh shutdown myGuest
。
接下来,安装虚拟磁盘:(guestmount -d myGuest -i /mnt
或使用任何其他现有目录作为安装点)。现在/mnt
您应该能够看到来宾的文件系统。
使用grub2
和systemd
,你只需要修改 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"
由于您必须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
也许您需要 root 权限才能挂载和编辑文件。
现在重新启动客户机并启动虚拟控制台:
virsh start myGuest && virsh console myGuest
您应该会看到内核日志,然后是登录提示。登录后,不要忘记运行sudo update-grub
。
答案4
systemctl enable [email protected]
systemctl start [email protected]
很好,但我认为你必须在 grub 配置中添加一些东西,以使控制台在服务 serial-getty 启动之前工作