CentOS编译配置

新机配置

  1. 永久关闭selinux防火墙,解决虚拟机启动,报错无权限
cat /etc/sysconfig/selinux
SELINUX=disabled 
  1. 访问qemu使用root权限,解决虚拟机启动报错,无权限使用kvm模块
cat /etc/libvirt/qemu.conf 
user = "root"
group = "root"
  1. 指定启动qemu时的环境变量
cat /etc/sysconfig/libvirtd
LD_LIBRARY_PATH="/usr/local/lib64:/usr/local/lib"
  1. 放开qemu生成core文件的权利,解决qemu crash无法生成core文件问题
libvirt配置文件/etc/libvirt/qemu.conf设置如下属性
max_core = "unlimited"
设置core文件大小无限制
ulimit -c unlimited
设置core文件路径
echo "/var/crash/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
持久化设置, /etc/sysctl.conf增加如下配置
kernel.core_pattern = /var/crash/core-%e-%p-%t
测试是否生成core文件,这里kill掉自己的终端进程
kill -SIGSEGV  $$
  1. 持久化设置应用程序crash路径
cat>>/etc/rc.local<<EOF
echo "/home/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
EOF
  1. 网卡dhcp配置,网线接家里的路由器,路由器接移动的入户光猫
HWADDR=30:9C:23:E3:E2:07
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_PRIVACY=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp2s0
UUID=a1153c96-4923-3638-ba0e-7c65fd849013
ONBOOT=yes
USERS=root
NM_CONTROLLED=no
  1. virsh edit 命令报Not an editor command错误,默认使用的vi命令,规避办法
mv /usr/bin/vi /usr/bin/vi.bak
ln -s /usr/bin/vim /usr/bin/vi
  1. 配置dia画图软件支持中文输入
find /usr/ -name dia.desktop
/usr/share/applications/dia.desktop

vim /usr/share/applications/dia.desktop
Exec=env GTK_IM_MODULE=xim  dia --integrated %F
  1. 允许所有ssh的客户端访问本机
echo "sshd: ALL" >> /etc/hosts.allow
systemctl restart sshd
  1. 设置迁移两端免密
a. 查看目的端权限认证文件是否禁止修改,i权限表示不可修改
# lsattr /root/.ssh/authorized_keys
----i----------- /root/.ssh/authorized_keys
b. 取消禁止修改权限
chmod -i /root/.ssh/authorized_keys
c. 免密
ssh-copy-id root@192.168.100.58 -p 10000
  1. 设置grub启动选项
grub2-editenv list
grub2-reboot "CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)"		/* 下次启动时使用此选项,不持久化 */
grub2-set-default "CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)"	/* 每次启动使用该选项,持久化 */
grub2-set-default " centos-20200528003245-5.6.0-rc2+"
注:grub2-set-default命令后面接选项ID,CentOS7/boot/grub2/grub/grub.cfg获取;通过CentOS8通过/boot/loader/entries/xxx.conf获取
如果grub2-set-default不生效,可以尝试编辑grub.cfg中的default选项,从0开始计数
  1. 内核启动参数grub文件
CentOS7:/boot/grub2/grubenv
CentOS8:/boot/efi/EFI/centos/grubenv
  1. yum配置
1) 使用现有的repo文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
yum makecache
yum repolist
yum list

2) 安装repo包自动配置
安装第三方开发包
yum install -y epel-release 
安装虚拟化相关包
yum install -y centos-release-advanced-virtualization
单独配置yum仓库,以配置ovirt仓库为例,这个仓库可以安装openvswitch的包
[centos-ovirt]
name=CentOS-$releasever - ovirt
baseurl=http://mirror.centos.org/$contentdir/$releasever/virt/$basearch/ovirt-4.4/
gpgcheck=0
enabled=1
  1. 基本开发工具、文档安装及自动补全
yum groupinstall "Development Tools"
yum install -y man-pages
yum install -y bash-completion
  • centos上电后ip未获取到无法连接网络
