以下是在 通过 SSH 远程管理的 Rocky Linux 9 宿主机 上,使用 KVM 虚拟化 安装 3 个带 XFCE 桌面的 Rocky Linux 9 虚拟机 的完整方案。
方案采用 宿主机防火墙开放 VNC 端口 的方式,方便从本地 VNC 客户端直接连接;同时使用 tmux 保护 SSH 会话,避免因网络波动导致操作中断。
环境说明
-
宿主机:Rocky Linux 9(最小化安装,无图形界面)
-
宿主机默认 Python:3.12
-
虚拟机:Rocky Linux 9(3 台),均安装 XFCE 桌面环境
-
虚拟化方案:KVM + libvirt
-
远程管理方式:SSH + VNC 客户端
一、宿主机环境准备
1. 检查 CPU 虚拟化支持
bash
grep -E '(vmx|svm)' /proc/cpuinfo
若有输出,表示支持硬件虚拟化。
2. 安装虚拟化软件包
bash
dnf install qemu-kvm libvirt virt-install virt-viewer -y
3. 启动 libvirtd 并设置开机自启
bash
systemctl enable --now libvirtd
4. 确认 KVM 模块已加载
bash
lsmod | grep kvm
5. 配置防火墙开放 VNC 端口(5901~5903)
bash
systemctl stop firewalld
或者
firewall-cmd --add-port=5901-5903/tcp --permanent
firewall-cmd --reload
6. 使用 tmux 保护 SSH 会话(推荐)
为防止 SSH 连接中断导致操作中断,使用 tmux 新建会话:
bash
tmux new -s virt
所有后续命令均在 tmux 会话中执行。若断开 SSH,重新登录后执行 tmux attach -t virt 即可恢复。
二、下载 Rocky Linux 9 ISO 镜像
bash
cd /var/lib/libvirt/images/
wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9-latest-x86_64-dvd.iso
三、安装虚拟机
1. 创建虚拟机磁盘(qcow2 格式)
bash
qemu-img create -f qcow2 /var/lib/libvirt/images/linux-vm1.qcow2 20G
qemu-img create -f qcow2 /var/lib/libvirt/images/linux-vm2.qcow2 20G
qemu-img create -f qcow2 /var/lib/libvirt/images/linux-vm3.qcow2 20G
2. 创建第一个虚拟机
bash
virt-install \
--name rocky9-vm1 \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/linux-vm1.qcow2,size=20 \
--os-variant rocky9 \
--network network=default \
--graphics vnc,listen=0.0.0.0,port=5901 \
--console pty,target_type=serial \
--cdrom /var/lib/libvirt/images/Rocky-9-latest-x86_64-minimal.iso \
--noautoconsole
若提示 --os-variant rocky9 不可用,可改用 --os-variant rhel9。
如果是xubuntu20.04
bash
virt-install \
--name ubuntu20.04-vm1 \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/linux-vm1.qcow2,size=20 \
--os-variant ubuntu20.04 \
--network network=default \
--graphics vnc,listen=0.0.0.0,port=5901 \
--console pty,target_type=serial \
--cdrom /var/lib/libvirt/images/xubuntu-20.04.6-desktop-amd64.iso \
--noautoconsole
3.创建第一个虚拟机报错解决
3.1 问题现象
在执行 virt-install 创建虚拟机时,出现如下错误:
bash
Traceback (most recent call last):
File "/usr/bin/virt-install", line 6, in <module>
from virtinst import virtinstall
File "/usr/share/virt-manager/virtinst/__init__.py", line 8, in <module>
import gi
ModuleNotFoundError: No module named 'gi'
即使安装了 python3-gobject 和 virt-manager,问题依旧存在。
3.2 问题分析
检查 Python 版本
通过 python3 -c "import sys; print(sys.path)" 发现默认的 python3 指向 Python 3.12 (路径中包含 python3.12)。
检查 gi 模块安装位置
使用 rpm -qa | grep python3-gobject 看到模块是为 Python 3.9 编译的(python3-gobject-base 等包通常针对系统默认 Python 版本安装,但这里系统默认 Python 被更改为 3.12)。
根本原因
virt-install 脚本的 shebang 为 #!/usr/bin/python3,它调用了 Python 3.12,而 gi 模块安装在 Python 3.9 的 site-packages 目录下,Python 3.12 无法找到该模块,因此报错。
3.3 解决方案:修改 virt-install 的 shebang
最简单且影响最小的方案是:仅修改 virt-install 脚本,使其使用正确的 Python 解释器(Python 3.9) 。这样既不影响系统默认 Python 3.12 的指向,又能让 virt-install 正常运行。
操作步骤
bash
#备份原文件
cp /usr/bin/virt-install /usr/bin/virt-install.bak
#修改 shebang
sed -i '1s|^#!/usr/bin/python3$|#!/usr/bin/python3.9|' /usr/bin/virt-install
#此命令将文件第一行的 #!/usr/bin/python3 替换为 #!/usr/bin/python3.9。
#验证修改
head -1 /usr/bin/virt-install
#输出应为 #!/usr/bin/python3.9。
#测试 virt-install
执行 virt-install --help 确认无报错。
四、通过 VNC 完成安装
1 在本地计算机上安装 VNC 客户端
-
Windows:TigerVNC 或 RealVNC Viewer
-
macOS :使用"屏幕共享"(
vnc://)或 TigerVNC -
Linux :
tigervnc或vinagre
2 连接 VNC
在 VNC 客户端中输入 宿主机IP:5901(例如 192.168.1.100:5901),即可看到安装界面。
3 安装过程
-
选择语言、时区、磁盘分区(自动分区即可)
-
软件选择 :若使用 DVD ISO,勾选 Server with GUI ,并在右侧附加组件中勾选 Xfce。若使用 minimal ISO,则先最小安装,稍后手动安装 XFCE。
-
设置 root 密码,创建普通用户
-
等待安装完成,虚拟机自动重启
4. 在虚拟机中安装Rocky9 + XFCE
启用 EPEL 仓库
bash
dnf install -y epel-release
EPEL(Extra Packages for Enterprise Linux)提供了许多额外的软件包,包括 XFCE 桌面环境。
通过 VNC 登录虚拟机(或使用 virsh console),执行:
bash
dnf groupinstall "Xfce" -y
systemctl set-default graphical.target
reboot
重启后即可进入 XFCE 桌面。
5. 在虚拟机中安装xubuntu20.04
正常默认安装即可。
安装完成之后安装sshd
sudo apt install openssh-server
安装todesk依赖
sudo apt install libxcb-icccm4 libxcb-keysyms1 libxcb-xkb1 nautilus
安装todesk
sudo dpkg -i todesk-v4.7.2.0_277-amd64.deb
6. 管理虚拟机
常用命令:
bash
virsh list --all # 查看所有虚拟机状态
virsh start rocky9-vm1 # 启动虚拟机
virsh shutdown rocky9-vm1 # 优雅关机
virsh destroy rocky9-vm1 # 强制关机
virsh autostart rocky9-vm1 # 设置开机自启
virsh console rocky9-vm1 # 通过串口控制台登录(无需图形)
virsh undefine --remove-all-storage rocky9-vm1 # 删除虚拟机