目前大众主要是使用的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环境搭建与应用
版权属于:寒夜方舟
本文链接:https://www.wnark.com/archives/173.html
本站所有原创文章采用署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)。 您可以自由地转载和修改,但请注明引用文章来源和不可用于商业目的。声明:本博客完全禁止任何商业类网站转载,包括但不限于CSDN,51CTO,百度文库,360DOC,AcFun,哔哩哔哩等网站。