dhclient enp2s0
  1. 升级python-3.8
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.12
./configure --enable-optimizations
make altinstall
  1. centos配置网易126发件服务器
    在这里插入图片描述
安装邮件收发工具
yum install -y postfix
设置sendmail工具配置文件,填写要使用的邮件地址,发件服务器地址,客户端授权码
echo "set from=newfriday@126.com smtp=smtp.126.com smtp-auth-user=newfriday@126.com smtp-auth-password=客户端授权码 smtp-auth=login " >> /etc/mail.rc
使用sendmail工具发送邮件,通过126邮箱向qq邮箱发送邮件
echo "this is a test" > test.txt
mail -s "test" 987246510@qq.com <./test.txt
  1. 配置主机NAT转发
    host: 172.23.73.76(外网),192.168.0.1(内网)
    guest: 192.168.0.2
  • host添加NAT规则
    自动获取eno1的IP地址,将所有来自192.168.0.0的包的源IP伪装成eno1的IP地址发送出去
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eno1 -j MASQUERADE
    或者将所有来自192.168.0.0的包的源IP伪装成172.23.73.76发送出去
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eno1 -j SNAT --to 172.23.73.76
  • host查询dnserver供guest使用,地址为172.16.40.114
    nslookup www.baidu.com或者dig | grep SERVER
  • guest添加默认路由和DNS服务器:
    GATEWAY=192.168.0.1;DNS1=172.16.40.114
  1. centos邮箱配置
yum install -y thunderbird

搜索thunderbird应用并配置服务器
在这里插入图片描述

内核模块编译

  • 创建ko_makefile,输入如下内容
obj-m	+= kvm.o
obj-m	+= kvm-intel.o
obj-m	+= kvm-amd.o

KDIR ?= /lib/modules/$(shell uname -r)/build

KVMDIR ?= /path/to/kernel_source/arch/x86/kvm

all:
	make -j60 -C $(KDIR) M=$(KVMDIR) modules
clean:
	make -C $(KDIR) M=$(KVMDIR) clean
  • make -f ko_makefile

内核工具编译

  • 编译perf工具
    make -C tools/perf/

虚拟化核心组件编译

Libvirt

  • Libvirt的最新版本为7.0.0,比较高,使用centos 7编译可能会出一系列问题,这里使用docker下载centos 8编译。编译基于libvirt源码,最终的目标是生成rpm包
1. yum install -y docker && systemctl start docker && systemctl enable docker
2. docker pull centos 	下载centos最新(tag: latest)的镜像
3. docker run -itd --name=build_libvirt_env --privileged=true --user=root -w /home -v /home:/home centos:latest bash	后台启动docker容器
4. docker attach build_libvirt_env		进入docker容器
5. yum groupinstall "Development Tools" 	安装基本开发组件
6. yum install -y yum-utils 	安装yum基本工具并检查各个repo的enable开关是否打开,方便后续步骤中开启
7. wget https://mirrors.aliyun.com/centos-vault/centos/8/virt/Source/advanced-virtualization/libvirt-6.6.0-7.1.el8.src.rpm 	下载源码包
8. rpm2cpio libvirt-6.6.0-7.1.el8.src.rpm |cpio -i libvirt.spec		解析其中的spec文件
9. yum-builddep libvirt.spec		安装编译libvirt需要的rpm包
10. 如果rpm无法安装完成,进入https://pkgs.org/查询对应源码包所在的mirror,如果mirror已在默认的repo配置中,检查是否使能,如果不在则添加
11. 重复步骤8和步骤9直到yum-builddep完全安装完libvirt包的编译依赖,其中必须要做的是使能PowerTools源并添加centos-8-AppStream源。编译基本依赖报以及meson工具升级需要。源网址见下方。
12. git clone git@github.com:libvirt/libvirt.git 下载libvirt源码包
13. git submodule update 更新子模块
14. yum install -y meson && meson build		配置libvirt,如果失败报错需要特性版本的包,重复步骤8和步骤9
15. yum install ninja-build && ninja -C build	源码编译libvirt,但因为是在容器中,因此必须生成rpm包才行,因此meson编译的主要目的是检查libvirt编译是否正常并生成libvirt.spec文件
16. find . -name libvirt.spec	meson编译系统会默认生成编译rpm包的spec文件,如果没有找到,在meson.build的最后添加下面两句话,重复步骤12,13
    rpm = import('rpm')
    rpm.generate_spect_template()
