☰
虚拟机安装Geant4全流程:Ubuntu配置、编译避坑与环境验证
2026/10/10 6:50:01 网站建设 项目流程

最近帮实验室新来的师弟在虚拟机里装了一套Geant4,全程走下来,感觉比在物理机上装还省心。Geant4作为粒子物理、医学物理方向绕不开的蒙特卡罗模拟工具包,新手第一次配置的时候,最容易卡住的其实不是代码本身,而是那一长串依赖库、编译选项、环境变量和官方文档里的各种“已在别处介绍过”的坑。如果你手头只有一台 Windows 笔记本,或者不想给主力机折腾双系统、担心把环境搞坏,那在虚拟机里放一个干净的 Linux 专门跑 Geant4,是特别值得参考的思路。

这套方案适合几类人:上课要用 Geant4 的学生、需要在 Windows 主力机上临时跑模拟的科研人员、以及想先体验一下 Geant4 再决定要不要深度学习的新手。下面这套流程我前后完整跑过两遍,写出来的是第二遍时精简优化后的版本,所谓的“无脑简易版”,就是把每一步都锁死在最不容易出错的路径上,所有坑提前帮你避开。

1. 为什么我建议用虚拟机装 Geant4,以及这套方案适合谁

先聊一个很多人没想明白的问题:为什么要在虚拟机里装 Geant4,而不是直接装个双系统,或者干脆用 Docker?

双系统的问题在于切换成本太高。你今天想写论文、查文献、用 Windows 上的一些工具软件,明天要跑模拟,得重启三五分钟进 Ubuntu;这种来回折腾对日常工作流的打断是实打实的。而 Geant4 本身又不是一个需要重度 GPU 加速的程序,它跑的是 CPU 蒙特卡罗模拟,绝大多数课题作业、论文数据量,虚拟机那点性能损耗几乎感知不到。

Docker 的问题则在于可视化。Geant4 的官方例子里有很大一部分要打开 OpenGL/Qt 界面看粒子轨迹和几何结构,Docker 跑 GUI 需要额外配置 X11 转发,折腾下来完全违背“无脑简易”的初衷。虚拟机是完整桌面环境,开箱即用。

还有一个很关键的理由:隔离和快照。Geant4 在编译安装过程中要装一堆系统依赖,保不齐哪天把系统的 Python、CMake 或者 Qt 库弄乱了,在虚拟机里出任何问题,删掉重来也就是十几分钟的事。你甚至可以装完一个完整可用的 Geant4 环境之后,给虚拟机拍一个快照,以后无论怎么折腾,随时可以一秒还原。这一点,物理机双系统做不到,Docker 的灵活隔离也做不到这种“整个桌面环境还原”的体验。

虚拟机配置我的建议是:CPU 给 2 核以上、内存至少 4GB(推荐 8GB)、磁盘 60GB。Geant4 编译时的最大瓶颈是内存,特别是链接阶段,4GB 以下容易编译中途被 OOM 杀掉。CPU 给几个核取决于你宿主机资源的余量,编译 Geant4 本身对 CPU 要求不算变态,4 核心编译大约需要 30 到 60 分钟,属于能接受的范围。

2. 装好 VMware Workstation 和新版 Ubuntu,提前避开两个“隐形坑”

虚拟机软件这块,我推荐 VMware Workstation Pro。它现在对个人用户已经免费授权,直接去官网注册个人账号就能拿到激活密钥,在校生和科研用户尤其顺手。VirtualBox 当然也能用,但 VMware 的 3D 图形加速和宿主机/虚拟机之间的文件拖拽更省心,对后面跑 Geant4 的 Qt 可视化界面有实际帮助。

要避开的第一个坑,是不要装完系统就急着装乱七八糟的 VMware Tools。新版 VMware Workstation 对 Ubuntu 22.04 以后的支持已经原生内置了开源驱动方案:你只需要在 Ubuntu 装完系统后打开终端,执行:

sudo apt update sudo apt install -y open-vm-tools-desktop

这个包会自动接管窗口分辨率自适应、宿主机与虚拟机之间的文件拖拽、剪贴板共享。我之前装完系统后没装它,结果虚拟机窗口分辨率卡在 800×600,从宿主机复制命令都粘不进去,还以为是 VMware Workstation 的渲染问题。装完 open-vm-tools-desktop,重启一次虚拟机,一切就正常了。

