目前大众主要是使用的UNRAID或者Proxmox VE,比较有局限性,但本质上他们都是qemu-kvm虚拟化。

由于需要qemu的新版特性,尤其是tpm,hyperv,ahci都是关键优化都不支持,已经不太能满足我的调试需求了,因此我准备开始编译qemu。
之前是用Ubuntu的源安装qemu,但这样肯定没法在公司的系统内使用。
因此我就需要自行编译最新版的qemu,然后后面修改下libvirt调用的qemu就行了。
(整个系列其实都搞完了,但我上个月完全没发文章,因此我这次也不一次性放完,基本上一周末一次的频率吧)

配置环境

需要公司版本的centos,公司的centos版本是

[root@node01 ~]# uname -a
Linux node01 5.4.108

因此我先准备个0531版本的镜像安装VMware。

开始编译

获取qemu

从GitHub获取qemu源码。

yum install git
git clone https://github.com/qemu/qemu.git
cd qemu

查看提交历史

git log

查看远程分支

git branch -a

选择5.0版本的分支

git checkout stable-5.0

开始尝试编译,缺啥安啥

./configure --prefix=/usr --enable-kvm --disable-sdl --disable-gtk --enable-vnc --target-list=x86_64-softmmu

提示需要python3.5以上的环境。

ERROR: Cannot use '/usr/bin/python', Python >= 3.5 is required.
       Use --python=/path/to/python to specify a supported Python.

安装python3.8

安装python依赖包

yum -y groupinstall "Development Tools"
yum -y install openssl-devel bzip2-devel libffi-devel xz-devel

查看gcc版本是否为4.8.5或者更高

[root@NODE qemu]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

获取python源码

yum -y install wget
cd ~
wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz

解压

tar xvf Python-3.8.12.tgz

进入目录

cd Python-3.8*/

开始运行配置脚本

./configure --enable-optimizations

开始编译安装

sudo make altinstall

检查编译完成

[root@NODE Python-3.8.12]# python3.8 --version
Python 3.8.12
[root@NODE Python-3.8.12]# pip3.8 --version
pip 21.1.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)

修改软链接(非必要)

rm -rf /usr/bin/python
ln -s /usr/local/bin/python3.8 /usr/bin/python
python -V

查看python路径

[root@NODE qemu]# which python3.8
/usr/local/bin/python3.8

如果yum按照的python就需要手动安装pip(非必要)

wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py

修改pip

由于yum使用的是python2的语法,因此还需要将其修改下(yum报错才需要修改):

vi /usr/bin/yum
vim /usr/bin/yum-config-manager
vim /usr/libexec/urlgrabber-ext-down

修改内部前面的内容为:

/usr/bin/python2.7 

继续编译

./configure --prefix=/usr --enable-kvm --disable-sdl --disable-gtk --enable-vnc --target-list=x86_64-softmmu --python=/usr/local/bin/python3.8

提示缺少glib2

ERROR: glib-2.48 gthread-2.0 is required to compile QEMU

安装glib2即可

yum install glib2-devel

提示pixman版本不对

ERROR: pixman >= 0.21.8 not present.
       Please install the pixman devel package.

安装pixman即可

yum install pixman-devel

编译

make -j4

解决证书过期报错

报错:

The certificate issuer s certificate has expired.

安装ntp服务

yum install -y ntp
timedatectl set-ntp yes

再用date检查

更新证书

yum update ca-certificates

如果提示:fatal: The remote end hung up unexpectedly ,还需要更新git解决:

sudo yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm
yum install git

开始最简单的编译

cd ~/qemu
./configure --prefix=/usr --enable-kvm --disable-sdl --disable-gtk --enable-vnc --target-list=x86_64-softmmu --python=/usr/local/bin/python3.8

make -j4

make install

如果通过了就开始装完整环境

正式编译

一般来说如果不用spice 就不用编译spice了,但如果用到spice,那还是需要编译spice,我这在99.1上用还不用spice,因此就先不装spice以及附属组件了,也不需要3d加速。

继续安装环境

yum install epel-release
yum install lzo-devel gtk3-devel libssh libssh-devel libaio libaio-devel numactl-devel libiscsi libiscsi-devel libusbx-devel libusb-devel libnfs-devel libcap-ng-devel

编译

./configure --prefix=/usr --enable-kvm --disable-sdl --disable-gtk --enable-vnc --target-list=x86_64-softmmu --enable-libusb --enable-lzo --enable-bzip2 --enable-numa --enable-libssh --enable-libiscsi --enable-libnfs  --enable-linux-aio --enable-virtfs --enable-gtk --enable-rbd --enable-tools --python=/usr/local/bin/python3.8

make -j4

make install

测试

准备

上传redpill-DS3615xs_7.0-41222_b1633594423.img,进行测试.

mkdir -p /zfs0/qemu/dsm7/

qemu-img create -f raw /zfs0/qemu/dsm7/vdisk1.img 100G
mv redpill-DS3615xs_7.0-41222_b1633594423.img /zfs0/qemu/dsm7/redpill-DS3615xs_7.0-41222_b1633594423.img

