ubuntu2204安装kvm
- 前言
- 一、检测硬件是否支持
- 二、安装软件
- 三、创建/管理虚拟机
- 1、创建存储池
- 2、qemu创建镜像
- 3、xml文件运行虚拟机
- 1、范文
- 2、xml文件创建虚机
- 3、创建虚机
- 4、克隆虚机
- 5、创建快照
- 6、脚本创建
- VNC连接
- 四、创建集群
- 1、安装glusterfs
- 2、加入集群
- 删除节点
- 3、 创建卷
- 3、kvm挂载目录
- 图形化创建
- 五、虚拟机迁移
- 同一宿主机内迁移
- 不同宿主机内迁移
前言
##虚拟机开启虚拟化
VNC下载链接
一、检测硬件是否支持
##非零即可
root@kvm:~# egrep -c ‘(svm|vmx)’ /proc/cpuinfo
##检查是否启用虚拟化
root@kvm:~# apt install cpu-checker
root@kvm:~# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
二、安装软件
root@kvm:~# apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
root@kvm:~# systemctl start libvirtd
root@kvm:~# systemctl enable libvirtd
root@kvm:~# usermod -aG libvirt $USER
root@kvm:~# lsmod | grep kvm
kvm_intel 368640 0
kvm 1032192 1 kvm_intel
三、创建/管理虚拟机
1、创建存储池
##创建一个存储池来存放虚拟机的磁盘镜像文件
root@kvm:~# mkdir -p /data/kvm/pool
virsh pool-define-as --name kvm_test --type dir --target /data/kvm/pool/
virsh pool-start kvm_test
virsh pool-autostart kvm_test
2、qemu创建镜像
qemu-img create -f qcow2 /data/kvm/qcow/vm_test.qcow2 20G
1. 使用 qcow2 格式创建镜像
qcow2 是 QEMU 推荐的磁盘格式,支持动态扩展、快照和压缩。
qemu-img create -f qcow2 /data/kvm/qcow/vm_test.qcow2 20G
-f qcow2: 指定镜像格式为qcow2。
/data/kvm/qcow/vm_test.qcow2: 镜像文件保存路径及文件名。
20G: 分配给虚拟机的磁盘大小(可根据需求调整)。
2. 使用 raw 格式创建镜像
raw 格式是未压缩的磁盘格式,性能较好,但不支持快照等高级功能。
qemu-img create -f raw /data/kvm/qcow/vm_test.raw 20G
####常见 qemu-img 命令
1. 查看镜像信息
##可以使用 qemu-img info 命令查看镜像文件的详细信息:
qemu-img info /data/kvm/qcow/vm_test.qcow2
2. 转换镜像格式
##将现有镜像转换为另一种格式:
qemu-img convert -f qcow2 -O raw /data/kvm/qcow/source_image.qcow2 /data/kvm/qcow/target_image.raw
-f qcow2: 源镜像格式。
-O raw: 目标镜像格式。
/data/kvm/qcow/source_image.qcow2: 源镜像文件。
/data/kvm/qcow/target_image.raw: 目标镜像文件。
3. 创建包含快照的镜像
##通过创建一个依赖于原始镜像的快照镜像,可以节省磁盘空间:
qemu-img create -f qcow2 -b /path/to/base_image.qcow2 /path/to/snapshot_image.qcow2
-b /path/to/base_image.qcow2: 基础镜像路径。
4. 扩展镜像大小
##如果需要扩大已经创建的镜像,可以使用以下命令:
qemu-img resize /data/kvm/qcow/vm_test.qcow2 +10G
这将把镜像的大小增加10GB。
5. 启动虚拟机
##创建完镜像后,可以使用qemu-system命令启动虚拟机。例如:
qemu-system-x86_64 -hda /data/kvm/qcow/vm_test.qcow2 -m 2G -smp 2 -boot d
-hda: 指定硬盘镜像文件。
-m 2G: 分配2GB内存。
-smp 2: 分配2个虚拟CPU。
-boot d: 指定从光驱(或者ISO镜像)启动。
3、修改qcow文件
##加载 NBD 模块(如果未加载):
modprobe nbd
qemu-nbd --connect=/dev/nbd0 /data/kvm/qcow/vm_test.qcow2
fdisk -l /dev/nbd0
mount /dev/nbd0 /mnt/
mount -o loop /dev/nbd0 /mnt/
mount -o iso /dev/nbd0 /mnt/
检查文件头和内容
如果 file 命令无法识别文件类型,使用 hexdump 或 xxd 查看文件头部分来识别文件结构:
file -s /dev/nbd0
hexdump -C /path/to/datafile.data | head
/dev/nbd0: data
parted /dev/nbd0 print
Model: Unknown (unknown)
Disk /dev/nbd0: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
root@kvm:/data/kvm/vm# sysctl -a | grep overcommit
vm.nr_overcommit_hugepages = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.overcommit_memory = 1
3、xml文件运行虚拟机
1、范文
<domain type='kvm'>
<!-- 虚拟机名称 -->
<name>example_vm</name>
<!-- UUID是虚拟机的唯一标识符 -->
<uuid>d759a4f4-3f3d-499e-8431-123456789abc</uuid>
<!-- 内存配置:设置虚拟机的最大和初始内存 -->
<memory unit='KiB'>8388608</memory> <!-- 8 GB -->
<currentMemory unit='KiB'>8388608</currentMemory> <!-- 初始内存也是8 GB -->
<!-- CPU配置 -->
<vcpu placement='static'>4</vcpu> <!-- 分配4个虚拟CPU -->
<!-- 操作系统设置 -->
<os>
<type arch='x86_64' machine='pc-i440fx-2.11'>hvm</type>
<boot dev='hd'/> <!-- 从硬盘启动 -->
<bootmenu enable='yes'/> <!-- 启用启动菜单 -->
</os>
<!-- 时钟设置 -->
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<!-- CPU模式和特性 -->
<cpu mode='host-passthrough'>
<topology sockets='1' cores='2' threads='2'/>
<!-- 禁用虚拟化功能SVM (AMD) -->
<feature policy='disable' name='svm'/>
</cpu>
<!-- 设备设置 -->
<devices>
<!-- 磁盘配置 -->
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/example_vm.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
<!-- CD-ROM驱动器 -->
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/example.iso'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<!-- 网络接口配置 -->
<interface type='network'>
<mac address='52:54:00:aa:bb:cc'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<!-- 图形设备配置 -->
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<!-- 声卡设备 -->
<sound model='ich9'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
</sound>
<!-- 输入设备 -->
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<!-- 显卡设备 -->
<video>
<model type='cirrus' vram='16384' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<!-- 串口控制台 -->
<console type='pty'>
<target type='serial' port='0'/>
</console>
<!-- 通用USB设备 -->
<hub type='usb'/>
</devices>
<!-- 特权设置:如果需要,允许KVM虚拟机访问设备 -->
<features>
<acpi/> <!-- 启用ACPI电源管理 -->
<apic/> <!-- 启用APIC -->
<pae/> <!-- 启用PAE(物理地址扩展),允许32位系统使用大于4GB的内存 -->
</features>
<!-- 启动时自动启动虚拟机 -->
<on_poweroff>destroy</on_poweroff> <!-- 电源关闭时销毁虚拟机 -->
<on_reboot>restart</on_reboot> <!-- 重启时自动重启虚拟机 -->
<on_crash>restart</on_crash> <!-- 崩溃时自动重启虚拟机 -->
</domain>
2、xml文件创建虚机
<domain type='kvm'>
<name>vm_test</name>
<memory unit='KiB'>2097152</memory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-2.11'>hvm</type>
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
<devices>
<!-- 磁盘配置 -->
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/kvm/qcow/vx_test.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
x
<!-- ISO 镜像作为CD-ROM -->
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/data/kvm/image/ubuntu-22.04.4-live-server-amd64.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<!-- 网络配置 -->
<interface type='network'>
<mac address='52:54:00:aa:bb:cc'/>
<source network='default'/>
<model type='virtio'/>
</interface>
<!-- VNC 配置 -->
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
</devices>
</domain>
qemu-img create -f qcow2 /data/kvm/qcow/vx_test.qcow2 20G
virsh define vx-test.xml
virsh list --all
virsh start vx_test
##设置虚拟机开机自启
virsh autostart vx_test
virsh autostart --disable vx_test #取消
3、创建虚机
wget https://mirrors.ustc.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.4-live-server-amd64.iso
##创建虚拟磁盘文件:该命令创建了一个大小为 20GB 的虚拟磁盘文件,格式为 qcow2,用于后续虚拟机的存储。
qemu-img create -f qcow2 /data/kvm/qcow/image.qcow2 20G
## 创建和安装虚拟机:创建并安装了一个名为 vm_test 的虚拟机,分配了 2GB 内存、2 个虚拟 CPU、默认网络配置,使用 VNC 连接显示图形界面,并从 Ubuntu 22.04 ISO 镜像启动安装系统。
virt-install --virt-type kvm --name vm_test --ram 2048 --vcpus 2 --disk path=/data/kvm/qcow/image.qcow2,format=qcow2 --os-variant ubuntu22.04 --network network=default --graphics vnc,listen=0.0.0.0 --cdrom /data/kvm/image/ubuntu-22.04.4-live-server-amd64.iso --noautoconsole
4、克隆虚机
root@kvm:/data/kvm/clone# virt-clone -o vm_test -f /data/kvm/clone/vm_test.qcow2 --name vm_test_clone
ERROR Domain to clone must be shutoff.
Clone 'vm_test_clone' created successfully.
参数说明:
-o:指定被克隆虚拟机
-n:克隆机名称
-f:指定克隆机文件位置与名称
root@kvm:/data/kvm/clone# virsh list --all
Id Name State
--------------------------------
1 vm_test2 running
- vm_test shut off
- vm_test_clone shut off
## 修改uuid
root@kvm:/data/kvm/clone# virsh edit vm_test_clone
5、创建快照
root@kvm:/data/kvm/clone# virsh snapshot-create-as vm_test2 vm_test-snap2
Domain snapshot vm_test-snap2 created
root@kvm:/data/kvm/clone# virsh snapshot-list vm_test2
Name Creation Time State
------------------------------------------------------
vm_test-snap2 2024-09-12 03:30:54 +0000 running
root@kvm:/data/kvm/clone# virsh snapshot-info vm_test2 vm_test-snap2
Name: vm_test-snap2
Domain: vm_test2
Current: yes
State: running
Location: internal
Parent: -
Children: 0
Descendants: 0
Metadata: yes
6、脚本创建
#!/bin/bash
# 需要指定的变量
VM_NAME=$1 # 虚拟机名称
OS_TYPE=$2 # 操作系统类型 (ubuntu, centos, win)
DISK_SIZE=20 # 虚拟机磁盘大小 (GB)
RAM_SIZE=2048 # 虚拟机内存大小 (MB)
VCPUS=2 # 虚拟机CPU核数
CLONE_NAME=$3 # 如果进行克隆的虚拟机名称
# 检查是否提供必要的参数
if [ -z "$VM_NAME" ] || [ -z "$OS_TYPE" ]; then
echo "Usage: $0 <vm_name> <os_type: ubuntu|centos|win> [clone_name]"
exit 1
fi
# 设置系统对应的os-variant参数
case $OS_TYPE in
ubuntu)
OS_VARIANT="ubuntu20.04"
;;
centos)
OS_VARIANT="centos8"
;;
win)
OS_VARIANT="win10"
;;
*)
echo "Invalid OS type! Choose from ubuntu, centos, win."
exit 1
;;
esac
# 磁盘文件路径
DISK_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2"
# 镜像文件路径(可根据实际环境修改)
ISO_PATH=""
case $OS_TYPE in
ubuntu)
ISO_PATH="/path/to/ubuntu.iso"
;;
centos)
ISO_PATH="/path/to/centos.iso"
;;
win)
ISO_PATH="/path/to/windows.iso"
;;
esac
# 创建虚拟机磁盘文件
echo "Creating virtual machine disk..."
qemu-img create -f qcow2 $DISK_PATH ${DISK_SIZE}G
# 创建虚拟机
echo "Installing virtual machine..."
virt-install \
--name $VM_NAME \
--ram $RAM_SIZE \
--vcpus $VCPUS \
--disk path=$DISK_PATH,format=qcow2,size=$DISK_SIZE \
--os-variant $OS_VARIANT \
--network network=default \
--graphics vnc \
--cdrom $ISO_PATH \
--noautoconsole
# 检查是否需要克隆虚拟机
if [ ! -z "$CLONE_NAME" ]; then
echo "Cloning virtual machine..."
virt-clone --original $VM_NAME --name $CLONE_NAME --file /var/lib/libvirt/images/${CLONE_NAME}.qcow2
# 生成新的UUID并修改克隆虚拟机的UUID
NEW_UUID=$(uuidgen)
echo "Updating UUID for the cloned virtual machine..."
virsh dumpxml $CLONE_NAME > ${CLONE_NAME}.xml
sed -i "s/<uuid>.*<\/uuid>/<uuid>${NEW_UUID}<\/uuid>/" ${CLONE_NAME}.xml
virsh define ${CLONE_NAME}.xml
rm -f ${CLONE_NAME}.xml
echo "Cloned VM: $CLONE_NAME with new UUID: $NEW_UUID"
fi
echo "Virtual machine installation completed."
# 创建虚拟机(如Ubuntu)
./virsh-install.sh my_vm ubuntu
# 创建虚拟机并克隆(如CentOS)
./virsh-install.sh my_vm centos my_vm_clone
VNC连接
vnc连接:主机为本机ip。默认端口5900,依次加一
安装好系统后可本机ssh连接。
四、创建集群
1、安装glusterfs
##kvm及所有节点hosts文件修改
root@vm2:~# cat /etc/hosts
...
192.168.220.88 vm2
192.168.220.99 vm3
apt install glusterfs-*
glusterfs -V
root@vm3:~# systemctl start glusterd.service
root@vm3:~# systemctl enable glusterd.service
2、加入集群
##单节点上执行,添加其他节点到集群
root@vm2:~# gluster peer probe vm3
peer probe: success
##vm2上验证
root@vm2:~# gluster peer status
Number of Peers: 1
Hostname: vm3
Uuid: 67eed80b-be06-4564-ae16-adebfc079709
State: Peer in Cluster (Connected)
删除节点
root@vm2:~# gluster peer detach kvm
3、 创建卷
##所有节点创建目录
mkdir /data
## 直接用根分区做存储卷,需加force
##创建一个名为models的存储卷、2副本
root@vm2:~# gluster volume create gfsv replica 2 vm2:/data vm3:/data force
volume create: gfsv: success: please start the volume to access data
root@vm2:~# gluster volume info models
Volume Name: gfsv
Type: Replicate
Volume ID: a6d80c21-deb7-44c7-abf4-e2a70060fa64
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: vm2:/data
Brick2: vm3:/data
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
##启用卷
root@vm2:~# gluster volume start gfsv
##停止删除卷
root@vm2:~# gluster volume stop gfsv
root@vm2:~# gluster volume delete gfsv
##查看卷状态
root@vm2:~# gluster volume status
Status of volume: models
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick vm2:/data 54529 0 Y 6158
Brick vm3:/data 52302 0 Y 3377
Self-heal Daemon on localhost N/A N/A Y 6175
Self-heal Daemon on vm3 N/A N/A Y 3394
Task Status of Volume models
------------------------------------------------------------------------------
There are no active volume tasks
3、kvm挂载目录
root@kvm:/data/kvm# mount.glusterfs vm2:models /kvmdata/
root@kvm:/data/kvm# echo "vm2:models /kvmdata/ glusterfs defaults,_netdev 0 0" >> /etc/fstab
root@kvm:/data/kvm# mount -a
root@kvm:/data/kvm# df -Th | grep gluster
vm2:models fuse.glusterfs 57G 18G 37G 33% /kvmdata
root@kvm:/data/kvm# mkdir /kvmdata/{data,iso}
##创建存储池
root@kvm:/data/kvm# virsh pool-define-as --name iso --type dir --target /kvmdata/iso/Pool iso defined
root@kvm:/data/kvm# virsh pool-define-as --name data --type dir --target /kvmdata/data/
Pool data defined
图形化创建
virt-manager
五、虚拟机迁移
同一宿主机内迁移
##查看虚拟机所有磁盘文件
##适用情况:磁盘满或新加数据盘的情况下从/aaa目录迁移到/bbb目录
root@kvm:/data/kvm# virsh domblklist vm_test
Target Source
--------------------------------------
vda /data/kvm/qcow/image.qcow2
sda
##直接迁移镜像:例如
root@kvm:/data/kvm# mv /data/kvm/qcow/image.qcow2 /kvmdata/data/
##停止虚拟机
root@kvm:/data/kvm# virsh shutdown vm_test
Domain 'vm_test' is being shutdown
##编辑
root@kvm:/data/kvm# virsh edit vm_test
Domain 'vm_test' XML configuration edited.
root@kvm:/data/kvm# virsh start vm_test
Domain 'vm_test' started
root@kvm:/data/kvm# virsh domblklist vm_test
Target Source
-------------------------------------
vda /kvmdata/data/image.qcow2
sda -
不同宿主机内迁移
virsh migrate方法
virsh migrate只能迁移配置文件,磁盘镜像文件还要我们手工完成。
在kvm2上
virsh undefine vm_test //只删除了配置文件
rm /data/kvm/qcow/image.qcow2 -i
切换到kvm1,88为kvm2
virsh migrate --domain vm_test --desturi qemu+ssh://root@192.168.220.66/system --offline --persistent