如何在X86环境构建ARM镜像


1.不同系统内核版本升级

1.centos7系统内核升级

(1) yum安装方式

https://www.cnblogs.com/shenyuanhaojie/p/14384193.html

(2) rpm安装方式

https://developer.aliyun.com/packageSearch?word=kernel

官方出了新的内核版本之后,老的rpm包就不维护了,可以在阿里和清华的地址尝试找找

下载安装

wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.230-1.el7.elrepo.x86_64.rpm  ###主线版本
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.230-1.el7.elrepo.x86_64.rpm   ###主线版本开发包  
rpm -ivh kernel-lt-5.4.230-1.el7.elrepo.x86_64.rpm kernel-lt-devel-5.4.230-1.el7.elrepo.x86_64.rpm

查看系统可用内核,并设置内核启动顺序

sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg


选择引导项:需要使用哪个内核就指定哪个序号

grub2-set-default 0

重启

reboot

查看

uname -r

如果使用新内核系统有问题,可在系统启动时选择要回滚的内核版本,需要集成操作。

(3) 源码安装

https://www.kernel.org/

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.271.tar.xz

2.centos8系统内核升级

3.redhat7系统内核升级

Redhat7.2 升级内核

zpaas@10.10.176.30[/home/zpaas]$ uname -r
3.10.0-957.el7.x86_64
zpaas@10.10.176.30[/home/zpaas]$ cat /etc/os-release 
NAME="Red Hat Enterprise Linux Server"
VERSION="7.6 (Maipo)"
ID="rhel"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.6"
PRETTY_NAME="Red Hat Enterprise Linux Server 7.6 (Maipo)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7"
REDHAT_BUGZILLA_PRODUCT_VERSION=7.6
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="7.6"

4.redhat8系统内核升级

4.18的内核版本不需要升级

zoms@10.10.178.180[/home/zoms]$ cat /etc/os-release 
NAME="Red Hat Enterprise Linux"
VERSION="8.4 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.4"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.4 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8.4:GA"
HOME_URL="https://www.redhat.com/"
DOCUMENTATION_URL="https://access.redhat.com/documentation/red_hat_enterprise_linux/8/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.4
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.4"
zoms@10.10.178.180[/home/zoms]$ 
zoms@10.10.178.180[/home/zoms]$ 
zoms@10.10.178.180[/home/zoms]$ 
zoms@10.10.178.180[/home/zoms]$ uname -r
4.18.0-305.el8.x86_64

5.oracle linux7系统内核升级

内核下载网址1
内核下载网址2
Oracle Linux 7.9内核升级
oracle linux内核版本升级降级到指定版本

zoms@crms-10-10-179-179[/home/zoms]$ uname -r
3.10.0-1127.el7.x86_64
zoms@crms-10-10-179-179[/home/zoms]$ cat /etc/os-release 
NAME="Oracle Linux Server"
VERSION="7.8"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.8"
PRETTY_NAME="Oracle Linux Server 7.8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:7:8:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
ORACLE_BUGZILLA_PRODUCT_VERSION=7.8
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=7.8

查看已安装的内核版本

root@crms-10-10-179-185[/etc/yum.repos.d]# rpm -qa | grep kernel
kernel-headers-3.10.0-1127.el7.x86_64
kernel-devel-3.10.0-1127.el7.x86_64
kernel-uek-4.14.35-1902.300.11.el7uek.x86_64
kernel-tools-libs-3.10.0-1127.el7.x86_64
kernel-uek-devel-4.14.35-1902.300.11.el7uek.x86_64
kernel-3.10.0-1127.el7.x86_64
kernel-tools-3.10.0-1127.el7.x86_64

下载rpm包

wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR6/x86_64/getPackage/libdtrace-ctf-1.1.0-2.el7.x86_64.rpm
wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR6/x86_64/getPackage/kernel-uek-5.4.17-2136.308.9.el7uek.x86_64.rpm
wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR6/x86_64/getPackage/kernel-uek-devel-5.4.17-2136.308.9.el7uek.x86_64.rpm

先升级libdtrace-ctf:升级到5.4.17版本的内核需要libdtrace-ctf >= 1.1.01

rpm -Uvh libdtrace-ctf-1.1.0-2.el7.x86_64.rpm

升级内核版本

rpm -Uvh kernel-uek-5.4.17-2136.308.9.el7uek.x86_64.rpm kernel-uek-devel-5.4.17-2136.308.9.el7uek.x86_64.rpm

调整启动项

awk -F\' '$1=="menuentry " {print i++ " : " $2}'  /boot/grub2/grub.cfg

选择启动项

grub2-set-default 0

重启操作系统

shutdown -r now

6.oracle linux8系统内核升级

oracle linux 8 的内核版本很新,不需要升级

zpaas@sbtapp01[/zcm]$ uname -r
5.4.17-2102.201.3.el8uek.x86_64
zpaas@sbtapp01[/zcm]$ 
zpaas@sbtapp01[/zcm]$ cat /etc/os-release 
NAME="Oracle Linux Server"
VERSION="8.4"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="8.4"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Oracle Linux Server 8.4"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:8:4:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8"
ORACLE_BUGZILLA_PRODUCT_VERSION=8.4
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=8.4

