关于qemu-kvm介绍不在阐述,本文以实际工作项目中所遇问题总结下qemu-kvm的创建过程,期间融合了各种实际碰到的问题,以此记录并给后来者提供一定参考。
直接进入主题:
1.首先我们需要检查一下我们的当前主机是否支持cpu虚拟化:
(若没有请#modprobe kvm,或者某些内核需安装kernel-**-kvm.rpm)
# lsmod | grep kvm kvm_intel 253952 6 kvm 811008 1 kvm_intel irqbypass 16384 3 kvm |
安装qemu-kvm包
# yum -y install qemu-kvm |
2.安装kvm虚拟机要提前做好准备工作,包括iso文件(提前下载好),硬盘文件linux.qcow2,虚拟机配置文件linux.xml(也可参考网上某些模板)
<domain type='kvm'>
<name>linux</name>
<memory unit='GiB'>8</memory>
<vcpu>4</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
</os>
<features>
<acpi/>
</features>
<cpu mode='host-passthrough'>
</cpu>
<clock offset='utc'/>
<on_poweroff>shutdown</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/root/virbcl/linux.qcow2'/>
<target dev='sda' bus='ide'/>
<boot order='2'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/root/virbcl/Linux-xxxx.iso'/>
<target dev='sdb' bus='ide'/>
<readonly/>
<boot order='1'/>
</disk>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' listen='0.0.0.0'/>
</devices>
</domain>
首先我们需要创建一个虚拟磁盘,相当于我们的系统盘:
# qemu-img create -f qcow2 /root/linux.qcow2 40G Formatting 'linux.qcow2', fmt=qcow2 size=42949672960 cluster_size=65536 lazy_refcounts=off refcount_bits=16 |
以下开始就可以分为qemu安装 或 libvirt安装两种方法了:
a.libvirt辅助安装
首先安装libvirt相应rpm包,然后执行 virsh 命令定义一台虚机(保证光盘、硬盘都在root用户目录下以获得权限)
# virsh define linux.xml |
(若define有qemu:x:107:107报错可参考,没有则跳过此步骤):
# vim /etc/libvirt/qemu.conf …… user="root" group="root" # systemctl restart libvirt |
执行 virsh 命令启动一台虚机
# virsh start linux.xml |
查看虚拟机状态
# virsh list --all Id 名称 状态 ---------------------------------------------------- 17 linux running |
b.纯qemu命令行安装
创建虚机:
/usr/libexec/qemu-kvm -m 4G -smp 2 -name jcf --enable-kvm -boot d \
-hda /root/linux.img \
-cdrom /root/CentOS-8.5.2111-ppc64le-dvd1.iso \
-vnc :1
其中上述磁盘.img和光盘.iso需要换成你自己的路径。
3.虚拟机启动后,用VNC新建链接session查看,连接的 ip 地址为宿主机的 ip 地址,可以通过 ip a进行查看。
此时若vnc链接不到虚拟机,请考虑如下排查手段:
A.如果系统是最小化安装的,要安装xorg-x11-xauth.rpm包 ,不然在使用ssh连接主机时图形无法支持
# yum -y install xorg-x11-xauth |
B.关闭防火墙,关闭SELINUX
#systemctl status firewalld #systemctl stop firewalld #systemctl disable firewalld #getenforce #setenforce 0 #vim /etc/selinux/config …… SELINUX=disable |
4.由于第一次进入系统,显示出安装系统的界面,我们正常进行安装就可以了。
安装完成后,系统就写入对应的虚拟磁盘中了,若是通过libvirt安装的,这时重启后会依然进行安装,原因在于linux.xml中配置启动顺序为先iso,后qcow2; 所以需要更改配置文件(xml) 中的启动项,将其从 cdrom 启动改为从磁盘启动。
执行 virsh 命令关闭虚机(shutdown命令失效就用destroy),编辑虚机,重启虚机
# virsh shutdown linux.xml # virsh edit linux.xml # virsh start linux.xml |
(其中第二步edit只需将iso和qcow2的 <boot order='1/2'/>顺序数字互换一下即可)
对于用qemu安装的没有此问题,重启系统后就直接是可以运行的操作系统。
4.1之后便可正常启动虚拟机,进行后续工作,如配置网络。
正常情况下,由于libvirt配置,host-guest之间会通过virbr0这张网桥进行通信,可以 通过brctl show查看(yum install bridge-utils),且host上可以ip查看virbr0的ip,一般为192.168.122.x。所以guest启动后,直接把网卡ip配置成同样网段的192.168.122.x,便可以ping通。
其中guest的配置xml有关网卡的配置如下:
如果此时不能联网,可以尝试在guestd的xml里把interface type=和source标签改成如下的名字:
# virsh edit linux.xml
……
<interface type='bridge'>
<mac address='52:54:00:ae:d4:8a'/>
<source bridge='virbr0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
此时guest的xml网卡配置如下:(有点奇怪我实测出guest的两种配置,居然都可以联网。有时间了在详细理解下这个NICs配置libvirt: Domain XML format)
如果依然不能联网,可能是host上缺少配置。只能提供方法了,因为我已经联网成功无法再实测。如果host上没有默认virbr0这张网桥,那就需要自己手动配置了。配置网桥也有两种方式:
1)host在目录/etc/systemconfig/network-script下创建文件ifcfg-br0,然后修改原有的网卡配置文件如ifcfg-enoxxx,将其中的ip等信息干掉(因为要把这个物理网卡变成网桥,原始的eno网卡变成虚拟的网卡),然后将ip信息填入到新创建的ifcfg-br0中。具体步骤可参考ohttps://blog.51cto.com/6226001001/2084537h 或 libvirt kvm 虚拟机上网 – Bridge桥接_libvirt 网桥-CSDN博客
2)用libvirt辅助创建一个网桥,首先准备一个网桥配置xml如virbr0.xml:
<network>
<name>virbr0</name>
<forward mode='bridge'>
<bridge name='virbr0'/>
</forwad>
</network>
然后用libvirt来定义并开启这个网络:
virsh net-define virbr0.xml
virsh net-start virbr0
重启VM检查联网。重启后若虚拟机无法联网,则考虑将网络配置network由网桥bridge改成NAT模式:
4.2网上另一种自定义联网方式
首先要准备自定义的网络xml如default.xml
<network>
<name>default</name>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
然后使用virsh
命令定义或更新网络:
virsh net-define default.xml
virsh net-start network
virsh net-autostart network
之后可以brctl show查看新定义的名字为default网络,同时在guest的配置文件xml里修改相应的名称。
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
4.3配置连接外网
连接外网主要是设置ip转发等,具体步骤在另一篇qemu虚拟机配置网络_qemu虚拟机网络配置-CSDN博客详细介绍过,不再赘述。
5.修改默认登录命令行界面
linux一开始安装完成后是默认进入图形界面的,我们如果想改成命令行,可以用下面命令:
systemctl isolate multi-user.target 切换为多用户模式(命令行模式)
systemctl set-default multi-user.target 设置默认开机为命令行模式
6.后续启动虚机
(1).对于libvirt控制的虚机,直接virsh start xxx即可启动虚机,一般不会报错。此处针对其他架构如ppc而言因为有独立的bios固件,所以经常会报错:failed to find romfile "vgabios-stdvga.bin"
这是因为qemu在启动时会自动去搜寻相匹配的固件bios,常见的路径有
-
/usr/share/qemu/firmware
-
/etc/qemu/firmware
-
$XDG_CONFIG_HOME/qemu/firmware
而ppc需要的启动bios如针对pseries虚机的slof.bin和vga设备的vgabios-stdvga.bin都不会自动放到以上目录中,所以解决办法就是将虚机需要的*.bin直接拷贝至/usr/share/qemu/ 目录下即可,或者通过软连接的方式也行:
ln -s xxx/qemu-6.2.0/pc-bios/slof.bin /usr/share/qemu/slof.bin
ln -s xxx/qemu-6.2.0/pc-bios/vgabios-stdvga.bin /usr/share/qemu/vgabios-stdvga.bin
(2).纯qemu命令行安装的虚机可以继续用命令行启动虚机,只需要-boot 选项的d(光盘启动) 改为c(磁盘启动),所以此时命令行带不带iso的参数都行
启动虚机:
/usr/libexec/qemu-kvm -m 4G -smp 4 -name bcl-qemu --enable-kvm -boot cd \
-hda /root/linux-qemu.qcow2 \
-vnc :2 -monitor stdio
7.监控&远程登录虚机
A.提供三种命令行添加monitor监控方式:
方式1 stdio直接看
host# qemu-kvm ... -monitor stdio
方式2 UNIX套接字
host console1# qemu-kvm ... -monitor unix:qemu-monitor-socket,server,nowait //qemu-monitor-socket可任意命名,但console2连接需在本目录下
host console2# nc -U qemu-monitor-socket
或
host console2# socat - unix-connect:qemu-monitor-socket
方式3 telnet
host console1# qemu-kvm ... -monitor telnet:127.0.0.1:4444,server,nowait
host console2# telnet 127.0.0.1 4444
B.提供两种命令行host远程登录guest的方式,以便使用MobaXterm远程连接到guest
host console1#qemu-system-ppc64 -m 8G -smp 4 -name pseries --enable-kvm -boot cd -hda linux.img -serial unix:qemu-monitor-socket,server,nowait //qemu-monitor-socket可任意命名,但console2连接需在本目录下
host console2#nc -U qemu-monitor-socket
host console1#qemu-system-ppc64 -m 8G -smp 4 -name pseries --enable-kvm -boot cd -hda linux.img -serial tcp::4444,server=on,wait=off
host console2#telnet 127.0.0.1 4444
其实还有专门的hostfwd命令选项,但由于这个很依赖特定的版本,所以有需要可查询官方手册QEMU User Documentation — QEMU documentation