archlinux 从 x86 主机构建 ARM容器
archlinux 从 X86 主机构建 arm容器
前言
编写 dart 程序的初衷就是希望在 x86 平台上编译 arm 应用
首先的初衷就是需要一个 arm 的交叉编译环境
所以本章节的目的就是要在 x86 宿主机上运行 arm 容器,为编译 dart 应用做铺垫
参考资料
building-arm-container-on-x86
cross-building-from-x64-to-arm64
dockerhub qemu-user-static
add-user-to-docker-group-ubuntu/
docker experimental features
qemu-user-static
主要步骤
前期准备
// 本人使用 endeavourOS(arch) 作为操作系统
> screenfetch
+I+ su@su-emdwxx
+777+ OS: EndeavourOS rolling rolling
+77777++ Kernel: x86_64 Linux 6.15.2-arch1-1
+7777777++ Uptime: 2h 20m
+7777777777++ Packages: 1391
++7777777777777++ Shell: zsh 5.9
++777777777777777+++ Resolution: 2560x3120
++77777777777777777++++ DE: KDE
++7777777777777777777++++ WM: KWin
+++777777777777777777777++++ GTK Theme: Breeze-Dark [GTK2], Breeze [GTK3]
++++7777777777777777777777+++++ Icon Theme: Tela-dark
++++77777777777777777777777+++++ Disk: 211G / 770G (29%)
+++++777777777777777777777777+++++ CPU: 11th Gen Intel Core i5-11300H @ 8x 4.4GHz [52.0°C]
+++++++7777777777777777++++++ GPU: Mesa Intel(R) Iris(R) Xe Graphics (TGL GT2)
+++++++++++++++++++++++++++++ RAM: 8525MiB / 15771MiB
+++++++++++++++++++++++++++
// ---------------
// 首先开启 docker 的实验性功能
> sudo mkdir /etc/docker
> sudo mkdir /etc/docker/daemon.json
// 在 daemon.json 中传入内容
> sudo > cat daemon.json << EOF
{
"experimental": true
}
EOF
// 重启 docker 服务
> sudo systemctl daemon-reload
> sudo systemctl restart docker
// 如果该命令返回 true 即为实验性功能成功开启
> docker version -f '{{.Server.Experimental}}'
true
// 至此, docker 实验性功能成功开启
// -----------------
// 将 docker 加入 sudo 组中,这样就能够顺利添加 docker 组件了(比如说跨平台构建 buildx 虽然在本文中并不需要)
// 确认是否存在 docker 组
> grep docker /etc/group
docker:x:956
// 很幸运,本机存在 docker 组
// 将当前用户加入 docker 组
> sudo usermod -aG docker ${USER}
> sudo systemctl daemon-reload
> sudo systemctl restart docker
// 然后重启一下电脑,按下不表
// 查看一下是否正确加入组中
> grep docker /etc/group
docker:x:956:su
> whoami
su
// 成功加入组
// --------------
// 安装 buildx, 下面命令是 autojump 的命令,感兴趣可自己去查查看
> j down
// 注意下面命令,重点是 github 里 buildx 的最新 release 只是截止 20250612 是这个 url 而已
> wget https://github.com/docker/buildx/releases/download/v0.25.0-rc1/buildx-v0.25.0-rc1.linux-amd64
> mkdir ~/.docker
> mkdir ~/.docker/cli-plugins
> mv ./buildx-v0.25.0-rc1.linux-amd64 ~/.docker/cli-plugins/
> mv ~/.docker/cli-plugins/buildx-v0.25.0-rc1.linux-amd64 ~/.docker/cli-plugin/docker-buildx
> docker pull docker-pull.ygxz.in/plugins/buildx
> docker buildx
Extended build capabilities with BuildKit
Usage: docker buildx [OPTIONS] COMMAND
Extended build capabilities with BuildKit
Options:
--builder string Override the configured builder instance
-D, --debug Enable debug logging
Management Commands:
history Commands to work on build records
imagetools Commands to work on images in registry
Commands:
bake Build from a file
build Start a build
create Create a new builder instance
dial-stdio Proxy current stdio streams to builder instance
du Disk usage
inspect Inspect current builder instance
ls List builder instances
prune Remove build cache
rm Remove one or more builder instances
stop Stop builder instance
use Set the current builder instance
version Show buildx version information
Run 'docker buildx COMMAND --help' for more information on a command.
Experimental commands and flags are hidden. Set BUILDX_EXPERIMENTAL=1 to show them.
> podman buildx
Build images
Description:
Build images
Usage:
podman buildx [command]
Aliases:
buildx, builder
Available Commands:
build Build an image using instructions from Containerfiles
prune Remove unused images
version Print build version
Error: missing command 'podman buildx COMMAND'
// 至此,docker 与 podman 的 buildx 插件都安装完毕
构建 arm 容器
本人倾向于使用 podman 故敲入如下命令
// 这是我本机下载的依赖,与本次有关的只有
// qemu-system-aarch64 10.0.0-5
// qemu-system-arm 10.0.0-5
// qemu-system-arm-firmware 10.0.0-5
// qemu-system-x86 10.0.0-5
// qemu-system-x86-firmware 10.0.0-5
// qemu-user-binfmt 10.0.0-5
// qemu-user-static 10.0.0-5
// 但是我还是建议你全装了吧,以后要装 virtManager 模拟 ARM 虚拟机的时候会用上的
> sudo pacman -Q|grep qemu
qemu-audio-alsa 10.0.0-5
qemu-audio-dbus 10.0.0-5
qemu-audio-jack 10.0.0-5
qemu-audio-oss 10.0.0-5
qemu-audio-pa 10.0.0-5
qemu-audio-pipewire 10.0.0-5
qemu-audio-sdl 10.0.0-5
qemu-audio-spice 10.0.0-5
qemu-base 10.0.0-5
qemu-block-curl 10.0.0-5
qemu-block-dmg 10.0.0-5
qemu-block-nfs 10.0.0-5
qemu-block-ssh 10.0.0-5
qemu-chardev-spice 10.0.0-5
qemu-common 10.0.0-5
qemu-desktop 10.0.0-5
qemu-hw-display-qxl 10.0.0-5
qemu-hw-display-virtio-gpu 10.0.0-5
qemu-hw-display-virtio-gpu-gl 10.0.0-5
qemu-hw-display-virtio-gpu-pci 10.0.0-5
qemu-hw-display-virtio-gpu-pci-gl 10.0.0-5
qemu-hw-display-virtio-gpu-pci-rutabaga 10.0.0-5
qemu-hw-display-virtio-gpu-rutabaga 10.0.0-5
qemu-hw-display-virtio-vga 10.0.0-5
qemu-hw-display-virtio-vga-gl 10.0.0-5
qemu-hw-display-virtio-vga-rutabaga 10.0.0-5
qemu-hw-uefi-vars 10.0.0-5
qemu-hw-usb-host 10.0.0-5
qemu-hw-usb-redirect 10.0.0-5
qemu-hw-usb-smartcard 10.0.0-5
qemu-img 10.0.0-5
qemu-system-aarch64 10.0.0-5
qemu-system-arm 10.0.0-5
qemu-system-arm-firmware 10.0.0-5
qemu-system-x86 10.0.0-5
qemu-system-x86-firmware 10.0.0-5
qemu-ui-curses 10.0.0-5
qemu-ui-dbus 10.0.0-5
qemu-ui-egl-headless 10.0.0-5
qemu-ui-gtk 10.0.0-5
qemu-ui-opengl 10.0.0-5
qemu-ui-sdl 10.0.0-5
qemu-ui-spice-app 10.0.0-5
qemu-ui-spice-core 10.0.0-5
qemu-user 10.0.0-5
qemu-user-binfmt 10.0.0-5
qemu-user-static 10.0.0-5
qemu-vhost-user-gpu 10.0.0-5
// 下载交叉编译链依赖
> pacman -Q |grep aarch64
aarch64-linux-gnu-binutils 2.43-1
aarch64-linux-gnu-gcc 14.2.0-1
aarch64-linux-gnu-glibc 2.41-1
aarch64-linux-gnu-linux-api-headers 6.12-1
edk2-aarch64 202411-1
qemu-system-aarch64 10.0.0-5
// 注册 qemu-user-static
// --rm 运行完后就删除容器
// --privileged arm 下的特权模式
// docker-pull.ygxz.in/ 是 docker 的镜像加速站点
> docker run --rm --privileged docker-pull.ygxz.in/multiarch/qemu-user-static --reset -p yes
> podman run --rm --privileged docker-pull.ygxz.in/multiarch/qemu-user-static --reset -p yes
// 测试是否能够运行 ARM 容器
> docker run --platform=linux/arm64/v8 --rm -t docker-pull.ygxz.in/arm64v8/ubuntu uname -m
aarch64
> podman run --platform=linux/arm64/v8 --rm -t docker-pull.ygxz.in/arm64v8/ubuntu uname -m
aarch64
// 至此,已经能够成功运行 ARM 容器了

浙公网安备 33010602011771号