17. tar --format=posix -chf - libvirt-$VERSION | XZ_OPT="-v -T0 --e" xz -c >libvirt-$VERSION.tar.xz 	  
    spec文件生成后,将libvirt源码包以libvirt-{version} 形式命名并打包,修改spec文件中的Version字段和VERSION相同
18. 使用rpmbuild工具编译打包libvirt源码,生成rpm包,脚本见下方连接
19. docker commit {container_id} mycentos:latest	最后,持久化编译过程中安装的新包,生成新的centos镜像,下一次从该镜像启动容器

build_script
8-stream PowerTools
8-AppStream

  • 快速源码编译libvirt执行测试套件并安装
mkdir builddir
meson builddir
meson setup --reconfigure build -Ddriver_qemu=enabled -Ddriver_libvirtd=enabled -Ddriver_remote=enabled /* 配置编译选项,参考meson_options.txt */
meson configure --prefix=/usr/local		/* 设置libvirt安装目录 */
ninja -C builddir						/* 编译 */
ninja -C builddir test					/* 运行libvirt测试例 */
ninja -C builddir uninstall				/* 卸载原来的libvirt */
ninja -C builddir install					/* 安装编译好的libvirt */

QEMU

  • QEMU编译相对简单,较低版本的qemu(如2.12)执行源码目录下./configure然后make即可,上游新版本QEMU使用了meson工具编译,配置QEMU时需要下载各模块代码,包括meson。如果主机meson工具版本较低,可以直接使用QEMU源码meson目录下的meson.py脚本
git clone git://git.qemu.org/qemu.git 			/* 下载源码 */
git submodule update --init						/* 更新qemu子模块,会用到meson编译工具,后续使用git submodule update更新子模块 */
yum install -y ninja-build	&& yum-builddep -y qemu 		/* 安装编译工具和编译依赖包 */

cat>>qemu-conf.sh<<EOF
#!/bin/bash
# export gcc env
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
export DISTRO_LIBDIR=/usr/local/lib64

# compile
cd build
../configure --prefix=/usr \
            --target-list="x86_64-softmmu" \
            --enable-debug-info \
            --disable-rbd \
            --disable-spice \
            --disable-strip \
            --disable-gnutls \
            --disable-vnc-png \
            --disable-nettle \
            --disable-gcrypt \
            --enable-debug \
            --enable-modules \
            --enable-fdt \
            --disable-virglrenderer \
            --with-git-submodules=ignore \
            --enable-trace-backends="log"
make -j$(nproc --ignore=1)
EOF
mkdir build && chmod +x qemu-conf.sh
./qemu-conf.sh								/* 编译 */
cd build && make install					/* 安装 */
qemu-system-x86_64 --version				/* 查看qemu版本 */
  • 注意:QEMU编译完成后如果使用qemu-system-x86_64 --version可以查看到版本信息,但启动虚机时报错无法加载bios-256k.bin,这是因为QEMU运行虚机时需要先到安装目录加载bios固件,如果新老固件不兼容,就会有这个报错。需要将源码下pc-bios目录下的固件拷贝到QEMU安装目录下。

Openvswitch

  • 下载openvswitch发行版源码包并安装,提取spec文件
wget https://ftp.redhat.com/pub/redhat/linux/enterprise/7Server/en/RHEV/SRPMS/openvswitch2.11-2.11.3-89.el7fdp.src.rpm
rpm -ivh openvswitch2.11-2.11.3-89.el7fdp.src.rpm 
cd /root/rpmbuild/SPECS
yum-builddep -y openvswitch2.11.spec
  • 下载openvsiwtch源码并编译
