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,发现只占了右上角。

这个问题可以通过添加 profile 脚本解决,向 /etc/profile 文件尾部添加以下脚本:

(方法来源:https://forum.proxmox.com/threads/xterm-js-console-doesnt-set-terminal-size-correctly.92205/

res() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty
  IFS='[;R' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

[ $(tty) = /dev/ttyS0 ] && res

添加后使用 source /etc/profile 刷新一下,再重新登录账号就能自动适配浏览器窗口了。

但是需要注意的是,这个方法自适应的时机仅为用户登录时,如果登陆后你去拖动浏览器窗口它是不会重新更改大小的,需要重新登出再登入才能再次适应新大小。

另外也可以手动调整行列数,使用以下指令可以设置行列数:

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