!由于CERN对Geant4的下载页面做了大幅度修改,本脚本关于下载geant4源文件和数据集的相关代码已经失效。由于处理新版下载页面的逻辑过于复杂,暂无更新相关内容的计划

背景(撰写本攻略的缘由)

本文是 Geant4 及ROOT 在windows子系统(WSL)中的快速安装 的姊妹篇。上文应该是全网第一篇中文的在WSL中安装Geant4的教程。
当时笔者还很年轻,对Linux各种命令一窍不通,也不太理解安装的过程,只是摸着石头过河完成了安装并写成了教程。
几年后,笔者现在对相关过程已经非常明白了,故打算重写一个版本的安装教程。当然,改编不是乱编,重写也不是简单的重复。

本文旨在编写一个全自动的一键脚本来实现Gean4的安装,具体步骤包括换源、安装依赖、下载,编译安装,配置环境。当中引入最有意义的两点是,换源的过程不依赖使用Ubuntu的版本号,减少了相关工作量。下载的过程不依赖Geant4的版本,该脚本能 自动识别cern发布的最新版Gean4 和对应数据集,减少每次找下载链接的工作量。以此来 真正的实现Geant4的无门槛全自动安装 。因此,运行本文一键脚本的前提条件是Ubuntu系统就好了,不管什么版本,不需要预装任何软件。

下面开始正文,文末是一键脚本

安装过程解释

前言

使用WSL,WSL2,原生Linux主机分别进行安装Geant4有一定的区别,其中在原生Linux主机上安装不需要做额外配置;在WSL1/2中安装Geant4需要将图形化界面通过X转发给Windows,这样才能在Windows系统下看到正确的显示。具体的注意实习昂如下:

  • WSL1:
    • 直接使用tar解压缩会报错,通过在终端执行echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))可解决
    • 需要设置X转发的端口,export DISPLAY=localhost:0.0即可,建议通过如下命令设置成自动执行:echo "export DISPLAY=localhost:0.0" >> ~/.bashrc
  • WSL2:
    • 设置X转发时会更麻烦一点,WSL2相对于Windows是一个独立的系统,通过外部网口进行共享。其中麻烦在于每次重启计算机,WSL2的nameserver都会变更,故最好采用如下设置,以实现每次新启动自动完成X转发端口的绑定。
      echo 'host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")' >> ~/.bashrc
      echo 'export DISPLAY=$host_ip:0.0' >> ~/.bashrc  
      
    • WSL2中配置好X转发后,还需要再Windows中对防火墙进行放行,并且在启动XLaunch的时候要勾选 ‘No Access Control’

关于WSL1,WSL2的配置问题,以及运行Geant4的一些bug,可以参考WSL / WSL2 问题大全 及 解决方案 以及 使用Geant4遇到的一系列问题(在wsl、anaconda中遇到)

准备工作:更换软件源

# 更新软件源
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo apt-get update && sudo apt-get upgrade -y

这里更新为清华源,使用到了 sed 命令,可以直接对源文件指定字符串进行替换,从而可以实现不同Ubuntu版本使用相同的命令换源。
更换软件源是为了在国内能更快的下载对应资源,如果已经更换过,可以忽略这一步。

# 针对WSL1的问题进行处理,不然在解压缩时可能会出问题。
echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))

在新版的wsl1中,直接使用tar进行解压缩会报错,可以运行上面这条指令修复

下载Geant4依赖

# 安装Geant4依赖
sudo apt-get install cmake build-essential  libgl1-mesa-dev libglu1-mesa-dev libxt-dev libxmu-dev libxi-dev zlib1g-dev libgl2ps-dev libexpat1-dev libxerces-c-dev -y
sudo apt-get install qt5* --fix-missing -y 

安装Geant4需要用到的工具和库。这一步需要在换了国内镜像源(上步)后进行。
这里将 qt5 单独安装是因为 qt5 很大,可能会出错。

设置Geant4安装路径

# 设置Geant4安装路径
export G4dir=$HOME/Application/Geant4 # Geant4待安装路径,临时环境变量 G4dir
mkdir -p $G4dir
cd $G4dir

使用一个临时的环境变量来存储打算安装Geant4的路径,笔者习惯放到用户目录下,你可以放到自己喜欢的任意位置。(注意,路径太长,有中文、空格,或在安装过程中出现奇奇怪怪的问题。)
!注意,后续涉及到路径的地方都依赖这里设置的临时变量 G4Dir。每次启动新的终端,都会加载新的环境。故后续操作需要和本步骤在同一终端内完成。

