本质原因是虚拟机未启用串口登录服务:需同时启用 serial-getty@ttyS0 服务并配置内核参数 console=ttyS0,115200,缺一则 virsh console 无法输出登录提示或系统日志,导致卡在 ^]。

virsh console卡在Escape character is ^]的本质原因
这不是网络或宿主机配置问题,而是虚拟机内部没有启用串口登录服务。KVM 的 virsh console 本质是通过 emulated serial port(通常是 ttyS0)通信,但默认情况下,多数 Linux 发行版不会在串口上启动 getty 进程,也不会把内核日志和登录提示输出到该设备——所以你看到的“连接成功”只是串口链路通了,后面没数据流进来,自然就卡住。
CentOS/RHEL 7+ 必须启用 serial-getty@ttyS0 服务
老教程里改 /etc/inittab 或手动加 agetty 行已失效,systemd 系统必须用服务管理方式启动串口终端:
-
sudo systemctl start serial-getty@ttyS0—— 立即启动,验证是否生效 -
sudo systemctl enable serial-getty@ttyS0—— 开机自启,否则重启后又卡住 - 执行完后,
virsh console连接后通常要按一次回车才显示 login 提示,这是正常行为 - 确认服务状态:
systemctl status serial-getty@ttyS0,应为 active (running)
内核参数 console=ttyS0,115200 必须写进 GRUB_CMDLINE_LINUX
只开 getty 不够,内核本身得知道要把启动日志、panic 信息等也输出到串口,否则即使 getty 启动了,你也看不到系统引导过程,首次连接可能仍无响应:
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX行,在末尾添加console=ttyS0,115200 - 不要写成
console=ttyS0单独参数,必须带波特率;也不要漏掉逗号 - 运行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS)或sudo update-grub(Debian/Ubuntu)使配置生效 - 检查是否写入:重启后执行
dmesg | grep -i ttyS0,应看到类似console [ttyS0] enabled
/etc/securetty 添加 ttyS0 是可选但建议的操作
这一步不是卡住的主因,但关系到 root 能否从串口直接登录。某些最小化安装镜像默认禁止 root 从 ttyS0 登录:
- 执行
echo ttyS0 | sudo tee -a /etc/securetty - 注意:仅对 root 生效;普通用户无需此步
- 如果后续遇到
Login incorrect却密码正确,先查这个文件是否包含ttyS0 - Arch/Manjaro 等滚动发行版通常不依赖此文件,可跳过
最容易被忽略的是服务启用和内核参数两步缺一不可:只配 GRUB 参数,getty 没跑,没登录入口;只启 serial-getty,内核不吐日志,第一次连接可能黑屏或延迟很久才出提示。务必两个都做,且重启虚拟机验证。











