创建虚拟机

前期准备

# 建立一个标准目录存放镜像
mkdir -p /data/kvm/iso # 存放ISO镜像文件
mkdir -p /data/kvm/images  # 存放虚拟机磁盘文件

通过命令行创建

  • 使用 virt-install 创建虚拟机

选项说明

--name

  • 指定虚拟机名称。

--memory

  • 指定虚拟机内存大小,单位:MiB。
  • 通常需设置为1024的倍数,例如:4096 (4GB)、8192 (8GB)、16384 (16GB)、32768 (32GB) 等。

--vcpus

  • 指定虚拟机 CPU 核心数。 默认值为 1。

--cpu

  • 指定虚拟机 CPU 模型。 默认值为 host-passthrough。

--os-variant

  • 指定操作系统变体,例如 rhel7.64、rhel8.5、openeuler22.03 等。
  • 如果执行报错,可以通过命令 osinfo-query os 查看宿主机支持的列表,或者干脆用 generic。

--disk

  • 指定虚拟机磁盘配置。
  • 格式:--disk path=/path/to/disk.img,size=50,format=qcow2,bus=virtio,cache=none
    • path:磁盘文件路径。
    • size:磁盘大小,单位:GB。
    • format:磁盘格式,qcow2 或 raw。
    • bus:磁盘总线,virtio 或 ide。
    • cache:缓存模式,none 或 writeback。

--network ...,virtualport_type=openvswitch

  • 它告诉 libvirt:“不要用 Linux Bridge 逻辑,去调用 ovs-vsctl 把网卡插到 OVS 桥上”。

--cdrom

  • 指定虚拟机 CD-ROM 镜像文件路径。

--graphics

  • 指定虚拟机图形界面配置。
  • 格式:--graphics vnc,listen=0.0.0.0
    • vnc:指定使用 VNC 图形界面。
    • listen:指定 VNC 监听 IP 地址,默认 0.0.0.0。

--boot

  • 指定虚拟机启动顺序。
  • 格式:--boot hd,cdrom,menu=on
    • hd:指定从硬盘盘启动。
    • cdrom:指定从 CD-ROM 启动。
    • menu:指定显示启动菜单,默认 on。

--check

  • 指定虚拟机检查选项。
  • 格式:--check all=off
    • all检查,默认 on。

--noautoconsole

  • 指定虚拟机台端口。

--channel unix,target_type=virtio,name=org.qemu.guest_agent.0

  • 指定虚拟机 guest-agent 配置。
  • 格式:--channel unix,target_type=virtio,name=org.qemu.guest_agent.0
    • target_type:指定通道类型,virtio 或 unix。
    • name:指定通道名称,org.qemu.guest_agent.0。

--description : -虚拟机描述。

创建 ovs-br0 网桥

# 安装openvswitch
apt install -y openvswitch-switch # Ubuntu
yum install -y openvswitch # CentOS/Rocky

# 启动并设置为开机自启
systemctl enable --now openvswitch

# 创建网桥
ovs-vsctl add-br ovs-br0

# 将业务口网卡 ens37 加入网桥
# 注意:生产环境通常需要两块网卡,一块用于管理,一块用于业务流量,别加错,否则无法ssh连接了
# 这里假设 ens37 是业务流量口,将其加入 ovs-br0 网桥
ovs-vsctl add-port ovs-br0 ens37

# 执行 ovs-vsctl show 验证
    Bridge ovs-br0
        Port ens37
            Interface ens37
        Port ovs-br0
            Interface ovs-br0
                type: internal


# 设置网桥为混杂模式
# 在某些物理交换机环境下,可能需要手动开启物理网卡的混杂模式,否则虚拟机流量可能无法进出:
ip link set ovs-br0 promisc on

openEuler

mkdir -p /data/kvm/images/nwxt-test

virt-install \
  --name NWXT-TEST-MD \
  --memory 32768 \
  --vcpus 8 \
  --cpu host-passthrough \
  --os-variant rhl9 \
  --disk path=/data/kvm/images/nwxt-test/nwxt-test-md-disk1.qcow2,size=300,format=qcow2,bus=virtio,cache=none \
  --network bridge=br-mgmt,virtualport_type=openvswitch,model=virtio \
  --network bridge=br-int,virtualport_type=openvswitch,model=virtio \
  --cdrom /data/kvm/iso/openEuler-24.03-LTS-SP3-x86_64-dvd.iso \
  --graphics vnc,listen=0.0.0.0 \
  --boot hd,cdrom,menu=on \
  --check all=off \
  --noautoconsole \
  --channel unix,target_type=virtio,name=org.qemu.guest_agent.0 \
  --description "描述信息"

RedHat 系

virt-install \
--name rocky-01 \
--vcpus 2 \
--memory 2048 \
--location /data/kvm/iso/Rocky-9.iso \
--disk path=/data/kvm/images/rocky-01.qcow2,size=20,format=qcow2,bus=virtio \ 
--network bridge=ovs-br0,virtualport_type=openvswitch,model=virtio \
--graphics none \
--extra-args 'console=ttyS0,115200n8 serial' \
--os-variant rockylinux9
  • --disk ...,bus=virtio: 核心优化点。使用 virtio 驱动,磁盘 I/O 性能比默认的 IDE/SATA 高出几个量级。
  • --network ...,model=virtio: 网卡同样使用 virtio 驱动,降低 CPU 中断损耗。此外还挂载到了 ovs-br0 网桥,实现了虚拟机与宿主机的网络通信。
  • --graphics none: 生产服务器通常不需要 VNC/显卡。
  • --extra-args ...: 配合 --graphics none 使用,将安装过程的输出重定向到当前终端(Console),这样直接在 SSH 窗口就能完成系统安装。
  • --os-variant: 告知 KVM 目标系统类型,它会自动优化 CPU 指令集和默认驱动配置。可用 osinfo-query os 查看支持列表。

