KVM是一种基于Linux内核的开源全虚拟化解决方案,也是主流的Linux虚拟化解决方案,支持广泛的客户机操作系统。KVM需要CPU的虚拟化指令集的支持,如Intel的Intel VT(vmx指令集)或AMD的AMD-V(svm指令集)。
组成:
内核虚拟化模块 (KVM)
系统设备仿真 (QEMU)
虚拟机管理程序 (LIBVIRT)
KVM、qemu即可构成KVM,但qemu参数太过复杂用户不友好,为了使KVM易于管理提供了libvirt方便用户管理虚拟机。
安装:
# 核查cpu是否支持虚拟化
## inter cpu
cat /proc/cpuinfo | grep vmx
## amd cpu
cat /proc/cpuinfo | grep smv
# 安装,环境:ubuntu 22.04
apt install qemu-kvm libvirt-clients libvirt-daemon-system virtinst -y
systemctl restart libvirtd && systemctl enable libvirtd
核查安装:
# 交互式,命令行输入 virsh 进入
[root@controller qemu]# virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # nodeinfo
virsh # list -all
# 命令行式
[root@controller qemu]# virsh nodeinfo
[root@controller qemu]# virsh list --all
虚拟机文件:
虚拟机配置文件,XML文件,位置 :/etc/libvirt/qemu/
虚拟机硬盘文件,位置:/var/lib/libvirt/images/
虚拟机创建:
1)配置虚拟网络(非必须,如跳过,创建虚拟机会自动生成一个默认192.168.122.0/24网段虚拟网络)
# 创建并编写虚拟网络xml文件
[root@controller networks]# touch network.xml && vim network.xml
<network>
<name>default</name>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.1.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.1.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>
# 使用xml文件创建虚拟网络
[root@controller networks]# virsh net-define network.xml
Network default defined from network.xml
[root@controller networks]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default inactive no yes
# 配置虚拟网络自启和开启虚拟网络
[root@controller networks]# virsh net-autostart default
[root@controller networks]# virsh net-start default
[root@controller networks]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
# 配置后会在/etc/libvirt/qemu/networks目录下新生成对应名称的xml文件
# network.xml为自定义的xml文件,default.xml为自动生成的xml文件
[root@controller networks]# ls
autostart default.xml network.xml
[root@controller networks]# cat default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>default</name>
<uuid>751b47a1-21c9-4691-ba83-eb7ece4a2042</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:a1:5c:0f'/>
<ip address='192.168.1.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.1.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
2)创建虚拟机
# 1)xml文件创建
测试几次均报PCI错误,该方式待补充。
# 2)virt-install创建
## 创建虚拟机centos7
## cdrom引入的是iso镜像,需要提前准备好
virt-install --virt-type kvm --os-type=linux --os-variant centos7 \
--name centos7 --memory 2048 --vcpus 2 \
--disk /var/lib/libvirt/images/centos7.img,format=qcow2,size=50 \
--cdrom /download/centos7.iso \
--network network=default \
--graphics vnc,port=5901,listen=0.0.0.0 \
--noautoconsole
--autostart
## vnc连接安装系统
略
虚拟机管理:
# 查看KVM节点(服务器)信息
virsh nodeinfo
# 列举虚拟机,--all列出所有
virsh list --all
# 运行|重启|关闭指定虚拟机
virsh start|reboot|shutdown 虚拟机名
# 强制关闭指定虚拟机
virsh destroy 虚拟机名
# 将指定虚拟机设置|取消随宿主机自启动
virsh autostart [--disable] 虚拟机名
# 修改虚拟机配置,可调整虚拟机内存、cpu和磁盘挂载
## cpu、内存
virsh edit 虚拟机名
后直接修改对应cpu、内存配置大小就可以了
## 硬盘
## 挂载新磁盘
### 1)新建待挂载磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-2.img 1G
### 2)关闭虚拟机
### 3)配置挂载新磁盘
#### 具体将之前的vda部分配置复制粘贴一份,然后修改file、dev并删除address,最后:wq保存退出即可
virsh edit 虚拟机名
#### 示例
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/centos7.img'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/centos7-2.img'/>
<target dev='vdb' bus='virtio'/>
</disk>
### 4)重启虚拟机
## 扩容已有磁盘
### 不用重启虚拟机,下方命令执行后,再进虚拟机即可看到虚拟机vda磁盘容量已增加
virsh blockresize --domain centos7 --path /var/lib/libvirt/images/centos7.img --size 60G
# 根据xml文件 创建/删除 虚拟机
virsh define|undefine 虚拟机名
# 克隆虚拟机
virt-clone --original centos7 --name centos7-2 --auto-clone
虚拟网络管理:
# 列举虚拟网络,--all列出所有
virsh net-list --all
# 启动虚拟网络
virsh net-start 虚拟网络名
# 强制停止虚拟网络
virsh net-destroy 虚拟网络名
# 根据xml文件创建/删除虚拟网络
virsh net-define|net-undefine 虚拟网络名
# 修改虚拟网络配置
virsh net-edit 虚拟网络名
# 将指定的虚拟网络设置|取消开机自启
virsh net-autostart [--disable] 虚拟网络名
问题:
1、虚拟机配置系统完成后,使用virsh console会卡住。
现象:
root@theozhou:/etc/libvirt/qemu# virsh console centos7
Connected to domain 'centos7'
Escape character is ^] (Ctrl + ])
解决:
vnc连入虚拟机后输入以下命令
[root@localhost ~]# echo "ttyS0" >> /etc/securetty
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0"
[root@localhost ~]# reboot