迁移二进制文件

cp /usr/bin/qemu-system-x86_64 /usr/libexec/qemu-system-x86_64
/usr/libexec/qemu-system-x86_64 -machine help

配置环境

qemu-system-x86_64等命令目录加入系统PATH

export PATH=/usr/local/bin/:$PATH   

配置网卡

前往网络文件路径

cd /etc/sysconfig/network-scripts/

按如下参考配置进行修改,通过下面的配置,来将qemu虚拟化的云主机网络从br0经过。

我这里的配置是基于我这里的情况,可能与你那网络完全不同,配置仅供参考。

[root@NODE network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
DEVICE=ens33
MASTER=bond0
SLAVE=yes

[root@NODE network-scripts]# cat ifcfg-bond0
TYPE=Ethernet
NAME=bond0
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="mode=1 miimon=100 xmit_hash_policy=layer3+4"
#IPADDR=192.168.122.150
#NETMASK=255.255.255.0
#GATEWAY=192.168.122.2

BRIDGE=br0
[root@NODE network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT=yes
BOOTPROTO=none

IPADDR=192.168.122.150
NETMASK=255.255.255.0
GATEWAY=192.168.122.2

配置完成后记得重启服务器。并且准备好ipmi,防止重启失效。
不知道为什么systemctl restart network会重启失败,可能是由其他的来管理网络,反正reboot正常就行

reboot

使用ip a检查是否网络正常。
由于系统内没有/etc/qemu-ifup,因此需手动补充一个文件。

[root@node01 ~]# cat /etc/qemu-ifup
#!/bin/bash
#This is a qemu-ifup script for bridging.
#You can use it when starting a KVM guest with bridge mode network.
#set your bridge name
switch=br0
if [ -n "$1" ]; then
    #create a TAP interface; qemu will handle it automatically.
    #tunctl -u $(whoami) -t $1
    #start up the TAP interface
    ip link set $1 up
    sleep 1
    #add TAP interface to the bridge
    brctl addif ${switch} $1
    exit 0
else
    echo "Error: no interface specified"
    exit 1
fi

chmod 777 /etc/qemu-ifup

由于我没装spice,以及qemu版本的原因,还需要对命令进行一定的改造。

/usr/libexec/qemu-system-x86_64 -name guest=dsm7.0,debug-threads=on \
    -machine pc-i440fx-5.0,accel=kvm,usb=off,dump-guest-core=off,mem-merge=off \
    -cpu host,host-cache-info=on,l3-cache=off \
    -m 2048 \
    -smp 2,sockets=1,cores=1,threads=2 \
    -uuid 4a16a603-7d79-453d-8b29-16451b986b9c \
    -no-user-config \
    -nodefaults \
    -rtc base=utc,driftfix=slew \
    -global kvm-pit.lost_tick_policy=delay \
    -no-hpet \
    -no-shutdown \
    -boot strict=on \
    -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x7.0x7 \
    -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x7 \
    -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x7.0x1 \
    -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x7.0x2 \
    -device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x5 \
    -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 \
    -drive file=/zfs0/qemu/dsm7/redpill-DS3615xs_7.0-41222_b1633594423.img,format=raw,if=none,id=drive-usb-disk2,cache=writeback \
    -device usb-storage,bus=usb.0,port=1,drive=drive-usb-disk2,id=usb-disk2,bootindex=1,removable=off,write-cache=on \
    -drive file=/zfs0/qemu/dsm7/vdisk1.img,format=raw,if=none,id=drive-scsi0-0-0-3,cache=writeback \
    -device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=3,drive=drive-scsi0-0-0-3,id=scsi0-0-0-3,write-cache=on \
    -netdev tap,id=hostnet0,ifname=vnet2 \
    -device virtio-net-pci,netdev=hostnet0,id=net0,mac=02:11:32:20:16:96,bus=pci.0,addr=0x3 \
    -device usb-tablet,id=input0,bus=usb.0,port=2 \
    -vnc 0.0.0.0:10 -k en-us -device VGA \
    -chardev socket,id=serial0,path=/tmp/520.serial0,server=on,wait=off -device isa-serial,chardev=serial0

调试

再新建个终端,使用minicom进行调试:

yum install minicom
minicom -D unix\#/tmp/520.serial0

有部分报错,只不过这个应该是我用的是virtio-scsi的原因,没有ahci控制器正常

还有个ext4这类的报错,大概和虚拟化无关,还是和引导的驱动优化有关。

其实还有个

virsh console ds3615 --safe

这个在第二期再说。


参考:
在 CentOS 7 / CentOS 8 上安装 Python 3.8
从源码编译Qemu的流程及简述
centos7下编译安装qemu5.0+spice-server最新版
VirtIO-GPU环境搭建与应用

最后修改:2021 年 11 月 07 日
如果觉得我的文章对你有用,请随意赞赏