Linux 构建说明
尽管我们不偏爱任何发行版,但我们仅使用特定的发行版进行构建。这些发行版包括 Debian、Ubuntu 和 Oracle Linux。不过,对于其他发行版来说,情况应该不会有太大不同。如果您想为其他发行版提供具体的构建说明(特别是软件包名称),请联系VirtualBox 团队。
增强功能
这些说明还将构建 Guest Additions(仅限 Linux 部分),并且针对您的主机系统正在使用的位数。要仅构建 Additions(这需要少得多的依赖项,尽管遗憾的是 configure
不知道这一点),请将 make 文件参数 VBOX_ONLY_ADDITIONS=1
添加到 kmk
命令行。要创建 Additions 磁盘映像安装程序,请在命令行上使用 packing
进行第二次 kmk
运行。要在 64 位主机上进行 32 位构建,请添加参数 KBUILD_TARGET_ARCH=x86
。输出将保存到文件夹 out/linux.*/*/bin/additions
中。构建的 Additions 通常无法在比其构建时所用系统更旧的系统上运行(例如,在 Ubuntu 16.10 上构建可能会导致 Ubuntu 14.04 客户机出现问题)。请在chroot 环境中或目标虚拟机上进行构建以解决此问题。
VirtualBox 7.x 的先决条件
您需要
- GCC 13 或更高版本 推荐使用 GCC 13。
- Linux 内核头文件(用于当前引导的内核)
- IASL(Intel ACPI 编译器)
- Yasm 1.3 或更高版本 (yasm, Yasm 模块化汇编器项目)
- xsltproc (libxslt, XML 样式表处理器)
- libxml2(VBox 版本 >= 1.6 所需,XML 文件处理)
- libxslt1(VBox 版本 >= 1.6 所需,XML 文件转换)
- libXcursor(在客户机中支持彩色鼠标指针所需)
- libxinerama
- librandr
- Qt 6
- libIDL
- libSDL (SDL 前端)
- ALSA (音频后端)
- PulseAudio (音频后端)
- libhal (检测主机软盘/DVD)
- libcap (用于 NAT 中 ICMP 套接字的 CAP_NET_RAW)
- libdevmapper
- libpam0g(用于 Guest Additions 的 PAM 支持,VBox 版本 >= 3.2 所需)
- python-dev (Python 绑定)
- gsoap (webservice API,版本 2.8.50 或更高)
- Java SE 6 JDK (Java API 绑定,包括 webservice 和 XPCOM)
- Xmu (用于 OpenGL)
- Mesa (用于 OpenGL)
- glslangValidator (用于 3D 加速)
- cURL (版本 7.16.1 或更高,VBox 版本 >= 3.0 所需)
- Java JDK (生成 Java 绑定所需)
- makeself (用于创建通用安装程序包,VBox 版本 >= 4.0 所需)
- pdflatex (通常由 texlive-latex-base 提供)
- ia32-libs 或 lib32z1(编译 32 位 Guest Additions 所需的各种库,较新版本的 Debian/Ubuntu 使用 lib32z1)
- libc6-dev-i386 (libc6 i386 开发头文件)
- lib32gcc1 (i386 的 gcc 支持,较新版本的 Debian/Ubuntu 使用 lib32gcc-s1)
- gcc-multilib (i386 的 gcc 支持)
- lib32stdc++6 (i386 的 libstdc++)
- g++-multilib (i386 的 g++ 支持)
在基于 Debian 的系统上,以下命令应该可以安装所需的软件包
apt-get install --no-install-recommends acpica-tools chrpath doxygen g++-multilib libasound2-dev libcap-dev \ libcurl4-openssl-dev libdevmapper-dev libidl-dev libopus-dev libpam0g-dev \ libpng-dev libpulse-dev qt6-base-dev qt6-help-dev qt6-l10n-tools libsdl1.2-dev libsdl-ttf2.0-dev \ libssl-dev libvpx-dev libxcursor-dev libxinerama-dev libxml2-dev libxml2-utils \ libxmu-dev libxrandr-dev linux-source make nasm python3-dev python-dev \ texlive texlive-fonts-extra texlive-latex-extra unzip xsltproc \ default-jdk libstdc++5 libxslt1-dev linux-kernel-headers makeself \ mesa-common-dev subversion yasm zlib1g-dev glslang-tools \ libc6-dev-i386 lib32z1 lib32gcc-s1 lib32stdc++6 linux-headers-generic
- 针对 python 编程
apt-get install pylint python3-psycopg2 python3-willow python-psycopg2 python-pil
在 Fedora 上(在 pre-37 rawhide 上测试),以下操作应该可行
yum install gcc-c++ subversion subversion-gnome kernel-devel which tar gzip bzip2 \ doxygen mscgen wine-core \ glibc-devel libcap-devel libcurl-devel libIDL-devel \ libstdc++-static libxslt-devel libvpx-devel libXmu-devel \ pam-devel pulseaudio-libs-devel python-devel qt5-qtbase-devel qt5-qtbase-gui qt5-qtx11extras-devel \ qt5-qttools-devel libXrender-devel libXinerama-devel libXcursor-devel rpm-build SDL_ttf-devel \ SDL-static device-mapper-devel glibc-static zlib-static \ glibc-devel.i686 libstdc++.i686 alsa-lib-devel pulseaudio-libs-devel \ texlive texlive-latex texlive-latex-bin texlive-ec \ texlive-collection-fontsrecommended texlive-pdftex-def texlive-fancybox texlive-tabulary \ libpng-devel openssl-devel acpica-tools opus opus-devel java-1.8.0-openjdk-devel glslang
要获取 Fedora 中缺失的 beramono.sty
LaTeX 样式(感谢 Perry)
cd /usr/share/texmf/tex/latex/ mkdir bera cd bera/ wget http://www.tug.org/texlive/devsrc/Master/texmf-dist/tex/latex/bera/beramono.sty texhash
在 Gentoo 上,以下操作应该可行(抱歉,并非完全最新)
emerge -av sys-devel/bin86 sys-devel/dev86 sys-power/iasl libxslt xerces-c \ xalan-c libXcursor dev-qt/qtgui:5.6 libIDL libsdl hal alsa-lib pulseaudio \ app-cdr/cdrtools app-arch/makeself sys-fs/lvm2 dev-util/glslang
在 Arch Linux 上,请尝试以下操作
# 64-bit: pacman -S --needed binutils bison flex pkg-config multilib-devel wget yasm nasm \ libidl2 linux-headers texlive-most sdl sdl_ttf \ lib32-glibc lib32-libstdc++5 lib32-gcc-libs gcc-multilib qt5 \ glslang
64 位二进制文件的特殊调整
在 64 位主机上构建仍然需要 32 位库和构建工具,因为作为构建过程一部分的 Guest Additions 是 32 位的。请注意,在 64 位 Ubuntu 系统上,某些共享库的链接缺失。这可以通过以下方式修复:
ln -s libX11.so.6 /usr/lib32/libX11.so ln -s libXTrap.so.6 /usr/lib32/libXTrap.so ln -s libXt.so.6 /usr/lib32/libXt.so ln -s libXtst.so.6 /usr/lib32/libXtst.so ln -s libXmu.so.6 /usr/lib32/libXmu.so ln -s libXext.so.6 /usr/lib32/libXext.so
构建 VirtualBox
- 进入源代码的根目录并执行 configure 脚本
./configure --disable-hardening
如果它找到了所需的一切,它将创建一个名为“AutoConfig.kmk
”的文件,其中包含您系统上各种工具的路径。此外,它还将创建一个名为env.sh
的环境设置脚本。此步骤只需执行一次(如果您的构建工具设置发生更改,您可能需要重复此步骤,但请记住这两个输出文件都将被覆盖)。
开关 --disable-hardening 不应用于构建用于再分发或生产使用的软件包。
- 每当您想构建 VirtualBox 时,您都必须打开一个 shell 并加载生成的环境设置脚本 'env.sh',即执行:
source ./env.sh
- 要构建发布包,请键入:
kmk all
这会在out/linux.x86/release/bin/
中生成所需的二进制文件。如果您想构建调试版本,请输入:kmk BUILD_TYPE=debug
如果您有多个 CPU 核心,kmk
将自动进行并行构建。
- 从
bin/
目录运行加固构建将不起作用,因为所有加固的二进制文件都明确链接到/opt/VirtualBox
中的库(固定路径)。
为分发构建 VirtualBox 软件包
在创建用于再分发的软件包时,切勿禁用加固(请参阅上一节)。
为了更符合 LSB 规范,请更改 VirtualBox 二进制文件用于查找其组件的默认路径。将以下构建变量添加到 LocalConfig.kmk
:
- VBOX_PATH_APP_PRIVATE_ARCH := /usr/lib/virtualbox
- 这是应用程序的私有目录,与架构相关。
- VBOX_PATH_SHARED_LIBS := $(VBOX_PATH_APP_PRIVATE_ARCH)
- 放置共享库的位置,通常与私有路径相同,因为 VirtualBox 共享库通常不被任何其他应用程序使用。
- VBOX_WITH_ORIGIN :=
- 禁用
RPATH=$ORIGIN
并使用固定的RUNPATH
。 - VBOX_WITH_RUNPATH := $(VBOX_PATH_APP_PRIVATE_ARCH)
- 将
RUNPATH
设置为可以找到我们共享库的目录。 - VBOX_PATH_APP_PRIVATE := /usr/share/virtualbox
- 这是应用程序的私有目录,与架构无关。
- VBOX_PATH_APP_DOCS := /usr/share/doc/virtualbox
- 设置包含文档的目录。文件
VirtualBox.chm
和UserManual.pdf
将在此目录中搜索。 - VBOX_WITH_TESTCASES :=
- 不构建测试用例以节省编译时间。
- VBOX_WITH_TESTSUITE :=
- 不构建测试套件以节省编译时间。
运行您的构建
如果构建未加固,您可以直接从构建目标目录(out/linux.x86/release/bin/
)运行 VirtualBox。但首先,您必须构建并安装 VirtualBox 内核模块,其源代码将已复制到构建目标目录。
因此,请执行以下操作:
cd out/linux.x86/release/bin/src make sudo make install cd ..
然后它应该已经安装到您的模块目录中,您可以使用 modprobe vboxdrv
加载它。请确保您拥有对 /dev/vboxdrv
的读写权限。
最后,您可以启动其中一个前端,例如:
./VirtualBox