ChrisKim
Do not go gentle into that good night.
颢天

PVE 为 QEMU VM 开启串口终端

众所周知,在 Proxmox VE 中,LXC 容器能够直接用管理面板提供的 Xterm.js 连接到 Xterm 终端,而使用 QEMU 开启的 Linux 虚拟机就只能用 noVNC 连接到虚拟显示器上的输出。VNC 是图像形式的,意味着我们没法框选文本复制,也没法粘贴内容进去,要复制粘贴就得开个独立的 SSH 程序来完成。

那么有没有什么办法,能让 QEMU 开启的虚拟机,也能在管理面板直接连接终端呢?答案是可以,并且 PVE 官方 Wiki 也提供了相关方式。我查阅了几篇教程,给大家介绍一个我认为最简单的方式。

效果

https://assets.zouht.com/img/blog/3707-02.webp
开启前: noVNC
https://assets.zouht.com/img/blog/3707-03.webp
开启后: Xterm.js

为客户机添加串口

为需要开启串口终端的虚拟机添加一个串口,具体方式是在 PVE 面板内,在硬件菜单内新建一个串口 0.

https://assets.zouht.com/img/blog/3707-01.webp

当然也可以在 PVE 终端内使用指令来给客户机添加串口,其中 VMID 填写虚拟机的编号:

qm set <VMID> -serial0 socket

开启客户机 ttyS

/dev/tty0 是普通的 tty,是输出到屏幕上的。而 /dev/ttyS0 是串口 tty,意味着是输出到系统串口上的。我们开启串口 tty 后,PVE 宿主机就可以靠串口上的 tty 连接到虚拟机的 Xterm 了。

我们使用 getty 来开启串口 tty,并且使用 systemctl 进行守护。首先创建 systemctl 配置:

sudo nano /lib/systemd/system/ttyS0.service

然后将以下内容粘贴进文件内:

[Unit]
Description=Serial Console Service

[Service]
ExecStart=/sbin/getty -L 115200 ttyS0 xterm
Restart=always

[Install]
WantedBy=multi-user.target

里面的参数代表:波特率 115200,选择 ttyS0,使用 xterm 终端。

然后刷新 systemctl,并且启用并启动该服务:

sudo systemctl daemon-reload
sudo systemctl enable ttyS0
sudo systemctl start ttyS0

接下来重启服务器,确保所有配置生效:

sudo reboot 0

现在,再到 PVE 面板里进入虚拟机的控制台,应该就不是启动的 noVNC 而是启动的 Xterm.js 直接连接到终端了,方便许多。

调整终端大小

实测发现,这样操作后,终端的行列数并不会自适应浏览器窗口的大小。我们使用 echo 查看一下目前的终端行列:

echo $LINES $COLUMNS

可以发现输出了 24 80,浏览器窗口怎么调整它都不会自适应。例如开启一个 top,发现只占了右上角。

我暂时还不知道这个问题该如何解决,不过一个治标不治本的方法是手动调整行列数。使用以下指令可以设置行列数:

stty cols <列数> rows <行数>

例如我设置为 180 列 50 行,top 便可以占满整个浏览器窗口了:

https://assets.zouht.com/img/blog/3707-04.webp
24 x 80
https://assets.zouht.com/img/blog/3707-05.webp
50 x 180

本文链接:https://www.zouht.com/3707.html
本文使用:CC BY-NC-SA 4.0 许可
# # #
首页      教程      PVE 为 QEMU VM 开启串口终端

发表回复

textsms
account_circle
email

颢天

PVE 为 QEMU VM 开启串口终端
众所周知,在 Proxmox VE 中,LXC 容器能够直接用管理面板提供的 Xterm.js 连接到 Xterm 终端,而使用 QEMU 开启的 Linux 虚拟机就只能用 noVNC 连接到虚拟显示器上的输出。VNC 是图像形…
扫描二维码继续阅读
2024-02-19