下载Geant4

# 生成下载地址
wget -O G4temp1 https://geant4.web.cern.ch/support/download# 下载Geant4Release页面,命名为G4temp1
grep -n '^\s*download' G4temp1 > G4temp2 # 使用grep预处理,将download信息提出出来
awk -F'"' '{i = 1; while (i <= NF) {if ($i ~/G4/) print "https://geant4-data.web.cern.ch/datasets/"$(i)"."$(i+2)".tar.gz";i++}}' G4temp2 > G4downloadList # 使用awk提取文件名并拼接成下载地址
awk -F'"' '{i = 1; while (i <= NF) {if ($i ~/geant4.*?gz/) print "https://geant4-data.web.cern.ch/releases/"$(i);i++}}' G4temp2 >> G4downloadList
rm G4temp* # 清理临时文件

# 下载Geant4数据及主程序
wget -i G4downloadList

这里先使用wget命令下载Geant4的下载页面,然很对该网页内容进行查询,提取出当前最新版本的Geant4软件和数据Data的下载路径。这一步替换的是手动打开Geant4下载页面,对这些包进行下载。
注:如果下载出错(如果geant4不大改,应该不会有错),可以手动下载,后续步骤正常执行即可。

编译安装Geant4主程序

# 解压缩
tar -xzvf geant4-v11.0.2.tar.gz # 解压出geant4开头的文件,不同版本文件名不同

# 编译安装主程序
mkdir $G4dir/geant4*/build 
cd  $G4dir/geant4*/build 
cmake -DCMAKE_INSTALL_PREFIX=.. -DGEANT4_USE_OPENGL_X11=ON -DGEANT4_BUILD_MULTITHREADED=ON -DGEANT4_USE_RAYTRACER_X11=ON -DGEANT4_USE_GDML=ON -DGEANT4_USE_QT=ON .. # 指定安装内容,这里加入了QT
make -j4 # 编译,可以根据计算机CPU线程数来设置
make install  

没什么好说的,如果自己手动执行该步,注意路径,是在解压缩好的文件夹内部新建build文件夹,并在其中cmake。
注,倒数第二行可以指定编译Geant4所用到的线程数,设置大小和电脑性能匹配,速度最快。后续在编译自己写的Geant4模拟程序的时候,也可以通过指定j*来加速。其实不差这几分钟的话,随便设置就行。

处理Data数据文件

# 将之前下载好的DATA文件放到对应的位置
cd  $G4dir
mkdir data
mv G4*gz data
mv data $G4dir/gea*/share/*eant*/ # 需要把data文件放到这里才行
cd $G4dir/gea*/share/*eant*/data # * 是通配符
ls *.tar.gz | xargs -n1 tar xzvf # 批量解压

该步只能在上步完成后才能执行,因为需要等上部 make install后,才会有这个存放数据文件的目录。如果不是用脚本,手动把这些文件拖过去解压缩就行。需要留意的也是路径要对。

设置Geant4环境

# 将加载Geant4运行环境的命令开机自启
echo "source $G4dir/gea*/bin/geant4.sh" >> ~/.bashrc

将设置Geant4环境的命令加入到~/.bashrc中,以实现每次打开新终端时都自动加载。其实这一步速度很快,不会引起终端打开速度变慢,所以放进去就好。

# 将绑定X转发端口的命令开机自启
# 注意,这一步针对WSL。需要将Geant4的QT界面通过X转发到windows中,这样才能打开图形化界面。当然,为此需要在windows上配置xServer(比如xming)。下载下来安装运行,输入和下面绑定相同的端口号即可。
echo "export DISPLAY=localhost:0.0" >> ~/.bashrc  #对应于WSL1

# WSL2的这个DISPLAY地址设置有所不同,应该像下面这样
# host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
# echo "export DISPLAY=$host_ip:0.0" >> ~/.bashrc  #对应于WSL2

这一步是给WSL用的,用以实现Geant4的图形化界面。如果是WSL2的话,应该参照下面那种设置方式

测试

安装好后,重新打开一个终端,或者执行source ~/.bashrc刷新环境变量,接着进入到Geant4安装路径,找到想要测试的例程开始测试。
笔者喜欢给上述地址设置一个别名,并存放到~/.bashrc中,这样比较方便。操作方式如下:

