debian12部署KVM

1、更新/升级系统

apt-get update
apt-get upgrade

2、安装依赖包

debian安装

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

centos安装

dnf install qemu-kvm libvirt libvirt-daemon virt-install virt-manager libvirt-dbus

3、安装KVM软件包

apt install virt-manager

将当前登录用户加入 kvm 和 libvirt 用户组,以便能够创建和管理虚拟机

usermod -aG kvm $USER
usermod -aG libvirt $USER
#或者group编辑
vim /etc/group

普通用户使用sudo

#编辑 /etc/sudoers 文件 添加用户到 sudoers 文件。在文件末尾添加下面这一行
用户名 ALL=(ALL:ALL) ALL

4、命令配置

运行virsh命令列出 KVM 虚拟机的可用网络和状态:

virsh net-list --all

输出中看到的,libvirt的默认网络处于非活动状态,因此通过运行以下命令使其处于活动状态,并在系统重新启动时自动重新启动:

virsh net-start default
virsh net-autostart default

启用虚拟化守护进程(libvirtd):

systemctl status libvirtd
systemctl enable --now libvirtd
systemctl start libvirtd 

安装 cpu-checker 软件包

apt install -y cpu-checker

通过如下命令判断 KVM 虚拟化是否已经在运行:

kvm-ok

virsh基础命令

查看版本与帮助:

#查看virsh的版本信息
virsh -version
#查看virsh命令的帮助信息12
virsh --help

查看虚拟机:

#显示当前正在运行的虚拟机
virsh list
#显示主机下的所有虚拟机,包括未运行的
virsh list --all
#查看虚拟机的配置信息
virsh dominfo vm-name

创建和管理虚拟机:

#使用XML文件定义(创建)虚拟机
virsh define xml
#删除虚拟机名为vm-name ,但会保留虚拟机的配置文件和磁盘
virsh undefine vm-name 
#删除虚拟机并删除其NVRAM
virsh undefine vm-name --nvram

虚拟机的操作:

#启动名为vm-name的虚拟机
virsh start vm-name
#正常关闭虚拟机名为vm-name
virsh shutdown vm-name
#强制关闭(断电)名为vm-name的虚拟机
virsh destroy vm-name
#挂起(暂停)名为vm-name的虚拟机
virsh suspend vm-name
#恢复挂起的名为vm-name的虚拟机
virsh resume vm-name
#重启名为vm-name的虚拟机
virsh reboot vm-name

其他命令:

#查看名为vm-name的虚拟机的块设备(磁盘)信息
virsh domblklist vm-name
#查看名为vm-name的虚拟机的网卡配置信息
virsh domiflist vm-name
#查看名为vm-name的虚拟机的XML配置文件
virsh dumpxml vm-name
#编辑名为vm-name的虚拟机的XML配置文件
virsh edit vm-name
#进入名为vm-name的虚拟机控制台
virsh console vm-name

5、网络配置

查下当前网络

ip a

配置网络桥接模式,安装的依赖模块bridge-utils,上面已经安装过了

apt install bridge-utils  

备份原来网卡信息(debian)

cp /etc/network/interfaces /etc/network/interfaces.bak

修改/etc/network/interfaces

auto br0
iface br0 inet static
address 10.101.101.33
netmask 255.255.255.0
gateway 10.101.101.254
bridge_ports enp1s0 
bridge_stp off
bridge_fd 0
dns-nameserver 10.101.116.1

# br0桥接口名
#enp1s0是本机网卡出口

配置桥接模式,宿主机修改静态固定IP

/etc/network/interfaces.d 目录下创建:bridge配置文件 ---名字可以随便起

内容如下:

#bridge port 
auto br0
iface br0 inet static 
address 192.168.0.66
broadcast 192.168.0.255 
netmask 255.255.255.0 
gateway 192.168.0.1 
bridge_ports enp4s0 
bridge_stp off 
bridge_waitport 0 
bridge_fd 0
dns-nameserver 192.168.0.1 

#下边这行可以配置也可以不写
hwaddress ether 00:e0:1b:29:55:18

#注意:这里可以不绑定网卡mac物理地址,例如‘00:e0:1b:29:55:18‘,重启后会给桥接模式的网卡分配新的虚拟物理地址。
#也可以hwaddress绑定和enp4s0公用一个mac地址。

保存配置,重启网络服务

systemctl restart libvirtd
systemctl restart networking.service

启动kvm管理界面

virt-manager

X11图形界面PuTTY + Xming 下载

PuTTY - http://www.chiark.greenend.org.uk/~sgtatham/putty/download.htmlopen in new window Xming - http://sourceforge.net/projects/xming/open in new window

KVM界面中文

修改/root/.profile

vim .profile
#将LANG修改如下
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN.UTF-8

GUI界面出现中文方块乱码,说明缺少字体,安装中文字体包

apt install fonts-wqy-zenhei

安装后重启virt-manager

6、磁盘扩容

宿主机上扩容镜像文件(需关机)

# 查看当前信息
qemu-img info disk.raw
#qcow2/raw 文件
qemu-img resize /var/lib/libvirt/images/disk.qcow2 +10G
# 或直接指定总大小(如扩到 50GB)
qemu-img resize disk.raw 50G

在线扩容(无需关机)

virsh blockresize <vm-name> vda --size +10G

在线添加新磁盘(推荐方式)

#宿主机创建新磁盘
qemu-img create -f qcow2 new-disk.qcow2 10G
#在线挂载到运行中的虚拟机
virsh attach-disk <vm-name> /path/to/new-disk.qcow2 vdb --cache=none --subdriver=qcow2

缩容

结论:不要对 .img(raw 格式)使用 --shrink

确认是 RAW 格式,请勿使用 --shrink

尽管 QEMU 提示你可以用 --shrink,但 --shrink 仅对 qcow2 格式有效raw 格式无效或危险

#正确做法:不是直接缩 RAW 文件,而是重建一个更小的镜像
# 安装
apt install libguestfs-tools

# 自动收缩并输出为新的 RAW 镜像(智能识别已用空间)
virt-sparsify --format raw --convert raw disk.img disk_shrunk.img

qcow2 格式使用--shrink

# 示例:将虚拟大小从 50G 缩小到 30G
qemu-img resize --shrink disk.qcow2 30G
#错误!未清零、未关机、直接 shrink
#避免 shrink,改用“创建新小盘”
virt-resize --shrink /dev/sda2 old.qcow2 new.qcow2

磁盘缩容(减小)—— 不支持在线,且风险极高

永远不要尝试在线缩容