Ubuntu 系

virt-install \
--name ubuntu-01 \
--vcpus 2 \
--memory 2048 \
--cdrom /data/kvm/iso/ubuntu-22.04.5-live-server-amd64.iso \
--disk path=/data/kvm/images/ubuntu-01.qcow2,size=20,format=qcow2,bus=virtio \
--network bridge=ovs-br0,virtualport_type=openvswitch,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--os-variant ubuntu22.04

修改点详细说明:

1. 从 --location 改为 --cdrom

  • 原因:Ubuntu 22.04 的 Live ISO 结构与 RedHat 系不同,virt-install 无法直接从它的 ISO 中“提取”出内核来配合 extra-args 使用。
  • 后果:由于使用了 --cdrom,原有的 --extra-args(用于串口控制台输出)将无法生效。

2. 从 --graphics none 改为 --graphics vnc

  • 原因:因为 --cdrom 模式无法直接将安装界面推送到的 SSH 串口(Terminal),必须通过 VNC 才能看到 Ubuntu 的安装紫色界面。
  • 配置listen=0.0.0.0 允许从本地电脑使用 VNC 客户端连接宿主机的 IP 来进行安装。

3. 修改 --os-variantubuntu22.04

  • 原因:这会告诉 KVM 使用适合 Ubuntu 22.04 的硬件抽象层配置。
  • 查询方式:可以通过 osinfo-query os | grep ubuntu 确认的系统支持的确切名称。

4. 磁盘路径与名称

  • 为了规范,我把名称和磁盘路径改为了 ubuntu-01,避免和之前的 Rocky 混合。

检查安装结果

  • 除了通过 VNC 查看安装过程,还可以通过下面的方式检查安装状态
# 查看虚拟机状态是否为 running
virsh list --all

# 查看网桥 ovs-br0 的状态,应该能看到一个以 vnet 开头的 Port 被自动加入到了 ovs-br0 中。
ovs-vsctl show

4. 安装完成后的操作

# 设置开机自启(可选)
virsh autostart ubuntu-01

克隆虚拟机

使用 virt-clone 克隆虚拟机是官方推荐的方法,它会自动处理配置文件(XML)的修改,包括生成新的 UUID、MAC 地址等,避免冲突。

# 确定源虚拟机名称
virsh list --all

# 克隆前建议先停止(关机)源虚拟机,以确保磁盘数据的一致性。
virsh shutdown <源虚拟机名称>

# 执行克隆
virt-clone --original <源虚拟机名称> --name <新虚拟机名称> --file <新虚拟机磁盘文件的存储路径>.qcow2


# 克隆后,新机器的备注(description)会默认继承原机的。如果想立即修改:
virsh desc NWXT-TEST-MD-01 --new-desc "克隆机01-备注信息" --config

示例:克隆 NWXT-TEST-MD 到 NWXT-TEST-MD-01

virsh shutdown NWXT-TEST-MD

virt-clone --original NWXT-TEST-MD --name NWXT-TEST-MZ --file /data/kvm/images/nwxt-test/nwxt-test-mz-disk1.qcow2
virt-clone --original NWXT-TEST-MD --name NWXT-TEST-MT --file /data/kvm/images/nwxt-test/nwxt-test-mt-disk1.qcow2
virsh desc NWXT-TEST-MZ --new-desc "克隆机MZ-备注信息" --config
virsh desc NWXT-TEST-MT --new-desc "克隆机MT-备注信息" --config

通过模板创建

准备模板

  • xxx

安装后的优化

安装 qemu-guest-agent

没有它,宿主机只能像看黑盒子一样看虚拟机;有了它,宿主机就有了“上帝视角”:

  • 优雅关机/重启: 宿主机发出的关机指令会通过它通知系统正常关机,而不是直接拔电源,避免硬盘坏道。
  • 在线快照(无损备份): 在备份时,它可以通知虚拟机“冻结”文件系统写入,确保备份的数据是完整一致的。
  • 网络信息同步: 宿主机可以直接查看到虚拟机内部的 IP 地址(无需登录控制台)。
  • 重置密码: 宿主机可以直接修改虚拟机内的用户密码。
  • 精准统计: 获取更准确的 CPU、内存使用情况。
# 验证虚拟设备是否存在
ls /dev/virtio-ports/org.qemu.guest_agent.0

# 所有主流发行版的包名都叫这个,直接使用 apt/yum 安装即可。
yum install -y qemu-guest-agent

# 验证服务是否正常运行即可,无需设置开机自启    
systemctl status qemu-guest-agent

# 从 kvm 宿主机测试,成功应返回 {"return":{}}
virsh qemu-agent-command <虚拟机名称> '{"execute":"guest-ping"}'

# 从 kvm 宿主机测试,成功应返回虚拟机的 IP 地址
virsh domifaddr <虚拟机名称> --source agent

PS:qemu-guest-agent 专门属于 KVM/QEMU 这一派系的。