创建虚拟机
前期准备
# 建立一个标准目录存放镜像
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 onopenEuler
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-variant 为 ubuntu22.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 show4. 安装完成后的操作
# 设置开机自启(可选)
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 agentPS:qemu-guest-agent 专门属于 KVM/QEMU 这一派系的。