第二个坑和 Ubuntu 的下载源有关。建议直接下载Ubuntu 22.04.5 LTS的桌面 ISO,不要图新去装 24.04。22.04 的软件源里默认的 GCC、CMake 版本刚好卡在 Geant4 11.2.x 版本的最低要求线上,所有依赖通过 apt 一条命令就能装齐全,不用额外折腾第三方源。24.04 我也试过,本身的依赖也没问题,但某些显卡驱动和 Qt 库的兼容性在 VMware 下更容易出幺蛾子。反正 Geant4 吃 CPU 不吃新内核,稳妥优先。

新建虚拟机的参数按这套来:硬盘选 NVMe 类型,容量 60GB,内存 8GB,CPU 给 4 核。硬盘类型这个细节很多人不注意,Ubuntu 里fdisk -l看到是/dev/nvme0n1还是/dev/sda会影响部分工具链的识别,选 NVMe 更接近真实物理机环境,后面写脚本、查磁盘路径都省心。显示设置里显存给到最大,勾选“加速 3D 图形”,这对后续打开 Geant4 的 Qt 可视化窗口很重要。

系统安装过程本身没什么悬念,常规的“清空磁盘并安装 Ubuntu”一路点过去就行。唯一别忘了的是在“安装类型”界面选“为图形和无线硬件安装第三方软件”——它会把虚拟机里跑 GUI 需要的基础闭源驱动一并装上,避免 Geant4 可视化窗口黑屏。

3. 编译前那一堆依赖,到底哪些必须装,哪些可以不用管

Geant4 官方文档里列了一大堆依赖项,英文原文读下来很容易让人产生“每个都得装”的错觉。实际上,真正不装就会报错的,就那么几个。我整理了一个能一次装完的最小依赖集合,直接在终端里执行:

sudo apt update sudo apt install -y build-essential cmake \ libxerces-c-dev \ libxmu-dev libmotif-dev \ qtbase5-dev libqt5opengl5-dev libqt5printsupport5-dev \ libgl1-mesa-dev libglu1-mesa-dev \ libexpat1-dev zlib1g-dev \ freeglut3-dev

先说 build-essential 和 cmake。build-essential 会带出 GCC 和 G++ 编译器,Ubuntu 22.04 默认的 GCC 11 满足 Geant4 11.2 的 C++17 需求,不用自己装新版。cmake 系统自带版本是 3.16.3,刚好满足 Geant4 对“CMake 3.16 以上”的要求。这两条是编译的根基。

libxerces-c-dev是 XML 解析库,Geant4 的 GDML 几何描述文件全靠它。如果你不装这个,编译时会出现Cannot find Xerces-C或GDML is requested but Xerces-C is not available之类的错误。GDML 是 Geant4 里很重要的几何建模文件格式,官方几乎所有进阶示例都用它,所以这个必须装。

Qt 相关的四个包是为了编译带图形界面的版本。Geant4 默认的 QT 界面在可视化方面比老旧的 X11 界面好用得多:支持鼠标旋转平移缩放、粒子径迹追踪时有交互菜单。Qt 界面编译需要 qtbase5-dev 和 libqt5opengl5-dev 这两个核心,libqt5printsupport5-dev 是可选但建议装,偶尔有官方示例用到打印功能,缺了它会报找不到 Qt5PrintSupport。

libgl1-mesa-dev和libglu1-mesa-dev是 OpenGL 开发库,Geant4 的可视化渲染器要链接它们。装 Mesa 系的库在虚拟机上还有额外的好处:VMware 的虚拟 GPU 对 Mesa 的支持是最成熟的,比 NVIDIA 私有的 PhysX 虚拟化方案兼容性更好。

有一个包我要特别提醒:libmotif-dev。它是老的 Motif 图形库,只在 Geant4 编译时被作为可选 UI 功能检测到。很多人忽略它,结果安装后打开可视化窗口时发现只有 Qt 版能用,而官方某些旧示例还默认走 Motif 路径。装这个不是为了用它的界面,纯粹是为了让 CMake 的依赖检测顺利通过,避免一些隐形的编译选项问题。

