之前看过KVM的相关文章,也用来搭起过一台装机服务器,时间过得久了,服务器没了,KVM怎么用的也忘了,是时候记录一下如何使用KVM了。
安装KVM组件
yum -y install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer
修改VNC侦听地址
vim /etc/libvirt/qemu.conf
默认只侦听127.0.0.1,需要将listen=0.0.0.0的注释去掉,否则无法在其他机器上使用VNC连接KVM虚拟机
完成后将libvirtd
服务设置成自启动
systemctl enable libvirtd
systemctl start libvirtd
创建桥接网卡
如果虚拟机要接入网络,则需要一个虚拟网卡与物理网卡进行通信,不管是NAT模式还是桥接模式,而我主要使用桥接模式,所以这里也是创建一个桥接网卡,并将其也物理网卡桥接关联,使得虚拟机可以直接连接到物理网络。
vim /etc/sysconfig/network-scripts/ifcfg-br0
该文件内容如下
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="dhcp"
DEFROUTE=yes
然后修改当前物理网卡配置,假设我的物理网卡名称为enp5s0
vim /etc/sysconfig/network-scripts/ifcfg-enp5s0
将其内容改为如下:
TYPE="Ethernet"
#PROXY_METHOD="none"
BROWSER_ONLY="no"
#BOOTPROTO="dhcp"
#DEFROUTE="yes"
#IPV4_FAILURE_FATAL="no"
#IPV6INIT="yes"
#IPV6_AUTOCONF="yes"
#IPV6_DEFROUTE="yes"
#IPV6_FAILURE_FATAL="no"
#IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp5s0"
UUID="5b4aad9b-5445-478d-9ba3-8202dc83d65b"
DEVICE="enp5s0"
ONBOOT="yes"
BRIDGE="br0"
注释掉的是之前的配置,只需要将其桥接到br0网卡就行,完成后使用systemctl restart network
命令重启网络服务。
使用brctl show
命令可以看到当前KVM虚拟网卡
bridge name bridge id STP enabled interfaces
br0 8000.5cf3fc4ae532 no enp5s0
vnet0
virbr0 8000.525400f27743 yes virbr0-nic
创建磁盘文件
创建安装虚拟机所需的磁盘文件,这里默认使用qcow2格式,因为网络上说qcow2格式是kvm支持的标准格式,raw格式为虚拟磁盘文件通用格式。有测试数据表明raw格式的I/O性能略高于qcow2格式,但是在加密,容量,快照方面qcow2格式有优势,所以现在大多使用qcow2格式,至于其他格式请自行Google。
qemu-img create -f qcow2 /opt/kvm/test.qcow2 10G
#创建一个qcow2格式磁盘文件
qemu-img create -f raw test.raw 20G
#创建一个RAW格式磁盘文件
qemu-img info test.qcow2
#查看创建的虚拟磁盘文件
创建虚拟机
使用上面的命令创建好磁盘后,使用以下命令创建对应的虚拟机
virt-install -n meeting --memory 1024 --vcpus 2 --os-variant centos7.0 --cdrom /home/CentOS-7-x86_64-Minimal-1908.iso --disk /opt/kvm/test.qcow2,format=qcow2,bus=virtio,size=10 --graphics vnc --network bridge=br0
详细的参数可以使用virt-install --help
进行查看,其中--os-variant
参数跟的值需要对应你要安装的系统,具体可以使用osinfo-query os
命令进行查询,我依稀还记得上一次用这个命令的时候输出是没有当前那么多的。
回车后会提示让你等待完成安装,不要傻傻的等,拿出你的VNC Viewer工具连接到KVM宿主机即可开始进行安装,否则你等到天荒地老也不可能完成安装。
Virsh语法参考(centos为KVM名字)
virsh list --all 列出所有的虚拟机
virsh start centos 启动centos虚拟机
virsh shutdown centos 关闭centos虚拟机
virsh destroy centos 强制关闭centos虚拟机
virsh autostart centos 设置centos自动启动
virsh undefine centos 删除centos虚拟机
virsh suspend centos 暂停centos虚拟机
vrish resume centos 恢复centos虚拟机
virsh reboot centos 重启centos虚拟机
virsh edit centos 编辑centos虚拟机
virsh vncdisplay centos vnc显示
销毁KVM虚拟机
如果需要删除某台kvm虚拟机,可以使用一下命令完成
virsh shutdown centos
virsh destory centos
virsh undefine centos
磁盘扩容
如果后期虚拟机磁盘容量不够用,那么久需要扩容了,首先安装以下包
yum -y install libguestfs-tools
将虚拟机关机后将磁盘文件备份防止数据丢失,并用以下命令查看分区大小
virt-df -h test.qcow2
W: kvm binary is deprecated, please use qemu-system-x86_64 instead
Filesystem Size Used Available Use%
test.qcow2:/dev/sda1 18G 1.1G 16G 6%
创建新的磁盘文件并将旧的磁盘与新的磁盘文件合并
qemu-img create -f qcow2 test-big.qcow2 40G
virt-resize --expand /dev/sda1 test.qcow2 test-big.qcow2
完成后用test-big.qcow2替换test.qcow2即可,然后重启虚拟机。
若新磁盘文件过大,用以下命令转存缩小大小
qemu-img convert -O qcow2 test-big.qcow2 test.qcow2
完成后同样替换文件重启虚拟机即可。
小脚本:
echo "Notice: if you want to use default value, press Enter directly, otherwise input your value."
read -p "VM Name:" name
read -p "RAM Size:" memory
if [ $memory -gt 0 ] 2>/dev/null;then
echo "pass"
else echo "invalid value"
exit
fi
read -p "CPU Croe:" vcpus
if [ $vcpus -gt 0 ] 2>/dev/null;then
echo "pass"
else echo "invalid value"
exit
fi
#while [[ $vcpus -lt 0 ]]; do
# echo "invalid data,input again"
# read -p "CPU Croe:" vcpus
#done
read -p "OS Type:" variant
read -p "ISO with path:" path
read -p "Disk name with path(e.g. /opt/kvm/win7.qcow2):" disk
read -p "Disk format(qcow2 default):" format
if [ -Z $formate ]; then
formate="qcow2"
fi
read -p "Bus type(virtio defalut):" bus
if [ -Z $bus ];then
bus="virtio"
fi
read -p "Disk Size:" size
if [ $size -gt 0 ] 2>/dev/null;then
echo "pass"
else echo "invalid value"
exit
fi
read -p "Win vfd with path, null defalut( e.g. /home/virtio-win-0.1.141_amd64.vfd):" vfd
read -p "graphics(vnc default):" graphics
if [ -Z $graphics ];then
graphics="vnc"
fi
read -p "Network type(bridge=br0 default):" network
if [ -Z $network ];then
network="bridge=br0"
fi
normal(){
echo "virt-install -n ${name} --memory ${memory} --vcpus ${vcpus} --os-variant ${variant} --cdrom ${path} --disk ${disk},format=${format},bus=${bus},size=${size} --graphics ${graphics} --network ${network}"
virt-install -n ${name} \
--memory ${memory} \
--vcpus ${vcpus} \
--os-variant ${variant} \
--cdrom ${path} \
--disk ${disk},format=${format},bus=${bus},size=${size} \
--graphics ${graphics} \
--network ${network}
}
win(){
echo "virt-install -n ${name} --memory ${memory} --vcpus ${vcpus} --os-variant ${variant} --cdrom ${path} --disk ${disk},format=${format},bus=${bus},size=${size} --disk path=${vfd},device=floppy --graphics ${graphics} --network ${network}"
virt-install -n ${name} \
--memory ${memory} \
--vcpus ${vcpus} \
--os-variant ${variant} \
--cdrom ${path} \
--disk ${disk},format=${format},bus=${bus},size=${size} \
--disk path=${vfd},device=floppy \
--graphics ${graphics} \
--network ${network}
}
if [ -Z $vfd ];then
normal
else
win
fi
本文由 Ethan 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。