2.qemu配置

2.1介绍

QEMU是一个通用的开源的跨平台仿真模拟器,提供user和system两种模式。其可以模拟在特定的体系结构下的应用的执行或者构建,比如在x86的体系结构的操作系统上运行ARM的应用。

2.2下载

需要的镜像

docker pull multiarch/qemu-user-static
docker pull arm64v8/ubuntu

注册qemu虚拟机

[root@c7-1 ~]#uname -m
x86_64
[root@c7-1 ~]#docker run --rm -t arm64v8/ubuntu uname -m
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
exec /usr/bin/uname: exec format error
[root@c7-1 ~]#
[root@c7-1 ~]#docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha
......
Setting /usr/bin/qemu-hexagon-static as binfmt interpreter for hexagon
[root@c7-1 ~]#
[root@c7-1 ~]#docker run --rm -t arm64v8/ubuntu uname -m
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
aarch64

其中docker run --rm --privileged multiarch/qemu-user-static --reset -p yes每台主机执行一次即可,这个操作同步完成了模拟器的部署和参数配置。
参数解释:
-p yes的含义就是将binfmt_misc的flags设置为F,这样就不需要将模拟器放到/usr/bin下,而是执行时自动判断。
--reset是统一重置,是新的处理模式,比一些旧帖子上的方法更健壮,而且可以重复执行
原理解释:
binfmt_misc是一种注册机制,用于将某些二进制格式的执行绑定到某一种解释器上,所有的指令就会调用解释器来进行运行。在X86上支持ARM,就是将ARM的文件格式绑定到了ARM模拟器上,这样执行ARM程序会自动调用模拟器,不会再出现exec format error这种错误了。所以理论上在主机上按照这个方法注册了ARM的格式后,这台主机就支持了运行任何的ARM程序了。
主机的binfmt_misc当flag为F的时候,表示模拟器解释器是固定挂载的而不是在/usr/bin下,也就避免了需要映射模拟器到容器内部(文件系统命名空间是隔离的)。4.10以上内核主机执行部署命令后应该如下:

$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64-static
flags: F
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff

报错处理

WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested

daemon.json添加 "experimental": true,

运行时添加 --platform linux/arm64 参数

[root@c7-1 ~]#docker run -itd --platform linux/arm64 --name ubuntu_arm arm64v8/ubuntu
9725d08781be46c6885fa3b79fbd75f49f27bab5e29d1e84891170c67e79b9a9
[root@c7-1 ~]#
[root@c7-1 ~]#docker ps -a
CONTAINER ID   IMAGE            COMMAND   CREATED              STATUS              PORTS     NAMES
9725d08781be   arm64v8/ubuntu   "bash"    About a minute ago   Up About a minute             ubuntu_arm

3.制作arm镜像

3.1制作nginx arm镜像

Dockerfile

FROM arm64v8/centos:7
MAINTAINER zcm
ENV TIME_ZOME=Asia/Shanghai
ENV NGINX_VERSION=1.23.3
WORKDIR /usr/local/nginx/
RUN yum -y install readline-devel pcre-devel bind-utils openssl-devel zlib-devel telnet gcc gcc-c++ perl make kernel-headers kernel-devel curl wget postgresql-devel net-tools vim lsof lrzsz tree && \
    useradd -M -s /sbin/nologin nginx && \ 
    wget http://nginx.org/download/nginx-1.23.3.tar.gz && \
    tar zxvf nginx-1.23.3.tar.gz && \
    cd nginx-1.23.3 && \
    ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module && \
    make -j 4 && \
    make install
ENV PATH=/usr/local/nginx/sbin:$PATH
ENV export PATH
EXPOSE 80
EXPOSE 443
CMD ["nginx","-g","daemon off;"]
docker build -t nginx_1.23.3_arm:D20230205 .


运行

[root@c7-1 ~/nginx]#docker run -itd --platform linux/arm64 --name nginx-test -P nginx_1.23.3_arm:D20230205
404639e4386501800cb8c5d604b02aec7340d5eac36d4208cac5fb3a0b385bc5
[root@c7-1 ~/nginx]#docker ps -a | grep nginx
404639e43865   nginx_1.23.3_arm:D20230205   "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds       0.0.0.0:32769->80/tcp, :::32769->80/tcp, 0.0.0.0:32768->443/tcp, :::32768->443/tcp   nginx-test

https://dev.iwhalecloud.com/doc/bidB/didc7E9wm
centos7编译升级内核至4.X
CentOS7升级内核的三种方式(yum/rpm/源码)
清华大学内核源码包
https://mirrors.edge.kernel.org/pub/linux/kernel/
https://elrepo.org/linux/kernel/el7/x86_64/RPMS/
http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/
利用x86机器编译支持arm架构的docker镜像


posted @ 2023-02-02 09:06  公博义  阅读(1044)  评论(0编辑  收藏  举报