Spack离线部署

2024-11-01
3分钟阅读时长

本文详细介绍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目录下,避免权限问题。

操作步骤:

  1. 将下载的压缩包上传至目标离线服务器,解压至指定路径(以/opt/spack为例):
tar -zxvf spack-xxx.tar.gz -C /opt/
# 解压后重命名(可选,方便后续操作)
mv /opt/spack-xxx /opt/spack
  1. 加载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库解析软件依赖关系。

解决方案:在联网机器上创建离线镜像,再导入目标离线服务器,具体步骤如下:

  1. 联网机器操作(需与目标服务器使用相同版本的Spack):
# 创建clingo-bootstrap离线镜像(路径可自定义,此处为~/mirror)
spack bootstrap mirror --binary-packages ~/mirror
  1. 将创建好的mirror目录压缩,上传至目标离线服务器:
# 联网机器压缩
tar -zcvf mirror.tar.gz ~/mirror
# 上传至离线服务器后,解压(示例路径:/opt/mirror)
tar -zxvf mirror.tar.gz -C /opt/
  1. 离线服务器配置镜像,加载clingo-bootstrap:
# 添加本地源码镜像
spack bootstrap add --trust local-sources /opt/mirror/metadata/sources
# 添加本地二进制镜像
spack bootstrap add --trust local-binaries /opt/mirror/metadata/binaries
  1. 验证:执行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离线编译使用:

  1. 联网机器操作:创建源码镜像目录并下载源码(-a表示下载所有软件源码,可根据需求指定软件,如-zlib -gcc):
mkdir -p ~/mirror  # 创建镜像目录
spack mirror create -d ~/mirror -a  # 下载所有软件源码到镜像目录
  1. 压缩镜像目录,上传至离线服务器并解压:
# 联网机器压缩
tar -zcvf mirror-source.tar.gz ~/mirror
# 离线服务器解压(示例路径:/opt/mirror-source)
tar -zxvf mirror-source.tar.gz -C /opt/
  1. 离线服务器添加本地镜像:
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软件包名需遵循全部小写规则,名称中有中划线的需改为下划线。

  1. 准备已编译软件包:将已编译好的hello软件打成tar包/tgz包(如hello_1.0.tgz)。

  2. 放入私有镜像目录:在私有镜像目录下创建与软件名同名的子目录,将压缩包放入其中:

mkdir /yeesuanAI01/spack/private_mirror/hello
mv hello_1.0.tgz /yeesuanAI01/spack/private_mirror/hello/
  1. 创建软件安装脚本:使用spack create命令生成基础脚本,指定私有repo源和软件名:
spack create -N private_repo -n hello /yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz
  1. 修改安装脚本:脚本路径为/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)
  1. 验证与安装:
# 查看软件信息,确认脚本配置成功
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函数配置,可根据实际已编译版本添加。

下一页 Spack使用手册