依赖安装完以后,可以用一句命令检查核心工具链是否就位:

gcc --version && cmake --version && pkg-config --modversion xerces-c

能打印出版本号就说明基础环境 OK 了,接下来可以开始搞源码。

4. Geant4 源码编译安装全流程(含数据文件的下载处理)

到了最核心的环节。Geant4 的源码建议直接去官网下载,但要留意一个细节:官网默认推荐的下载方式是要登录的,新手容易卡在登录注册上。我建议直接用官网提供的.tar.gz源码压缩包路径,或者从 GitHub 的 Geant4 仓库拉特定版本的 release 包,省去注册环节。

版本选择上,我推荐Geant4 11.2.1。这个版本是 11.2 系列里比较稳定的补丁版,官方文档、示例代码的兼容性都是按它来校准的。11.3 我也试过,核心用法差不多,但网上搜到的大多数中文教程还停留在 10.x 和 11.1 的阶段,用 11.2.1 能最大程度保证你搜索解决方案时看到的内容对得上号。

源码下载好以后,规划安装目录。我的习惯是安装到/opt/geant4而不是默认的/usr/local,理由有二:一是 Geant4 的文件结构非常庞大,集中放在/opt/geant4下,以后卸载、升级、迁移都只需要动一个目录;二是 Geant4 环境变量要source的那个脚本,会硬编码安装路径,装在专用目录里,脚本内容看一眼就知道是怎么回事,方便理解。

解压源码,然后创建一个独立的 build 目录:

cd ~ tar -zxvf geant4-v11.2.1.tar.gz cd geant4-v11.2.1 mkdir build cd build

接下来是整篇流程的重头戏:CMake 配置命令。我用的是一行终极配置:

cmake -DCMAKE_INSTALL_PREFIX=/opt/geant4 \ -DGEANT4_INSTALL_DATA=ON \ -DGEANT4_USE_QT=ON \ -DGEANT4_USE_OPENGL_X11=ON \ -DGEANT4_BUILD_MULTITHREADED=ON \ -DGEANT4_INSTALL_EXAMPLES=ON \ ..

逐项解释为什么这样设:

GEANT4_INSTALL_DATA=ON是“无脑简易版”的关键。Geant4 运行时的物理过程需要十几个数据文件(截面数据、核数据、粒子数据等),不装这些数据,程序运行时只会在终端打印缺失数据的警告,然后给出非常诡异的结果。设成 ON 后,CMake 会在配置阶段自动下载对应版本的数据包并统一安装到/opt/geant4/share/Geant4/data下,完全不需要手动干预。这是最省心的一项,代价是下载过程比较久,数据包加起来约 2GB 多。

GEANT4_USE_QT=ON和GEANT4_USE_OPENGL_X11=ON分别开启 Qt 界面和 OpenGL 渲染,这两项都开到 ON,可视化窗口才是最完整的形态。之前你谷歌到很多老教程会写GEANT4_USE_RAYTRACER_X11之类的东西,那是过时选项,新版本基本已经废弃,不用去管。

GEANT4_BUILD_MULTITHREADED=ON是开启 Geant4 的多线程模式。Monte Carlo 模拟天生适合并行,这个选项开启之后,程序里可以在不借助外部任务调度的情况下直接跑多线程,对后续批量模拟的性能提升非常明显。我必须提醒:不要把这个当成“编译时开 -j 多核”的同义词,它改的是 Geant4 运行库自身的线程支持。

GEANT4_INSTALL_EXAMPLES=ON会把官方示例源码复制到安装目录里,方便随时调阅和编译。建议开上,后面验证安装是否成功就用其中的basic/B1示例。

配置阶段如果网络比较慢,可能卡在下载数据文件那一步。这里有一个实测有效的加速技巧:从官网的数据下载页面把对应版本的所有.tar.gz数据包手动下载下来,扔到源码根目录下的data文件夹里,然后再次运行上面的 cmake 命令,CMake 检测到本地数据包后就不会再从网络下载了。官网数据页面列出了 Geant4 11.2.1 需要的数据清单,名称都是G4*开头的.tar.gz,全部下载后统一放进~/geant4-v11.2.1/data/目录即可。放好之后 CMake 配置会直接使用本地文件,整条流程的速度会快非常多。

