用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
发布时间:2026/9/27 3:35:28来源:尧图网络
(本文使用 AI 辅助创作)VirtualBox 是一个好用且开源的跨平台虚拟机软件, 支持在 GNU/Linux, Windows 等操作系统上运行虚拟机, 并且有方便操作的界面.类似的虚拟化软件比如 QEMU/KVM 只支持在 Linux 上运行, 而 VirtualBox 还支持 Windows, 这是一个明显的优点.本文给出自己从源代码编译 VirtualBox (在 ArchLinux 上运行) 的具体过程. 为了使编译尽量简单: (1) 借用 ArchLinux 官方的编译脚本 (类似 AUR). (2) 整个编译过程在容器(podman) 中进行.这里是 (希望消除 稀缺 的) 穷人小水滴, 专注于 穷人友好型 低成本技术. (本文为 98 号作品. )相关文章:《在 VirtualBox 虚拟机中安装 Fedora CoreOS 操作系统》 https://blog.csdn.net/secext2022/article/details/151294108《离线安装 ArchLinux 操作系统 (DVD 光盘)》 https://blog.csdn.net/secext2022/article/details/162372435《在容器 (podman) 中运行虚拟机 (QEMU/KVM, libvirt)》 https://blog.csdn.net/secext2022/article/details/141649543《Linux 内核 BUG: Android 手机 USB 网络共享 故障》 https://blog.csdn.net/secext2022/article/details/147196246《低功耗低成本 PC (可更换内存条) 推荐 (笔记本, 小主机)》 https://blog.csdn.net/secext2022/article/details/146135064参考资料:https://www.virtualbox.org/wiki/Downloadshttps://gitlab.archlinux.org/archlinux/packaging/packages/virtualboxhttps://wiki.archlinux.org/title/Arch_User_Repositoryhttps://wiki.archlinux.org/title/Podmanhttps://podman.io/https://aur.archlinux.org/https://github.com/fm-elpac/build-vbox-arch目录1 准备工作2 实际编译3 测试运行4 总结与展望附录 1 github actions 自动化编译1 准备工作首先, 安装所需软件, 比如:podman--versionpodmanversion6.1.2git--versiongitversion2.55.0下载 VirtualBox 编译脚本 (ArchLinux 官方的PKGBUILD):gitclone --single-branch--depth1https://gitlab.archlinux.org/archlinux/packaging/packages/virtualbox.git为了避免 每次编译重复下载VirtualBox 源代码, 我们提前下载源码包:mkdir-poutcdoutcurl-Ohttps://download.virtualbox.org/virtualbox/7.2.20/VirtualBox-7.2.20.tar.bz2提前拉取 ArchLinux (基础) 容器镜像:podmanpull library/archlinux:base-devel虽然, 在国内拉取容器镜像比较麻烦 (你懂得), 但是啊, 只要思想不滑坡, 办法总比困难多, 努努力还是可以做到的:podmanimages REPOSITORY TAG IMAGE ID CREATED SIZE localhost/archlinux base-devel 3ed18d5c7b243days ago967MB2 实际编译文件build-vbox-arch/build.sh:#!/usr/bin/env bash# build-vbox-arch/build.shset-euopipefail# PKGBUILDcp-r/build/virtualbox /build/tmp/virtualbox# 源码包cp/build/out/VirtualBox-7.2.20.tar.bz2 /build/tmp/virtualbox# TODO patch# DEBUGecho!!! /build/tmp/virtualbox/PKGBUILDcat/build/tmp/virtualbox/PKGBUILD# 修复 编译报错:# /build/tmp/virtualbox/src/VirtualBox-7.2.16/src/VBox/Runtime/common/misc/buildconfig.cpp:49:5: error: return-statement with no value, in function returning ‘uint32_t’ {aka ‘unsigned int’} [-fpermissive]# 49 | return IPRT_BLDCFG_SCM_REV;# | ^~~~~~# kmk: *** [/build/tmp/virtualbox/src/VirtualBox-7.2.16/kBuild/footer-pass2-compiling-targets.kmk:277: /build/tmp/virtualbox/src/VirtualBox-7.2.16/out/linux.amd64/release/obj/RuntimeBldProg/common/misc/buildconfig.o] Error 1rm-rf/build/tmp/virtualbox/.git# 开始编译echo!!! building .. .chown-Rbuilder:builder /build/tmp/virtualbox/subuilder-ccd /build/tmp/virtualbox/ makepkg -s --noconfirm# 编译结果cp/build/tmp/virtualbox/*.pkg.tar.zst /build/out文件build-vbox-arch/Dockerfile:# build-vbox-arch/Dockerfile FROM archlinux:base-devel WORKDIR /build # 国内镜像 RUN echo Server https://mirrors.pku.edu.cn/archlinux/\$repo/os/\$arch /etc/pacman.d/mirrorlist # 安装依赖 RUN pacman -Syu --noconfirm \ pacman -S --needed --noconfirm git # (archlinux) PKGBUILD # git clone --single-branch --depth1 https://gitlab.archlinux.org/archlinux/packaging/packages/virtualbox.git COPY virtualbox virtualbox # 安装 makedepends RUN bash -c source virtualbox/PKGBUILD pacman -S --needed --noconfirm ${makedepends[]} # 创建 编译用户 RUN useradd -m builder \ echo builder ALL(ALL) NOPASSWD: ALL /etc/sudoers.d/builder # 编译脚本 COPY build.sh . # 容器挂载目录 RUN chmod x build.sh \ mkdir -p /build/tmp \ mkdir -p /build/out ENTRYPOINT [/build/build.sh] # podman run --rm -v $PWD/tmp:/build/tmp -v $PWD/out:/build/out -v $PWD/build.sh:/build/build.sh build-vbox-1首先制作 基础容器镜像:podmanbuild-tbuild-vbox-1.这个容器镜像会打包编译所需的所有依赖:podmanimages REPOSITORY TAG IMAGE ID CREATED SIZE localhost/build-vbox-1 latest 489541af479245seconds ago2.26GB localhost/archlinux base-devel 3ed18d5c7b243days ago967MB然后开始 实际编译:podmanrun--rm-v$PWD/tmp:/build/tmp-v$PWD/out:/build/out-v$PWD/build.sh:/build/build.sh build-vbox-1硬件: 小主机 GMK M5 (CPU r7-5825u, 8 核 16 线程, 15W 功耗, 内存 DDR4-3200 双通道).16GB 内存 用于编译应该是够用的, 编译用时约 33 分钟, 总的磁盘占用约 8.7 GB.编译结果:cdoutls-l-rw-r--r--1s2 s2701961739月25日23:06 virtualbox-7.2.20-1-x86_64.pkg.tar.zst -rw-r--r--1s2 s22560730769月25日22:14 VirtualBox-7.2.20.tar.bz2 -rw-r--r--1s2 s23893650839月25日23:06 virtualbox-debug-7.2.20-1-x86_64.pkg.tar.zst -rw-r--r--1s2 s2453729月25日23:06 virtualbox-ext-vnc-7.2.20-1-x86_64.pkg.tar.zst -rw-r--r--1s2 s211016619月25日23:06 virtualbox-guest-utils-7.2.20-1-x86_64.pkg.tar.zst -rw-r--r--1s2 s25458979月25日23:06 virtualbox-guest-utils-nox-7.2.20-1-x86_64.pkg.tar.zst -rw-r--r--1s2 s221735049月25日23:06 virtualbox-host-dkms-7.2.20-1-x86_64.pkg.tar.zst -rw-r--r--1s2 s293606929月25日23:06 virtualbox-sdk-7.2.20-1-x86_64.pkg.tar.zst源码包 (VirtualBox-7.2.20.tar.bz2) 256MB, 编译出的主包 (virtualbox-7.2.20-1-x86_64.pkg.tar.zst) 70MB.3 测试运行安装软件包:sudopacman-Uvirtualbox-7.2.20-1-x86_64.pkg.tar.zst然后启动 VirtualBox:启动虚拟机:大成功 ! 撒花 ~~4 总结与展望借助 ArchLinux 官方的编译脚本, 以及容器, 从源代码编译 VirtualBox 还是比较容易的.如果想对 VirtualBox 做高级的自定义修改 (改代码), 那么编译出来是必备的前置条件.VirtualBox 的 Linux 版, 因为不涉及数字签名等复杂的东西, 编译相对比较简单. 而 Windows 版就麻烦多了, 不仅编译 (环境准备) 十分困难, 其 内核驱动 还涉及数字签名 (Oracle 官方发布的安装包有数字签名), 所以很不好弄. 技术问题 (具体如何编译) 还能想办法解决, 但数字签名是真的没有办法. 所以, 数字时代, 数字签名 即 权力 (狗头附录 1 github actions 自动化编译文件build-vbox-arch/.github/workflows/build.yml:# 手动运行: 编译name:Build VirtualBox (patched)on:workflow_dispatch:inputs:jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv7-run:git clone--single-branch--depth1 https://gitlab.archlinux.org/archlinux/packaging/packages/virtualbox.git-run:mkdir tmp out-run:docker build-t build-vbox-1 .-run:docker run--rm-v $PWD/tmp:/build/tmp-v $PWD/out:/build/out build-vbox-1-uses:actions/upload-artifactv7with:name:patched-virtualboxpath:out/*.pkg.tar.zst这个可以实现一键编译, 用时大约 34 分钟.本文使用 CC-BY-SA 4.0 许可发布.
网站建设高端定制企业官网