# 先进入到想要设置别名(快捷方式)的路径下,举个例子,进入到:
# ~/Application/Geant4/geant4-v11.0.2/examples/basic
echo "alias myGeant4=\"cd $(pwd)\"" >> ~/.bashrc
# alias 创建别名
# echo "**" >> ~/.bashrc 将**内容追加写入到~/.bashrc中
# $(pwd) 将执行pwd命令的结果放到这里。pwd,显示当前路径。(所以要先进入到这里来才行)

同样的,在source ~/.bashrc之后,进入到Geant4自带的例子中,并编译运行:

myGeant4
cd B2/B2a
mkdir build
cd build
cmake ..
make -j8
./exampleB2a

那么大功告成!
在这里插入图片描述

一键脚本

将上述各个部分代码合并即可:
!!该脚本对于WSL1,原封不动直接运行即可。而对于WSL2,看看脚本最下面的备注,把WSL1的内容删掉,把WSL2的内容取消注释即可。
!!笔者为了保证脚本真的一键可以完成,分别新创建了WSL1,WSL2并在其中都进行过测试,调试到真能一键完成安装才发布。

# 更新软件源
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo apt-get update && sudo apt-get upgrade -y

# 针对WSL1的问题进行处理,不然在解压缩时可能会出问题。
echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))

# 安装Geant4依赖
sudo apt-get install cmake build-essential  libgl1-mesa-dev libglu1-mesa-dev libxt-dev libxmu-dev libxi-dev zlib1g-dev libgl2ps-dev libexpat1-dev libxerces-c-dev -y
sudo apt-get install qt5* --fix-missing -y 

# 设置Geant4安装路径
export G4dir=$HOME/Application/Geant4 # Geant4待安装路径
mkdir -p $G4dir
cd $G4dir

# 生成下载地址
wget -O G4temp1 https://geant4.web.cern.ch/support/download# 下载Geant4Release页面,命名为G4temp1
grep -n '^\s*download' G4temp1 > G4temp2 # 使用grep预处理,将download信息提出出来
awk -F'"' '{i = 1; while (i <= NF) {if ($i ~/G4/) print "https://geant4-data.web.cern.ch/datasets/"$(i)"."$(i+2)".tar.gz";i++}}' G4temp2 > G4downloadList # 使用awk提取文件名并拼接成下载地址
awk -F'"' '{i = 1; while (i <= NF) {if ($i ~/geant4.*?gz/) print "https://geant4-data.web.cern.ch/releases/"$(i);i++}}' G4temp2 >> G4downloadList
rm G4temp* # 清理临时文件

# 下载Geant4数据及主程序
wget -i G4downloadList

# 编译安装主程序
tar -xzvf geant4*.tar.gz # 解压出geant4开头的文件,不同版本文件名不同
cd $G4dir/geant4*/
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=.. -DGEANT4_USE_OPENGL_X11=ON -DGEANT4_BUILD_MULTITHREADED=ON -DGEANT4_USE_RAYTRACER_X11=ON -DGEANT4_USE_GDML=ON -DGEANT4_USE_QT=ON .. # 指定安装内容,这里加入了QT
make -j4 # 编译,可以根据计算机CPU线程数来设置
make install  


# 将之前下载好的DATA文件放到对应的位置
cd  $G4dir
mkdir data
mv G4*gz data
mv data $G4dir/gea*/share/*eant*/ # 需要把data文件放到这里才行
cd $G4dir/gea*/share/*eant*/data
ls *.tar.gz | xargs -n1 tar xzvf # 批量解压

# 将加载Geant4运行环境的命令开机自启
echo "source $G4dir/gea*/bin/geant4.sh" >> ~/.bashrc

# 将绑定X转发端口的命令开机自启(对应于WSL1的操作。WSL2见更下面)
# 注意,这一步针对WSL。需要将Geant4的QT界面通过X转发到windows中,这样才能打开图形化界面。当然,为此需要在windows上配置xServer(比如xming)。下载下来安装运行,输入和下面绑定相同的端口号即可。
# echo "export DISPLAY=localhost:0.0" >> ~/.bashrc  #对应于WSL1

# WSL2的这个DISPLAY地址设置有所不同,应该像下面这样
echo 'host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")' >> ~/.bashrc #对应于WSL2
echo 'export DISPLAY=$host_ip:0.0' >> ~/.bashrc #对应于WSL2
# 注意,这里单引号表示将这个文本原封不动的写入文件,这样每次开启终端时都会自动设置 host_ip,可以应对每次重启导致wsl2变更host_ip的情况。

最后,祝一切安好~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