git clone https://github.com/openvswitch/ovs.git
cd ovs
./boot.sh
./configure
make -j

Kernel

  • Kernel编译可能需要高版本gcc,首先源码编译gcc,以gcc-7.5.0为例
a. 下载gcc源码:wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.5.0/gcc-7.5.0.tar.xz -t 1000
b. 安装编译高版本gcc的开发包:yum-builddep gcc && yum install -y mpfr-devel.x86_64 libmpc-devel.x86_64 gpm-devel.x86_64
c. 解压并进入源码目录,配置gcc源码:./configure --disable-multilib --prefix="/usr/local"
d. 编译gcc:make -jN	/* 编译时可能遇到gcc编译程序OOM的问题,尝试使用一个cpu编译 */
e. 安装gcc到本地目录,防止和原有gcc冲突:make install
f. 指定编译内核时使用的环境变量
cat>>GCC_ENV<<EOF
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
export DISTRO_LIBDIR=/usr/local/lib64
EOF
f. 编译内核时指定使用高版本gcc编译工具:source GCC_ENV
  • kernel从src.rpm源码包中编译,必须配置vault源才能下载源码http://vault.centos.org/
a yumdownloader --source kernel
b yum-builddep kernel
c rpm -ivh --root=`pwd` kernel.src.rpm
d rpmbuild -bb SPECS/kernel.spec --define "_topdir $(pwd)"
  • kernel从rpm包中的源码编译
1)rpm包编译之后,拷贝出BUILD下的kernel源码,作为单独的源码目录
a 配置内核选项
make menuconfig
b 编译内核
make -j "$(lscpu  |grep '^CPU(s):' | awk '{print $2}')"
c 单独编译所有模块
make modules -j "$(lscpu  |grep '^CPU(s):' | awk '{print $2}')"

2)编译制作内核镜像
a 单独编译bzImage镜像
make bzImage -j "$(lscpu  |grep '^CPU(s):' | awk '{print $2}')"
  • kernel从开源库中的源码编译安装
1)下载开源内核包,断点续传
mkdir kernel && cd kernel
git init
git remote add origin https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
while true; do git fetch origin ; done
2)使用虚机当前内核的配置文件按编译配置内核源码
cp  /boot/config-4.18.0-147.el8.x86_64 /path/to/kernel/.config
make -j10
make modules
make modules_install
make install

注:编译过程中如果遇到签名问题,需要注释掉CONFIG_SYSTEM_TRUSTED_KEYS配置,变成CONFIG_SYSTEM_TRUSTED_KEYS=""

  • 安装glib及开发应用
1) 安装glib库和开发包
yum install -y glib2 glib2-devel 
2) 查看编译glib2需要引用的头文件和库文件
[root@hy glib_event]# pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include 
[root@hy glib_event]# pkg-config --libs glib-2.0
-lglib-2.0
3) 编译应用
gcc -o demo demo.c  `pkg-config --cflags --libs glib-2.0`
  • 安装glibc,glib2 调试信息
debuginfo-install glib2-2.56.1-2.el7.x86_64 glibc-2.17-222.el7.x86_64 pcre-8.32-17.el7.x86_64
/usr/src/debug/glib-2.56.1/

嵌套虚拟化

基本配置

  • 修改kvm-intel内核模块加载参数,使用modprobe重新加载kvm-intel使之生效
[root@hy ~]# cat /etc/modprobe.d/kvm-nested.conf 
options kvm-intel nested=1
options kvm-intel enable_shadow_vmcs=1
options kvm-intel enable_apicv=1
options kvm-intel ept=1
  • 虚机xml中cpu配置host-passthrough模式,让虚机与主机共享同样的cpu特性
<cpu mode='host-passthrough'/>

网络配置

  • 开源libvirt服务启动后默认会创建一个default网络,关联一个virtbr0的桥,负责nat转发,如下:
