Linux 上直接跑虚拟机:KVM、QEMU、libvirt 是什么关系,第一台怎么装

16次阅读
没有评论

想在 Linux 上跑一台虚拟机,搜出来的名词能凑一副扑克牌:KVM、QEMU、libvirt、virsh、virt-manager……它们不是同一样东西的不同名字,而是三层各管一段。这篇先把三者的关系讲清楚,再从检查 CPU 开始,用命令行装出第一台能开机、能联网、能随用随开的虚拟机。桌面点选党可以直接看VMware 装 Linux 虚拟机那篇,图形界面思路是相通的。

三个名字一台戏:KVM、QEMU、libvirt

用造车打比方:

  • KVM 是发动机。它是 Linux 内核里的模块,把 CPU 的硬件虚拟化能力(Intel VT-x / AMD-V)直接交给内核调度。它本身没有界面,也不管磁盘、网卡这些外设,只负责让虚拟机的 CPU 指令跑出接近物理机的速度。
  • QEMU 是整辆车。它是一个完整的模拟器,能模拟 CPU、内存、磁盘、网卡、显卡全套设备。但纯软件模拟慢,所以它平时和 KVM 搭着开:CPU 指令交给 KVM 跑,外设由 QEMU 模拟——这就是常见的「QEMU/KVM」组合。
  • libvirt 是方向盘和仪表盘。QEMU 的命令行参数出了名的长,libvirt 在它上面包了一层:每台虚拟机一份 XML 定义,守护进程统一管理生命周期,再配上 virsh 命令行和 virt-manager 图形界面。我们日常操作的都是这一层。

所以「装 KVM」实际装的是一整串:内核模块本来就在内核里,要补的是 QEMU 程序和 libvirt 管理栈。后面你会看到 PVE 这类发行版,做的也只是把这串东西再包一层网页。

先确认 CPU 支持虚拟化

# vmx = Intel,svm = AMD;输出大于 0 即支持
egrep -c '(vmx|svm)' /proc/cpuinfo

# 确认 KVM 模块已加载
lsmod | grep kvm

第一条输出 0 的话,先重启进 BIOS,找 Intel Virtualization Technology 或 SVM Mode 打开。第二条看不到 kvm_intel(或 kvm_amd)的,用 modprobe kvm_intel 手动加载试试,报错就说明硬件或 BIOS 这关没过。

安装和权限

以 Debian / Ubuntu 为例:

apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst

# 让当前用户不用 sudo 也能管理虚拟机
usermod -aG libvirt $USER
# 重新登录后生效

virtinst 提供 virt-install 命令,等下装第一台就靠它。权限这步最容易被忽略:不加 libvirt 组,普通用户执行 virsh 会连不上 qemu:///system,报一堆看起来像服务没启动的错误——其实服务好好的,只是你不在组里。这和改 SSH 端口把自己锁在门外是同一类问题:服务正常,是准入环节出了岔子。

用 virt-install 装第一台

先把系统 ISO 放到一个 libvirt 有权限读的位置,比如 /var/lib/libvirt/images/,然后一条命令把虚拟机的骨架立起来:

virt-install \
  --name deb12 \
  --memory 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/deb12.qcow2,size=20,format=qcow2 \
  --cdrom /var/lib/libvirt/images/debian-12-netinst.iso \
  --network network=default \
  --graphics vnc,listen=127.0.0.1 \
  --noautoconsole

这条命令的含义:建一台叫 deb12 的机器,2GB 内存、2 核、20GB 磁盘(qcow2 格式,按需增长),从 ISO 启动,接在默认网络上,显示走本机 VNC。跑完它会自动弹出或提示如何连接控制台;服务器上没有桌面的,用 SSH 端口转发把 VNC 引到本地看安装画面:

# 在你自己的电脑上执行
ssh -L 5900:127.0.0.1:5900 user@server
# 然后用 VNC 客户端连 127.0.0.1:5900

进去就是普通系统安装界面,装完重启,一台虚拟机就有了。

virsh 日常操作

此后对这台机器的操作全部走 virsh:

virsh list --all          # 所有虚拟机及状态
virsh start deb12         # 开机
virsh shutdown deb12      # 温柔关机(系统内执行关机)
virsh destroy deb12       # 直接断电(shutdown 无响应时用)
virsh autostart deb12     # 宿主机开机时自动启动它
virsh dominfo deb12       # 查看配置概况

这些命令适合写进脚本或记进服务为什么重启后没起来那篇讲的 systemd 单元里——虚拟机跟着宿主机自启,断电恢复后服务自己回来,人不用半夜爬起来敲命令。

网络:默认 NAT 还是桥接

  • 默认 NAT(network=default):虚拟机能出网,但外面的设备主动访问不到它,适合自用;
  • 桥接(bridge=br0):虚拟机直接拿到和宿主机同网段的 IP,NAS、Web 服务这种要被家里其他设备访问的,选这个。桥接要在宿主机上先建 br0,把物理网卡挂上去,各发行版写法略有差异。

判断标准就一条:这台虚拟机要不要「被别的设备找到」。要,就桥接;不要,NAT 省心。

什么时候该换 PVE

命令行这套跑顺之后,如果开始出现这些需求——想要网页界面、想要快照和整机备份一键化、家里不止一台物理机想做集群、想用 LXC 容器省内存——那就到了把这套手工搭的组合升级成发行版的时候:Proxmox VE 底下就是今天这套 KVM + QEMU + libvirt,只是把它包出了 Web 管理台和一整套运维工具。反过来说,理解了今天这三层关系,以后用 PVE 时看到的每个名词都知道它站在哪一层,出问题也知道往哪层查。

正文完
 0
Ticifer
版权声明:本站原创文章,由 Ticifer 于2026-11-13发表,共计2457字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。