Spack离线部署
本文详细介绍Spack的离线部署流程,包括基础离线部署、离线编译配置及已编译软件管理,适用于超算、实验室HPC等无外网环境,步骤清晰可直接落地操作。
一、离线部署基础流程
1. Release包下载(推荐方式)
在联网机器上,从GitHub下载Spack最新Release压缩包,地址:https://github.com/spack/spack/releases,选择适合系统的版本(通常为tar.gz格式)。
注意:下载的版本需与目标离线服务器的系统架构(x86_64/arm64等)匹配,避免兼容性问题。
2. 解压与环境变量激活
部署路径建议:
-
多用户场景(超算/lab/HPC):优先放在全局共享目录(如/opt/spack),方便所有用户访问使用。
-
单用户场景:建议放在~/.spack/或/opt目录下,避免权限问题。
操作步骤:
- 将下载的压缩包上传至目标离线服务器,解压至指定路径(以/opt/spack为例):
tar -zxvf spack-xxx.tar.gz -C /opt/
# 解压后重命名(可选,方便后续操作)
mv /opt/spack-xxx /opt/spack
- 加载Spack环境变量,使当前终端可使用spack命令:
source /opt/spack/share/spack/setup-env.sh
永久激活(推荐):将上述命令写入终端配置文件,实现打开终端自动生效:
-
单用户:写入~/.bashrc
-
所有用户:写入/etc/profile
# 单用户配置
echo "source /opt/spack/share/spack/setup-env.sh" >> ~/.bashrc
# 所有用户配置(需root权限)
sudo echo "source /opt/spack/share/spack/setup-env.sh" >> /etc/profile
# 使配置立即生效
source ~/.bashrc 或 source /etc/profile
3. 添加系统编译器
Spack编译软件需依赖系统编译器,执行以下命令自动识别并添加当前系统环境中的编译器(如gcc、intel等):
spack compiler find
验证:执行spack compilers命令,可查看已识别的编译器列表,确认编译器正常添加。
4. 配置离线clingo-bootstrap(关键步骤)
问题说明:未配置clingo-bootstrap时,执行spack spec等命令会报错,因为Spack依赖clingo-bootstrap这个Python库解析软件依赖关系。
解决方案:在联网机器上创建离线镜像,再导入目标离线服务器,具体步骤如下:
- 联网机器操作(需与目标服务器使用相同版本的Spack):
# 创建clingo-bootstrap离线镜像(路径可自定义,此处为~/mirror)
spack bootstrap mirror --binary-packages ~/mirror
- 将创建好的mirror目录压缩,上传至目标离线服务器:
# 联网机器压缩
tar -zcvf mirror.tar.gz ~/mirror
# 上传至离线服务器后,解压(示例路径:/opt/mirror)
tar -zxvf mirror.tar.gz -C /opt/
- 离线服务器配置镜像,加载clingo-bootstrap:
# 添加本地源码镜像
spack bootstrap add --trust local-sources /opt/mirror/metadata/sources
# 添加本地二进制镜像
spack bootstrap add --trust local-binaries /opt/mirror/metadata/binaries
- 验证:执行spack spec zlib,若能正常输出依赖信息,说明配置成功;若失败,可通过本地Python安装clingo(备选方案):
pip install clingo # 需确保离线服务器已安装pip且有clingo安装包
二、离线编译与已编译软件管理
1. Spack基础配置(优化安装体验)
进入Spack配置目录(~/.spack),生成并修改配置文件config.yaml,优化安装路径、速度及编译参数:
# 进入配置目录
cd ~/.spack
# 生成默认配置文件
spack config get config > config.yaml
配置文件修改说明(关键参数已标注):
config:
install_tree:
root: $spack/app # 软件安装根目录,可自定义(如/opt/spack/app)
projections:
all: '{compiler.name}-{compiler.version}/{name}-{version}-{hash}' # 安装目录层级,删除架构层级简化路径
template_dirs:
- $spack/share/spack/templates
license_dir: $spack/etc/spack/licenses
build_stage: # 编译临时目录,可根据服务器存储情况调整
- $tempdir/$user/spack-stage
- $user_cache_path/stage
test_stage: $user_cache_path/test
source_cache: $spack/var/spack/cache # 源码缓存目录
misc_cache: $user_cache_path/cache
connect_timeout: 10
verify_ssl: false # 关闭SSL验证,提升离线环境操作速度
ssl_certs: $SSL_CERT_FILE
suppress_gpg_warnings: false
install_missing_compilers: false # 不自动安装缺失的编译器(离线环境无法安装)
checksum: false # 关闭校验和验证,大幅提升安装速度
deprecated: false
dirty: false
build_language: C
locks: true
url_fetch_method: urllib
ccache: false
concretizer: clingo # 依赖解析器,与clingo-bootstrap对应
db_lock_timeout: 60
package_lock_timeout: null
shared_linking:
type: rpath
allow_sgid: true
install_status: true
binary_index_ttl: 600
flags:
aliases: # 命令别名,简化操作
concretise: concretize
containerise: containerize
rm: remove
debug: false
build_jobs: 16 # 编译线程数,根据服务器CPU核心数调整(如32核可设为32)
2. 搭建离线源码仓库
在联网机器上下载所需软件的源码,生成离线镜像,再导入离线服务器,供Spack离线编译使用:
- 联网机器操作:创建源码镜像目录并下载源码(-a表示下载所有软件源码,可根据需求指定软件,如-zlib -gcc):
mkdir -p ~/mirror # 创建镜像目录
spack mirror create -d ~/mirror -a # 下载所有软件源码到镜像目录
- 压缩镜像目录,上传至离线服务器并解压:
# 联网机器压缩
tar -zcvf mirror-source.tar.gz ~/mirror
# 离线服务器解压(示例路径:/opt/mirror-source)
tar -zxvf mirror-source.tar.gz -C /opt/
- 离线服务器添加本地镜像:
spack mirror add local /opt/mirror-source # local为镜像名称,可自定义
验证:执行spack mirror list,可查看已添加的本地镜像。
3. 已编译软件管理(私有仓库配置)
对于已在本地编译好的软件,可通过创建私有镜像和repo源,实现统一管理和快速安装,步骤如下:
3.1 创建私有源码镜像
# 创建私有镜像目录(路径可自定义)
mkdir -p /yeesuanAI01/spack/private_mirror
# 添加私有镜像到Spack
spack mirror add private /yeesuanAI01/spack/private_mirror
3.2 创建私有repo源(软件安装脚本存放目录)
# 创建私有repo源目录
spack repo create private_repo
# 将私有repo源添加到Spack
spack repo add /yeesuanAI01/spack/private_repo
3.3 已编译软件管理基本流程(以hello软件为例)
注意事项:Spack软件包名需遵循全部小写规则,名称中有中划线的需改为下划线。
-
准备已编译软件包:将已编译好的hello软件打成tar包/tgz包(如hello_1.0.tgz)。
-
放入私有镜像目录:在私有镜像目录下创建与软件名同名的子目录,将压缩包放入其中:
mkdir /yeesuanAI01/spack/private_mirror/hello
mv hello_1.0.tgz /yeesuanAI01/spack/private_mirror/hello/
- 创建软件安装脚本:使用spack create命令生成基础脚本,指定私有repo源和软件名:
spack create -N private_repo -n hello /yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz
- 修改安装脚本:脚本路径为/yeesuanAI01/spack/private_repo/packages/hello/package.py,修改后如下(核心为install函数):
from spack.package import *
class Hello(Package):
"""自定义hello软件的描述(可根据实际情况修改)"""
homepage = "https://www.example.com" # 可改为软件实际主页,无则保留默认
url = "/yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz"
# 指定软件版本,url需填写压缩包的绝对路径
version("1.0", url="file:///yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz")
def install(self, spec, prefix):
# 将压缩包解压后的所有文件拷贝到Spack安装目录(prefix为安装目标路径)
install_tree(".", prefix)
- 验证与安装:
# 查看软件信息,确认脚本配置成功
spack info hello
# 安装软件(指定编译器版本,需与编译时一致,如[email protected])
spack install [email protected] %[email protected]
# 加载软件并测试
spack load hello
hello # 执行软件命令,验证是否正常运行
3.4 进阶脚本参考(以cp2k为例)
对于需要配置环境变量、多版本管理的软件,可参考以下脚本(包含依赖配置、环境变量设置、多版本支持):
from spack import *
class Cp2k(Package):
"""CP2K是一款用于分子模拟的量子化学软件,支持多种计算方法。"""
homepage = "https://www.cp2k.org/" # 软件实际主页
url = "file:///sh3/ysuanbase/home/yeesuan10000/mirror/yeesuan/cp2k/cp2k-2022.1.tgz"
maintainers = ["libaolin"] # 维护者信息(可选)
# 多版本配置,可添加多个版本,sha256校验和可选(离线环境可省略)
version(
"2022.1",
sha256="c0bf3e12eb62e8923cf4b125fefc4fb6967d117463987cdc0056962d73ab4f71",
)
version(
"9.1", sha256="bf2f9ad82ecc61f5a678057952a8ae6a8a6ab59e7749deb92adabf53994b1f18"
)
version("7.1")
version(
"8.2", sha256="c53c183c8771303c59eb8c4f47b9478242113f7a0590a051b36ffca127af3efd"
)
# 依赖配置(如依赖intel-oneapi-mpi,运行时需要)
depends_on("intel-oneapi-mpi", type=("run"))
# 配置运行环境变量(软件运行所需的库路径、环境变量等)
def setup_run_environment(self, env):
# 追加LD_LIBRARY_PATH,添加依赖库路径
env.prepend_path(
"LD_LIBRARY_PATH",
"/sh3/ysuanbase/share/software/public/intel-oneapi-mkl-2021.4.0-tyzzcpsexzuimyioanwactzip7mwxlqf/mkl/2021.4.0/lib/intel64:/sh3/ysuanbase/share/software/public/intel-oneapi-mkl-2021.4.0-tyzzcpsexzuimyioanwactzip7mwxlqf/lib:/sh3/ysuanbase/share/software/public/gcc-11.1.0-bpl5646k57uu5yyfv7ss74w53m77pptt/lib64",
)
env.prepend_path(
"LD_LIBRARY_PATH",
"/sh3/ysuanbase/share/software/public/intel-oneapi-compilers-2021.4.0-45kefy3jlp46zmllxkd7ftrsdfrtgfwb/compiler/2021.4.0/linux/compiler/lib/intel64_lin",
)
env.prepend_path("LD_LIBRARY_PATH", self.prefix + "/env-lib")
# 设置软件专用环境变量
env.set("CP2K_DATA_DIR", self.prefix + "/data")
# 安装函数,将已编译文件拷贝到目标路径
def install(self, spec, prefix):
install_tree(".", prefix)
脚本说明:setup_run_environment函数用于配置软件运行所需的环境变量,如依赖库路径、专用环境变量等;多版本通过多个version函数配置,可根据实际已编译版本添加。