Spack离线部署

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

一、离线部署

1. release下载(推荐)

github下载最新的release:https://github.com/spack/spack/releases

2.激活

对于超算/lab/hpc等多用户场景,建议将spack本地放在全局/共享目录

单个普通用户建议放在 ~/.spack//opt

解压下载好的压缩包, 加载环境变量(根据具体情况变更路径):

source spack/share/spack/setup-env.sh

可以将此命令写在~/.bashrc/etc/profile 中 , 打开终端自动生效

3.添加编译器

运行下面命令可找到当前系统环境下的编译器

spack compiler find

4.配置离线 clingo-bootstrap

如果没配置,spec某个软件会报这样的错误

image-20241114163944285

原因是spack 依靠 clingo-bootstrap 这个python库实现解析软件的一些功能

我们在一台联网机器上,使用相同版本的spack 创建一个离线的clingo-bootstrap的源码仓库

spack bootstrap mirror --binary-packages ~/mirror

创建好后,压缩,上传到目标服务器,解压,配置bootstrap.yaml,运行下面的命令

spack bootstrap add --trust local-sources mirror所在的目录/metadata/sources

然后再次 spack spec zlib

image-20241114163957881

这次会自动编译相关依赖库,最后编译好clingo-bootstrap ,spack spec就正常输出了,而clingo-bootstrap和它的依赖安装目录是在 ~/.spack/bootstrap下

二、离线编译和管理已编译好的软件

1.spack 基础配置

进入~/.spack,先运行下面的命令

spack config get config > config.yaml

修改该文件,

install_tree 下单root值为软件安装目录,可自行修改,

projections的all值为目录层级,我这里删去了架构层级

verify_ssl和checksum都可以关闭 这样能大幅提高安装速度

下面是我的配置文件

config:
  install_tree:
    root: $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_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
  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

2.搭建离线源码仓库

在一台有外网环境的机器上,使用下面的命令搭建

mkdir mirror
spack mirror create -d ~/mirror -a

将mirror打成tar包,上传到目标机器并解压

spack mirror add local mirror文件夹绝对路径

image-20241101170854456

3.管理已编译好的软件

3.1 参考2. 我们创建一个私有的”源码“仓库

mkdir private_mirror
spack mirror add private private_mirror

3.2 创建私有的repo源

spack repo create private_repo
spack repo add /yeesuanAI01/spack/private_repo

image-20241114164014256

3.4 管理已编译软件的基本流程

假设我们有个hello 软件,已经在本地编译好,目录结构如下

image-20241114164027584

spack软件包名规则,无论是mirror下的源码还是repo下的包名,都需要遵循全部小写的规则,名字中有中划线的改下划线

我们将其打成tar包或者tgz包,并在私有源码仓库创建同名软件名单目录hello,将压缩包放入其中

mkdir /yeesuanAI01/spack/private_mirror/hello
mv hello.tgz /yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz

创建hello的自动安装脚本 这里大N是指定私有repo源的namespace 小n是这个软件的名字

spack create -N private_repo -n hello /yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz

image-20241114164044573

我们将其改造一下,

from spack.package import *

class Hello(Package):
    """FIXME: Put a proper description of your package here."""

    homepage = "https://www.example.com"
    url = "/yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz"

    version("1.0", url="file:///yeesuanAI01/spack/private_mirror/hello/hello_1.0.tgz")

    def install(self, spec, prefix):
        install_tree(".", prefix)

其中最关键的就是install这个函数,这个脚本只执行安装操作,install_tree的作用就是讲源码包解压后的所有文件和文件夹拷贝到spack软件安装目录,其中prefix是解压后的文件夹的根目录,所以这里用了 “.” 代表所有文件和文件夹

每个version里的url 要指明要安装的软件的源码仓库的绝对路径

此时我们再次info下,就有了我们的hello软件

image-20241114164056539

我们执行安装操作

spack install [email protected] %[email protected]

image-20241114164112456

我们load下测试下

image-20241114164126594

可以正常运行其bin目录下我们写好的echo hello脚本

3.4 脚本参考

这里是cp2k的脚本,用到了setup_run_environment 这个环境变量,我们可以在python脚本自定义各种环境变量,并添加多个“源码包”的版本号和其sha256值(sha256可以忽略不写)

from spack import *

class Cp2k(Package):
    """FIXME: Put a proper description of your package here."""

    homepage = "https://www.example.com"
    url = "file:///sh3/ysuanbase/home/yeesuan10000/mirror/yeesuan/cp2k/cp2k-2022.1.tgz"

    maintainers = ["libaolin"]

    version(
        "2022.1",
        sha256="c0bf3e12eb62e8923cf4b125fefc4fb6967d117463987cdc0056962d73ab4f71",
    )
    version(
        "9.1", sha256="bf2f9ad82ecc61f5a678057952a8ae6a8a6ab59e7749deb92adabf53994b1f18"
    )
    version("7.1")
    version(
        "8.2", sha256="c53c183c8771303c59eb8c4f47b9478242113f7a0590a051b36ffca127af3efd"
    )
    depends_on("intel-oneapi-mpi", type=("run"))

    def setup_run_environment(self, env):
        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)
下一页 Spack使用手册