配置完成后,开始编译:

make -j4

-j4对应给虚拟机分配的 4 核 CPU。编译过程中密密麻麻的输出完全不用管,看到进度条正常推进就行。整个编译过程在 4 核 8GB 的虚拟机上大约需要 40 到 60 分钟,可以去干点别的事。如果编译到一半提示internal compiler error或者进程突然消失,十有八九是内存不够触发了 OOM 保护,把虚拟机内存加到 8GB 以上再重跑一次即可。重跑make不会全量重编译,会从断掉的进度继续,这个很贴心。

编译完成后执行安装:

sudo make install

安装过程会再花几分钟,把编译结果和数据文件一并拷贝到/opt/geant4。装完后进入/opt/geant4看一眼,发现有bin/、lib/、include/、share/这四大目录,说明安装基本成功。

5. 环境变量与第一个示例程序验证

安装完成后,紧接着要配置环境变量。这步漏掉的话,你会在哪里都找不到geant4-config命令,编译示例程序也会报“找不到 Geant4”的错误。

Geant4 安装完成后会在/opt/geant4/share/Geant4/目录下生成一个环境脚本:geant4make.sh。它的作用是把你需要的bin目录加入 PATH,把库路径和编译参数写入环境变量。配置方法是在~/.bashrc末尾追加:

source /opt/geant4/share/geant4/geant4make.sh

追加后让配置立即生效:

source ~/.bashrc

然后验证环境变量是否生效:

geant4-config --version

能打印出v11.2.1之类的版本号,就说明主体环境配置成功。

接下来编译并运行官方示例做最终验证。进入安装目录复制出来的示例代码区:

cd /opt/geant4/share/Geant4/examples/basic/B1 mkdir build && cd build cmake .. make -j4

编译完成后,用示例自带的宏文件跑一次模拟:

./exampleB1 run1.mac

正常情况下,终端里会出现类似这样的输出:

********** Run summary ********** Number of events = 100 Total number of tracks ... ##################################

跑完还能在同目录下看到生成的根文件或直方图输出。这一跑通过,说明数据文件加载、物理列表初始化、几何构建、事件循环全链路都是正常的。

如果想打开图形界面看粒子径迹,直接运行:

./exampleB1

会弹出 Qt 可视化窗口,在左下角的交互文本框里输入:

/run/beamOn 10

就能看到粒子打靶的轨迹和击中事件,这是 Geant4 最有成就感的时刻——意味着你从零建立的环境真的在“跑模拟”了,而不只是编译构造成功。

6. 我在这个流程中踩过的坑:虚拟机相关典型报错与排查

整个流程我跑了两遍,第二遍比第一遍顺滑太多了。但有几个坑实在太典型,必须单独拉出来说,确保你们看到这些报错的时候不慌。

编译期进程被杀(Killed)或 bad_alloc。这是最常见的一种。Geant4 源码核心模块编译到链接阶段时,内存占用会突然飙升。虚拟机给 4GB 内存的机器,往往到这里就崩了。判断方法很简单:看终端最后是不是突然断掉且没有报错信息,去查系统日志dmesg | tail,如果看到Out of memory: Kill process字样,就是内存不够。解决方式就是给虚拟机加内存。我实测 8GB 内存编译 11.2.1 全程无压力,如果你宿主机内存富余,直接给 16GB 都没问题,反正虚拟机的内存可以在关机状态下随时调整。还有一个降内存的编译选项,可以尝试减少并行度:

make -j2

编译时间多花一半,但内存压力小很多。这是内存紧张时的保险方案。

Qt 可视化窗口白屏或打不开。这个坑多半出现在 Qt 依赖和虚拟 GPU 驱动的配合上。首先要确认你 Ubuntu 里的 Mesa 驱动安装完整,也就是前面那组libgl1-mesa-dev libglu1-mesa-dev没漏。其次是 VMware 虚拟机的 3D 加速必须在 VM 设置里打开。我已经见过太多人抱怨 Qt 界面打不开,最后发现只是 VMware 自己的 3D 加速按钮没勾上。此外,如果你给虚拟机显存设置的数值太小,Qt 窗口也有可能因显存不足回退成软件渲染,表现是窗口能开但非常卡顿。把显存调到最大,勾上“加速 3D 图形”,保存重启,基本能解决。