[root@hy ~]# virsh net-dumpxml default 
<network>
  <name>default</name>
  <uuid>66f5d351-3e08-4a52-9973-9eeeb8e68deb</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:4c:9e:9e'/>
  <ip address='192.168.124.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.124.2' end='192.168.124.254'/>
    </dhcp>
  </ip>
</network>
  • 虚拟机启动后,可以将其网卡桥接到该网络关联的virbr0桥上,这样虚机内部也可以上外网,同时虚机网络的IP由default网络通过dhcp自动分配,虚机网络配置如下:
    <interface type='bridge'>
      <mac address='24:42:53:21:5b:45'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
    </interface>
  • 如果想要两个虚机作为迁移的的主机做测试,需要两个虚机互相ping通,并且将迁移的端口开放,对于centos8,可以关掉防火墙,否则就算两个虚机能够ping通,但是tcp连接也会被禁止,telnet也无法连接:
systemctl stop  firewalld.service 

开源patch提交

  • 这里使用git send-email工具提交patch
1. yum install -y git-email	git的send-email工具和git不在一个包,需要单独安装
2. git format-patch -3  --cover-letter --subject-prefix="RFC v1"  生成当前往后3个commit的patch,--cover-letter生成概述的patch,可以手动编辑描述补丁的总体功能,对于patch较多的场景有用。--subject-prefix是每个补丁title前的前缀,RFC(Request For Comments)表示请求评审。
3. 配置git的邮箱信息,编辑~/.gitconfig如下:
[user]
	email = newfriday@126.com
	name = Hyman
/* 以下信息可以根据邮箱的服务器信息填写 */
[sendemail]
    from = newfriday@126.com
    smtpserver = smtp.126.com
    smtpuser = newfriday@126.com
    smtpencryption = ssl
    /* 对于126邮箱,此密码为第三方工具登录密码,需要自己到邮箱设置中申请
     * 邮箱密码是动态。每申请一次会变。对于大多数其它邮箱。可以直接使用邮箱密码 */
    smtppass = {passwd}
    smtpserverport = 465
4. ./scripts/get_maintainer.pl -f {patch-related-file}	对于qemu可以根据该脚本确定maintainer,在发送邮件时抄送给他。比如softmmu/vl.c的维护者是Paolo Bonzini <pbonzini@redhat.com> (maintainer:Main loop)。libvirt没有此说法。
5. ./scripts/checkpatch.pl {patch-file} 对于qemu在提交补丁之前需要提前检查是否有明显的语法错误。
6. 依序发送补丁系列:
   git send-email 0000-cover-letter.patch --to "<libvir-list@redhat.com>" --cc "Paolo Bonzini <pbonzini@redhat.com>" --cc "Daniel P. Berrangé <berrange@redhat.com>" --cc "Bruce Rogers <brogers@suse.com>" --cc "Peter Krempa <pkrempa@redhat.com>" --cc "Ján Tomko <jtomko@redhat.com>" --cc "peterx<peterx@redhat.com>" --cc "Hyman<huangy81@chinatelecom.cn>"
   git send-email 0001-XXX.patch --to "<libvir-list@redhat.com>" --cc "Paolo Bonzini <pbonzini@redhat.com>" --cc "peterx<peterx@redhat.com>"
7. qemu补丁类似:
   git send-email 0001-MAINTAINERS-Fix-tests-migration-maintainers.patch --to "qemu-devel <qemu-devel@nongnu.org>" --cc "Eric Blake <eblake@redhat.com>" --cc "Philippe Mathieu-Daudé <philmd@redhat.com>" --cc "Eduardo Habkost <ehabkost@redhat.com>" --cc "Cleber Rosa <crosa@redhat.com>"
8. 补丁被评审给出意见后需要及时回复,可以安装thunderbird邮箱客户端。并在账户设置的通讯录菜单中,取消'以HTML格式编写消息'的勾选项。采用纯文本回复。thunderbird回复的邮件会自动将原邮件内容右移,邮件中的修改更加清晰。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

享乐主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值