Kvm

多個沒有圖形的 virsh/kvm 來賓控制台

  • November 2, 2021

我有一個為沒有圖形的 centos7 來賓工作的串列控制台,我使用virsh console vm. 來賓具有相應的console=ttyS0,115200n8核心命令行參數。

是否可以配置其他控制台,以便我可以說出virsh console vm --devname vc1並獲得登錄提示?

本能地,我正在考慮以某種方式連接到客人的前 6 個虛擬控制台的字元設備;我研究了libvirt 域格式virtio-serial,因為我似乎應該朝那個方向發展,但無法讓它發揮作用。

背景: 我們遇到了需要花費大量時間來解決的網路問題,在此期間,我們需要一名團隊成員處理網路問題,而另一名則不間斷地繼續他在 VM 上的工作,因此需要在沒有網路的情況下使用多個控制台。

我知道有

<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>
 <listen type='address' address='127.0.0.1'/>
</graphics>

啟用帶有 6 個虛擬終端的 VNC 訪問,我只是想知道是否可以通過virsh console <domain> --device <device>語法以任何合理的方式擁有這樣的 6 個虛擬終端,僅僅是因為virsh console更方便。

軟體:

# cat /etc/fedora-release # host
Fedora release 24 (Twenty Four)
# virsh --version
1.3.3.3
# qemu-system-x86_64 --version
QEMU emulator version 2.6.2 (qemu-2.6.2-8.fc24), Copyright (c) 2003-2008 Fabrice Bellard

# cat /etc/centos-release # guest
CentOS Linux release 7.3.1611 (Core)

我經常在我的虛擬機上使用多個“控制台”——一個用於顯示啟動並以登錄提示結束的互動式控制台,另一個用於將所有這些記錄到文本文件中(通常/var/lib/libvirt/consoles/<domain>.log

我不知道您是否可以在 VM 中擁有多個互動式“控制台”,但您可以添加任意數量的串列埠,然後getty在 VM 中執行它們以獲取登錄提示。

VM 中的這些串列埠可以連接到例如文件、套接字或主機上使用telnet協議的 TCP 埠。最容易使用的可能是 telnet 埠。

例如,要添加一個可以通過 訪問的串列 ttyS1 串列埠telnet,請將以下 XML 片段保存到/tmp/serial1.xml

<serial type='tcp'>
 <source mode='bind' host='127.0.0.1' service='4555' tls='no'/>
 <protocol type='telnet'/>
 <target port='1'/>
 <alias name='serial1'/>
</serial>

然後執行virsh attach-device --config <domain> /tmp/serial1.xml

這將為 VM 添加一個串列埠設備,該設備將在 VM 下次重新啟動時被啟動。(可能有一些方法可以將其添加為可熱插拔的 USB 設備而不是非 USB 串列埠,並避免重新啟動 VM。我從來沒有足夠在意找出)。

VM 重新啟動後,在埠上執行 getty。例如使用 sysvinit,編輯/etc/inittab並執行telinit q

使用系統:

systemctl enable getty@ttyS1.service
systemctl start getty@ttyS1.service

要從 KVM 主機連接到 VM 的串列埠,請執行telnet 127.0.0.1 4555.

您可以創建任意數量的串列埠,每個埠偵聽不同的埠。只需更改service=XML 片段中的 tcp 埠號 ( )、目標埠和別名。

如果你需要從另一台機器上訪問它,你可以讓它監聽不同的 IP 地址(雖然你可能想要tls='yes'在這種情況下,並使用啟用 tls 的telnet客戶端進行連接,這需要設置一個證書供 qemu 使用)。

例如,我向 Debian Stretch VM 添加了兩個串列埠:

首先,localhost:4555 上的 ttyS1

$ telnet localhost 4555
Trying 127.0.0.1...
Connected to localhost.mydomain.
Escape character is '^]'.

Debian GNU/Linux 9 stretch ttyS1

stretch login: 
telnet> quit
Connection closed.

然後 ttyS2 在 localhost:4556

$ telnet localhost 4556
Trying 127.0.0.1...
Connected to localhost.mydomain.
Escape character is '^]'.

Debian GNU/Linux 9 stretch ttyS2

stretch login: 
telnet> quit
Connection closed.

由於 OP 描述的類似原因,我偶然發現了這個執行緒。不需要ua-以描述項目文件的形式使用域範圍的別名。

只需將一個或多個控制台添加為<target type='virtio' port='N'/>. 然後訪問hvc0, hvc1, … 控制台

virsh 控制台*VMNAME*控制台*N*

N從 計數1。客戶端getty設置留給讀者作為練習。

引用自:https://unix.stackexchange.com/questions/383460