运行示例时提示找不到某类数据文件。这类报错特征是Data files are missing或者运行时物理列表报出某数据路径为空。通常是GEANT4_INSTALL_DATA=ON设置后自动下载的数据在安装过程中因为网络问题没复制全。排查思路很简单:看/opt/geant4/share/Geant4/data目录下是否存在几十个G4*开头的子目录。如果缺少,可以把对应的数据包手动下载放进去,再重跑sudo make install,CMake 会根据缺失情况增量补齐。事实上,即使你在编译时没开GEANT4_INSTALL_DATA=ON,也可以在安装完成后手动把数据包解压到上面这个目录,然后在环境变量里加一句:

export G4DATA=/opt/geant4/share/Geant4/data

Geant4 会通过G4DATA自动搜索全部数据集。

宿主机和虚拟机之间复制粘贴失效。这通常是 open-vm-tools-desktop 没装好。注意它必须在 Ubuntu 的图形界面会话下重启过一次才会完全生效,装完包后建议重启虚拟机而不是只重启会话。如果拖拽文件的功能谁用都不好使,换一个思路:在 VMware 的“共享文件夹”里设置一个目录,宿主机和虚拟机能直接互通文件,编译时把源码放在共享目录里也完全可以。

虚拟机的鼠标在 VMware 窗口边缘卡住或移动异常。这跟 Geant4 一点关系都没有,但很影响体验。通常是 VMware 的“自动捕获和释放鼠标”设置问题,在 VMware 的编辑菜单里找到这两个选项勾上即可。这种小问题不在安装流程里,但如果你彻底装完 Geant4 后因为鼠标问题烦躁,会很打击继续学习的热情。

7. 把环境跑起来之后的一些实操心得

环境搭好之后,有几个心得想跟大家分享一下,都是日常跑模拟时实实在在感受到的差异。

第一,一定要在配好环境后第一时间给虚拟机拍个快照。VMware 的快照功能是最终极的后悔药。我首次配好环境后,因为测试不同的编译参数把 Qt 库搞混过,结果重新从快照恢复,整个环境十秒钟回到之前的完好状态。这个操作只花十秒钟准备,但能避免未来数小时的重复折腾。快照的命名建议写清楚状态时间,比如“Geant4-11.2.1-Ubuntu22.04-初始可用”,半年后你再回来看这个快照才知道它代表什么。

第二,Geant4 的编译参数和依赖在不同的 Ubuntu 版本上可能会有细微差异。如果你用的是 Debian 系的其他发行版,或者 Ubuntu 的某个衍生版,依赖包的名称可能略有不同,但大逻辑是一样的:编译工具链、Xerces-C、Qt5、OpenGL、Mesa 这五类装全,CMake 配置就基本不会出问题。遇到问题的时候,优先查 CMake 的报错信息里明确提到了哪个库找不到,对症下药。

第三,虚拟机跑 Geant4 的性能比物理机差不了多少,但数据文件的读写速度会有影响。Geant4 的输出文件往往比较大,如果你把虚拟磁盘设成了 60GB 以上,建议选 NVMe 类型,并且把虚拟磁盘的“独立持久”属性在 VMware 里关掉,这样可以获得更稳定的磁盘随机读写速度。跑大规模模拟时,输出数据文件写满虚拟磁盘的默认 20GB 上限是迟早的事,提前把虚拟磁盘扩容或定期清理旧数据,是保持环境长期可用的好习惯。

最后再说一个让整套环境更省心的小技巧:在~/.bashrc里除了 sourcegeant4make.sh之外,我还会加一行:

alias geant4-clean='cd ~/geant4-v11.2.1/build && make clean && rm -rf CMakeCache.txt'

重编译 Geant4 前先清理缓存,可以省去很多 CMake 配置阶段因为新旧缓存冲突产生的诡异问题。当然,如果你用的是快照恢复方案,这行命令基本用不上——但多一层保险总归不是坏事。配置好这一切之后,你就可以放心地在虚拟机里跑自己的物理模拟了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询