Skip to content

Instantly share code, notes, and snippets.

@bio-punk
Created March 11, 2026 13:08
Show Gist options
  • Select an option

  • Save bio-punk/1fbd5f4b1ce51ddef7baaca8c01e6021 to your computer and use it in GitHub Desktop.

Select an option

Save bio-punk/1fbd5f4b1ce51ddef7baaca8c01e6021 to your computer and use it in GitHub Desktop.
Apptainer install #container

BSCC-N56R5 分区 Apptainer/1.4.5(含 LZ4 压缩 / FUSE 挂载支持)构建指南

本文档基于 ln01 登录节点与 gpu_4090 / gpu_5090 分区的实测环境,记录在 BSCC-N56R5 集群上从源码构建 Apptainer 1.4.5,并配套部署 LZ4 压缩FUSE 挂载 SIF 能力的完整流程。所有路径和脚本均以当前工作目录:

  • 工作目录:/data/run01/${USER}/USERNAME/dev260311
  • 应用根目录:/data/apps

为前提,如在其他账号 / 目录使用,请相应替换前缀。


1. 环境与分区概览

  • 登录节点:ln01(Ubuntu 22.04.5 LTS,内核 5.15)
  • Slurm:
    • 分区:gpu_4090gpu_5090
    • GPU 申请:--gpus=N -p gpu_4090-p gpu_5090
  • Modules 根目录:/data/apps/modulefiles
  • 旧版 Apptainer:apptainer/1.2.4,安装于 /data/apps/apptainer/apptainer

Apptainer 1.4.5 的安装前缀约定为:

  • PREFIX=/data/apps/apptainer/1.4.5

2. 依赖组件一览

2.1 自行部署的第三方依赖

  • liblz4 1.9.4

    • 作用:为 Apptainer 1.4.5 及 squashfs-tools 提供 LZ4 头文件和库。
    • 安装前缀:/data/apps/liblz4/1.9.4
    • 构建(已完成,可复用):
      • git clone --branch v1.9.4 --depth 1 https://github.com/lz4/lz4.git lz4-1.9.4
      • cd lz4-1.9.4 && make -j$(nproc) && make install PREFIX=/data/apps/liblz4/1.9.4
    • modulefile 模板:modulefile.liblz4-1.9.4/data/apps/modulefiles/liblz4/1.9.4
  • Go 1.23.6

    • 作用:满足 Apptainer 1.4.5 构建所需 Go 版本。
    • 安装前缀:/data/apps/golang/1.23.6
    • 部署方式(官方二进制):
      • 下载:go1.23.6.linux-amd64.tar.gz
      • 解压:tar -C /data/apps/golang/1.23.6 -xzf go1.23.6.linux-amd64.tar.gz --strip-components=1
    • modulefile 模板:modulefile.golang-1.23.6/data/apps/modulefiles/golang/1.23.6
  • libfuse3-headers 3.10.5(仅 include)

    • 作用:为 squashfuse 提供 FUSE3 头文件,运行仍使用系统 libfuse3.so.3
    • 安装前缀:/data/apps/libfuse3-headers/3.10.5(仅 include/
    • modulefile 模板:modulefile.libfuse3-headers-3.10.5/data/apps/modulefiles/libfuse3-headers/3.10.5

2.2 系统运行时依赖(计算节点已具备)

通过 ldconfig -p 验证:

  • libuuid.so.1 / libuuid.so
  • libseccomp.so.2
  • libgpgme.so.11
  • libfuse3.so.3
  • libfuse.so.2
  • libcryptsetup.so.12
  • libz.so(zlib,已装 zlib1g-dev

这些满足 Apptainer 1.4.5 的典型运行时依赖,无需额外 root 操作。


3. 构建 Apptainer 1.4.5(含 LZ4 支持)

3.1 准备源码

在工作目录:

  • 源码路径约定:/data/run01/${USER}/USERNAME/dev260311/apptainer-1.4.5
  • 建议从官方 tag 获取 v1.4.5 源码:
cd /data/run01/${USER}/USERNAME/dev260311
git clone --branch v1.4.5 https://github.com/apptainer/apptainer.git apptainer-1.4.5

3.2 构建脚本 build.sh

脚本位置:/data/run01/${USER}/USERNAME/dev260311/build.sh

  • 主要行为:
    • 使用 Slurm 提交(#SBATCH --gpus=8 -p gpu_4090
    • 通过 SSH 隧道 + git proxy 拉取依赖(如首次编译需要)
    • 设置:
      • SCRIPT_DIR=/data/run01/${USER}/USERNAME/dev260311
      • SRC_DIR=${SCRIPT_DIR}/apptainer-1.4.5
      • PREFIX=/data/apps/apptainer/1.4.5
      • BUILDDIR=${SRC_DIR}/builddir
    • 加载依赖 module:
      • module load golang/1.23.6
      • module load liblz4/1.9.4
    • 执行:
      • ./mconfig -b builddir -p $PREFIX
      • make -C builddir -j$(nproc)
      • make -C builddir install

使用方式:

cd /data/run01/${USER}/USERNAME/dev260311
sbatch build.sh

构建完成后:

  • 可执行文件:/data/apps/apptainer/1.4.5/bin/apptainer
  • 建议通过 module 管理(见第 6 节)。

4. 构建支持 LZ4 的 squashfs-tools 4.6.1

Apptainer 1.4.5 需要 squashfs-tools >= 4.3。本环境选择 4.6.1,并仅启用 gzip + LZ4 压缩,以减少依赖。

4.1 构建脚本 build_squashfs_tools.sh

位置:/data/run01/${USER}/USERNAME/dev260311/build_squashfs_tools.sh

关键点:

  • 版本与前缀:
    • VERSION="${1:-4.6.1}"
    • PREFIX=/data/apps/squashfs-tools/${VERSION}
  • 依赖:
    • module load liblz4/1.9.4
    • 系统 zlib1g-dev(提供 libz
  • 源码下载:
curl -f -L -sS -o squashfs-tools-${VERSION}.tar.gz \
  https://github.com/plougher/squashfs-tools/archive/${VERSION}/squashfs-tools-${VERSION}.tar.gz
tar -xf squashfs-tools-${VERSION}.tar.gz
  • 编译(仅启用 gzip + lz4):
    • 进入 squashfs-tools-${VERSION}/squashfs-tools
    • 设置:
      • CFLAGS-I/data/apps/liblz4/1.9.4/include
      • LDFLAGS-L/data/apps/liblz4/1.9.4/lib
    • make 参数:
make -C squashfs-tools \
  GZIP_SUPPORT=1 \
  LZ4_SUPPORT=1 \
  -j$(nproc)
  • 安装:
    • 复制 mksquashfsunsquashfs${PREFIX}/bin
    • 建立符号链接:
      • sqfstar -> mksquashfs
      • sqfscat -> unsquashfs

一键构建:

cd /data/run01/${USER}/USERNAME/dev260311
bash build_squashfs_tools.sh        # 默认 4.6.1

安装结果:

  • /data/apps/squashfs-tools/4.6.1/bin/mksquashfs
  • /data/apps/squashfs-tools/4.6.1/bin/unsquashfs

5. 构建支持 FUSE 挂载的 squashfuse 0.6.1

Apptainer 1.4.5 可以通过 squashfuse_ll 使用 FUSE 直接挂载 SIF 内部的 squashfs 分区,避免「Converting SIF file to temporary sandbox...」导致磁盘占用暴涨。

5.1 squashfuse 源码

  • 源码目录:/data/run01/${USER}/USERNAME/dev260311/squashfuse
  • 获取方式(已完成)示例:
git clone https://github.com/vasi/squashfuse.git
cd squashfuse
git checkout 0.6.1
./autogen.sh

5.2 构建脚本 build_squashfuse.sh

位置:/data/run01/${USER}/USERNAME/dev260311/build_squashfuse.sh

关键点:

  • 加载依赖:
module load libfuse3-headers/3.10.5
module load liblz4/1.9.4
  • FUSE3 配置:
    • FUSE3_LIBDIR=/lib/x86_64-linux-gnu
    • FUSE3_INC=/data/apps/libfuse3-headers/3.10.5/include
    • CPPFLAGS="-I${FUSE3_INC} -DFUSE_USE_VERSION=30 ..."
    • LDFLAGS="-L${FUSE3_LIBDIR} ..."
    • LIBS="-L${FUSE3_LIBDIR} -l:libfuse3.so.3 ..."
    • 通过 -l:libfuse3.so.3 显式链接,避免系统缺失 libfuse3.so 符号链接的问题。
  • 自动清理旧配置:
    • 若已有 Makefile,先 make distclean || true./configure
  • configure 参数:
./configure \
  --prefix=/data/apps/squashfuse/0.6.1 \
  --enable-multithreading \
  --with-zlib=/usr \
  --with-lz4=/data/apps/liblz4/1.9.4 \
  --with-fuse-include=/data/apps/libfuse3-headers/3.10.5/include \
  --with-fuse-lib=/lib/x86_64-linux-gnu
  • 编译安装:
    • make -j32
    • make install

一键构建:

cd /data/run01/${USER}/USERNAME/dev260311
bash build_squashfuse.sh

安装结果:

  • /data/apps/squashfuse/0.6.1/bin/squashfuse_ll
  • /data/apps/squashfuse/0.6.1/bin/squashfuse

6. modulefiles 布署

所有 modulefile 模板均在工作目录下,建议统一安装到 /data/apps/modulefiles

6.1 Apptainer 1.4.5

  • 模板:modulefile.apptainer-1.4.5
  • 目标:/data/apps/modulefiles/apptainer/1.4.5

示例内容要点:

  • set root /data/apps/apptainer/1.4.5
  • prepend-path PATH $root/bin
  • prepend-path LD_LIBRARY_PATH $root/lib
  • conflict apptainerconflict singularity
  • ModulesHelp 中包含构建步骤与使用说明。
  • 加载提示:
    • 需要 FUSE 挂载 SIF 时请先: module load squashfuse/0.6.1
    • 构建 SIF 时若需外部 mksquashfs/unsquashfs 请加载: module load squashfs-tools/4.6.1

部署命令:

mkdir -p /data/apps/modulefiles/apptainer
cp modulefile.apptainer-1.4.5 /data/apps/modulefiles/apptainer/1.4.5

6.2 squashfuse 0.6.1

  • 模板:modulefile.squashfuse-0.6.1
  • 目标:/data/apps/modulefiles/squashfuse/0.6.1
  • 要点:
    • PATH 增加 /data/apps/squashfuse/0.6.1/bin
    • MANPATHPKG_CONFIG_PATH 视需要设置
    • ModulesHelp 中详细记录构建步骤(与 build_squashfuse.sh 对应)

部署:

mkdir -p /data/apps/modulefiles/squashfuse
cp modulefile.squashfuse-0.6.1 /data/apps/modulefiles/squashfuse/0.6.1

6.3 squashfs-tools 4.6.1

  • 模板:modulefile.squashfs-tools-4.6.1
  • 目标:/data/apps/modulefiles/squashfs-tools/4.6.1
  • 要点:
    • PATH 增加 /data/apps/squashfs-tools/4.6.1/bin
    • ModulesHelp 中记录仅启用 gzip+LZ4 的构建方法(引用 build_squashfs_tools.sh)。

部署:

mkdir -p /data/apps/modulefiles/squashfs-tools
cp modulefile.squashfs-tools-4.6.1 /data/apps/modulefiles/squashfs-tools/4.6.1

6.4 liblz4 / Go / libfuse3-headers

  • modulefile.liblz4-1.9.4/data/apps/modulefiles/liblz4/1.9.4
  • modulefile.golang-1.23.6/data/apps/modulefiles/golang/1.23.6
  • modulefile.libfuse3-headers-3.10.5/data/apps/modulefiles/libfuse3-headers/3.10.5

7. 典型使用方式

7.1 在 GPU 节点上使用新的 Apptainer 1.4.5

示例(1 卡 4090):

salloc -p gpu_4090 --gpus=1

module use /data/apps/modulefiles
module load apptainer/1.4.5

apptainer --version

7.2 启用 FUSE 挂载 SIF(避免解包)

module use /data/apps/modulefiles
module load apptainer/1.4.5
module load squashfuse/0.6.1

apptainer exec --nv /data/apps/apptainer/SIF_IMAGE/pt_23.02b.sif nvidia-smi

加载 squashfuse/0.6.1 后,Apptainer 能检测到 squashfuse_ll,优先用 FUSE 挂载 SIF,不再在临时目录解包整镜像。

7.3 构建 / 处理带 LZ4 压缩的 squashfs 镜像

module use /data/apps/modulefiles
module load squashfs-tools/4.6.1

# 使用 LZ4 压缩创建 squashfs
mksquashfs /path/to/rootfs rootfs.squashfs -comp lz4

# 解包 squashfs
unsquashfs rootfs.squashfs

8. 小结

本指南在 BSCC-N56R5 集群上完成了:

  • /data/apps/apptainer/1.4.5 从源码构建 Apptainer 1.4.5,并用 module 管理。
  • 通过自部署 liblz4 与定制 squashfs-tools 4.6.1,为 SIF 构建提供 LZ4 压缩支持。
  • 通过 libfuse3-headers + squashfuse 0.6.1,为新 Apptainer 提供 FUSE 挂载 SIF 能力,避免大镜像解包。
  • 使用一组脚本(build.shbuild_squashfuse.shbuild_squashfs_tools.sh)和 modulefiles,将部署过程固化,便于后续在其他账号 / 节点复现。

维护或迁移时,仅需调整少量前缀路径(/data/apps、工作目录)即可在新环境重建同样的 Apptainer 1.4.5 运行栈。


附录 A:构建脚本

A.1 build.sh(Apptainer 1.4.5)

#!/bin/bash
#SBATCH --gpus=8
#SBATCH --time=12:00:00
#SBATCH --partition=gpu_4090
#SBATCH --account=${USER}

# 从 apptainer-1.4.5 源码构建 Apptainer,安装到 /data/apps/apptainer/1.4.5
# 用法: ./build.sh [源码目录] [安装前缀]
# 示例: ./build.sh
#       ./build.sh ./apptainer-1.4.5 /data/apps/apptainer/1.4.5

set -e

ssh -CfNg -L 7897:127.0.0.1:7897 ln01
git config --global http.proxy http://127.0.0.1:7897
git config --global https.proxy http://127.0.0.1:7897
git config --global http.sslVerify false
git config --global https.sslVerify false
git config --global http.sslVerify false
export http_proxy="http://127.0.0.1:7897"
export https_proxy="http://127.0.0.1:7897"
export no_proxy="localhost,127.0.0.1"

SCRIPT_DIR="/data/run01/${USER}/USERNAME/dev260311"
SRC_DIR="${SCRIPT_DIR}/apptainer-1.4.5"
PREFIX="/data/apps/apptainer/1.4.5"
BUILDDIR="${SRC_DIR}/builddir"
if [[ ! -d "${BUILDDIR}" ]]; then
    mkdir -p "${BUILDDIR}"
else
    rm -rf "${BUILDDIR}"
    mkdir -p "${BUILDDIR}"
fi

module load golang/1.23.6
module load liblz4/1.9.4

echo "=== Apptainer 构建 ==="
echo "  源码目录: ${SRC_DIR}"
echo "  安装前缀: ${PREFIX}"
echo "  构建目录: ${BUILDDIR}"
echo ""

if [[ ! -d "${SRC_DIR}" ]]; then
    echo "错误: 源码目录不存在: ${SRC_DIR}"
    exit 1
fi

if [[ ! -f "${SRC_DIR}/mconfig" ]]; then
    echo "错误: 未找到 mconfig,请确认源码目录为 Apptainer 根目录: ${SRC_DIR}"
    exit 1
fi

if ! command -v go &>/dev/null; then
    echo "错误: 未找到 go 命令。请安装 Go 或 module load 后重试。"
    exit 1
fi
echo "  Go: $(go version)"
echo ""

cd "${SRC_DIR}"

echo ">>> 运行 mconfig ..."
./mconfig -b "${BUILDDIR}" -p "${PREFIX}"

echo ">>> 编译 ..."
make -C "${BUILDDIR}" -j"$(nproc)"

echo ">>> 安装 (PREFIX=${PREFIX}) ..."
make -C "${BUILDDIR}" install

echo ""
echo "=== 构建完成 ==="
echo "  安装路径: ${PREFIX}"
echo "  可将 ${PREFIX}/bin 加入 PATH,或配置 module 后执行:"
echo "    export PATH=${PREFIX}/bin:\$PATH"
echo "    apptainer --version"
echo ""

A.2 build_squashfuse.sh

#!/bin/bash

set -e

module load libfuse3-headers/3.10.5
module load liblz4/1.9.4

cd /data/run01/${USER}/USERNAME/dev260311/squashfuse

# 系统无 libfuse3-dev 时 configure 需要显式指定 FUSE3 的 include 和链接;若只有 libfuse3.so.3 无 libfuse3.so,
# 用 -l:libfuse3.so.3 显式指定库文件名,避免 ld: cannot find -lfuse3。
# fuse_common.h 要求 FUSE_USE_VERSION >= 30,否则 #error "only API version 30 or greater is supported"。
FUSE3_LIBDIR="/lib/x86_64-linux-gnu"
FUSE3_INC="/data/apps/libfuse3-headers/3.10.5/include"
export CPPFLAGS="-I${FUSE3_INC} -DFUSE_USE_VERSION=30 ${CPPFLAGS:-}"
export LDFLAGS="-L${FUSE3_LIBDIR} ${LDFLAGS:-}"
export LIBS="-L${FUSE3_LIBDIR} -l:libfuse3.so.3 ${LIBS:-}"

# 若之前 configure 失败,清理后重跑以应用 -DFUSE_USE_VERSION=30
if [ -f Makefile ]; then make distclean 2>/dev/null || true; fi

./configure \
  --prefix=/data/apps/squashfuse/0.6.1 \
  --enable-multithreading \
  --with-zlib=/usr \
  --with-lz4=/data/apps/liblz4/1.9.4 \
  --with-fuse-include=/data/apps/libfuse3-headers/3.10.5/include \
  --with-fuse-lib=/lib/x86_64-linux-gnu

make -j32
make install

A.3 build_squashfs_tools.sh

#!/bin/bash
#
# 构建 squashfs-tools(mksquashfs / unsquashfs)并安装到 /data/apps/squashfs-tools/4.6.1
# 与 Apptainer 1.4.5 使用的版本一致(>=4.3,推荐 4.6.1)。
# 依赖: liblz4(module load liblz4/1.9.4)、系统 libz(Ubuntu 一般已有 zlib1g-dev)。仅启用 gzip + lz4,无需 lzo/xz/zstd。
#
set -e

VERSION="${1:-4.6.1}"
PREFIX="/data/apps/squashfs-tools/${VERSION}"
WORK_DIR="/data/run01/${USER}/USERNAME/dev260311"
SRC_DIR="${WORK_DIR}/squashfs-tools-${VERSION}"

module load liblz4/1.9.4

# 若源码不存在则下载
if [[ ! -d "${SRC_DIR}" ]]; then
    echo ">>> 下载 squashfs-tools ${VERSION} ..."
    ( cd "${WORK_DIR}" && curl -f -L -sS -o "squashfs-tools-${VERSION}.tar.gz" \
        "https://github.com/plougher/squashfs-tools/archive/${VERSION}/squashfs-tools-${VERSION}.tar.gz" )
    tar -xf "${WORK_DIR}/squashfs-tools-${VERSION}.tar.gz" -C "${WORK_DIR}"
fi

cd "${SRC_DIR}"
if [[ ! -d squashfs-tools ]]; then
    echo "错误: 未找到 squashfs-tools 子目录,请检查源码包结构"
    exit 1
fi

# 仅 gzip(libz) + lz4(自部署 liblz4),不启用 lzo/xz/zstd,免装 liblzo2-dev、liblzma-dev、libzstd-dev
export CFLAGS="-I/data/apps/liblz4/1.9.4/include ${CFLAGS:-}"
export LDFLAGS="-L/data/apps/liblz4/1.9.4/lib ${LDFLAGS:-}"

echo ">>> 编译 squashfs-tools(仅 gzip + lz4)..."
make -C squashfs-tools clean 2>/dev/null || true
make -C squashfs-tools \
    GZIP_SUPPORT=1 \
    LZ4_SUPPORT=1 \
    -j"$(nproc)"

echo ">>> 安装到 ${PREFIX} ..."
mkdir -p "${PREFIX}/bin" "${PREFIX}/share/man/man1"
cp -f "${SRC_DIR}/squashfs-tools/mksquashfs" "${SRC_DIR}/squashfs-tools/unsquashfs" "${PREFIX}/bin/"
( cd "${PREFIX}/bin" && ln -sf mksquashfs sqfstar 2>/dev/null; ln -sf unsquashfs sqfscat 2>/dev/null; true )
# 若有 man 页则安装(4.7.x 在 generate-manpages/)
for f in "${SRC_DIR}"/squashfs-tools/*.1; do
    [[ -f "$f" ]] && cp -f "$f" "${PREFIX}/share/man/man1/" || true
done

echo ""
echo "=== 构建完成 ==="
echo "  安装路径: ${PREFIX}"
echo "  bin: ${PREFIX}/bin (mksquashfs, unsquashfs, sqfstar, sqfscat)"
echo "  可将 modulefile 部署到 /data/apps/modulefiles/squashfs-tools/${VERSION}"
echo ""

附录 B:modulefiles

B.1 modulefile.apptainer-1.4.5

#%Module1.0#####################################################################
##
##  Apptainer 1.4.5 - 容器运行时(支持新压缩格式 lz4/zstd,--nv)
##  部署路径: /data/apps/apptainer/1.4.5
##
proc ModulesHelp { } {
    global version root
    puts stderr "Apptainer $version - Container runtime (SIF, --nv, squashfuse optional)"
    puts stderr "Installed by USERNAME@paratera.com"
    puts stderr "Installed at 2026-3-11 14:10:26"
    puts stderr "  安装路径: $root"
    puts stderr "  bin:     $root/bin"
    puts stderr "  lib:     $root/lib"
    puts stderr "  libexec: $root/libexec"
    puts stderr "  man:     $root/share/man"
    puts stderr ""
    puts stderr "用法: apptainer run/exec/shell --nv IMAGE.sif [cmd]"
    puts stderr "若需用 FUSE 挂载 SIF 避免解包占盘,请先: module load squashfuse/0.6.1"
    puts stderr ""
    puts stderr "构建方法(供维护参考):"
    puts stderr "  1) 源码: git clone --branch v$version https://github.com/apptainer/apptainer.git apptainer-$version"
    puts stderr "  2) 加载: module load golang/1.23.6; module load liblz4/1.9.4"
    puts stderr "  3) 构建: cd apptainer-$version; ./mconfig -b builddir -p $root; make -C builddir -j\\\$(nproc); make -C builddir install"
    puts stderr "  或使用工作目录脚本: bash build.sh(会使用 SCRIPT_DIR/apptainer-1.4.5 与 PREFIX=$root"
    puts stderr ""
}

set     version     1.4.5
set     root        /data/apps/apptainer/1.4.5

module-whatis "Apptainer $version - Container runtime (SIF, --nv)"

# 与旧版 Apptainer 及 Singularity 二选一
conflict        apptainer
conflict        singularity

prepend-path    PATH                 $root/bin
prepend-path    LD_LIBRARY_PATH      $root/lib
prepend-path    LIBRARY_PATH         $root/lib
prepend-path    INCLUDE              $root/include
prepend-path    MANPATH              $root/share/man

# 加载/卸载提示
if { [ module-info mode load ] } {
    puts stderr "[module-info name] loaded (bin=$root/bin)"
    puts stderr "需要 FUSE 挂载 SIF 时请先: module load squashfuse/0.6.1"
    puts stderr "构建 SIF 时若需外部 mksquashfs/unsquashfs 请加载: module load squashfs-tools/4.6.1"
} elseif { [ module-info mode remove ] } {
    puts stderr "[module-info name] unloaded"
}

B.2 modulefile.squashfuse-0.6.1

#%Module1.0#####################################################################
##
##  squashfuse 0.6.1 - FUSE-based read-only squashfs mount (squashfuse_ll)
##  部署路径: /data/apps/squashfuse/0.6.1
##
proc ModulesHelp { } {
    global version root
    puts stderr "squashfuse $version - Mount squashfs via FUSE (squashfuse_ll, squashfuse)"
    puts stderr "Installed by USERNAME@paratera.com"
    puts stderr "Installed at 2026-3-11 14:00:47"
    puts stderr "  安装路径: $root"
    puts stderr "  bin:  $root/bin  (squashfuse_ll, squashfuse)"
    puts stderr "  lib:  $root/lib"
    puts stderr "  man:  $root/share/man"
    puts stderr ""
    puts stderr "用途: Apptainer 等可用 squashfuse_ll 直接挂载 SIF 内 squashfs,避免解包占满磁盘。"
    puts stderr "使用前需加载本 module,并确保运行环境有 FUSE 与 libfuse3(系统通常已装)。"
    puts stderr ""
    puts stderr "构建方法(供维护参考):"
    puts stderr "  1) 获取源码(二选一):"
    puts stderr "     git clone https://github.com/vasi/squashfuse.git squashfuse && cd squashfuse && git checkout 0.6.1 && ./autogen.sh"
    puts stderr "     或从 https://github.com/vasi/squashfuse/releases 下载 0.6.1 源码包解压后进入目录。"
    puts stderr "  2) 加载依赖 module:"
    puts stderr "     module load libfuse3-headers/3.10.5"
    puts stderr "     module load liblz4/1.9.4"
    puts stderr "  3) 设置 FUSE3 并 configure(系统无 libfuse3-dev 时需 CPPFLAGS/LDFLAGS/LIBS):"
    puts stderr "     FUSE3_LIBDIR=/lib/x86_64-linux-gnu"
    puts stderr "     FUSE3_INC=/data/apps/libfuse3-headers/3.10.5/include"
    puts stderr "     export CPPFLAGS=\"-I\\$FUSE3_INC -DFUSE_USE_VERSION=30\""
    puts stderr "     export LDFLAGS=\"-L\\$FUSE3_LIBDIR\""
    puts stderr "     export LIBS=\"-L\\$FUSE3_LIBDIR -l:libfuse3.so.3\""
    puts stderr "     ./configure --prefix=$root --enable-multithreading --with-zlib=/usr \\"
    puts stderr "       --with-lz4=/data/apps/liblz4/1.9.4 --with-fuse-include=\\$FUSE3_INC --with-fuse-lib=\\$FUSE3_LIBDIR"
    puts stderr "  4) 编译安装:"
    puts stderr "     make -j\\$(nproc) && make install"
    puts stderr "  或直接使用工作目录脚本: bash /path/to/build_squashfuse.sh(脚本内已包含上述步骤)。"
    puts stderr ""
}

set     version     0.6.1
set     root        /data/apps/squashfuse/0.6.1

module-whatis "squashfuse $version - FUSE mount for squashfs (squashfuse_ll)"

prepend-path    PATH                 $root/bin
prepend-path    LD_LIBRARY_PATH      $root/lib
prepend-path    LIBRARY_PATH         $root/lib
prepend-path    MANPATH              $root/share/man
prepend-path    PKG_CONFIG_PATH      $root/lib/pkgconfig

# 加载/卸载提示
if { [ module-info mode load ] } {
    puts stderr "[module-info name] loaded (bin=$root/bin)"
} elseif { [ module-info mode remove ] } {
    puts stderr "[module-info name] unloaded"
}

B.3 modulefile.squashfs-tools-4.6.1

注意:下方 modulefile 描述的构建参数仍为「多压缩格式」,而当前脚本只启用了 gzip + LZ4;如需完全一致,可按需要调整 modulefile 中的说明。

#%Module1.0#####################################################################
##
##  squashfs-tools 4.6.1 - mksquashfs / unsquashfs(多压缩格式)
##  部署路径: /data/apps/squashfs-tools/4.6.1
##
proc ModulesHelp { } {
    global version root
    puts stderr "squashfs-tools $version - mksquashfs, unsquashfs (gzip/xz/lzo/lz4/zstd)"
    puts stderr "Installed by USERNAME@paratera.com"
    puts stderr "Installed at 2026-3-11 20:47:36"
    puts stderr "  安装路径: $root"
    puts stderr "  bin: $root/bin (mksquashfs, unsquashfs, sqfstar, sqfscat)"
    puts stderr ""
    puts stderr "用途: 制作/解包 squashfs 镜像;Apptainer 构建 SIF 时若需外部 mksquashfs/unsquashfs 可加载本模块。"
    puts stderr ""
    puts stderr "构建方法(供维护参考):"
    puts stderr "  1) 依赖: module load liblz4/1.9.4;系统需 libz/liblzo2/liblzma/libzstd 开发包。"
    puts stderr "  2) 下载: curl -fL -o squashfs-tools-4.6.1.tar.gz \\"
    puts stderr "       https://github.com/plougher/squashfs-tools/archive/4.6.1/squashfs-tools-4.6.1.tar.gz"
    puts stderr "     tar -xf squashfs-tools-4.6.1.tar.gz && cd squashfs-tools-4.6.1/squashfs-tools"
    puts stderr "  3) 编译: export CFLAGS=\"-I/data/apps/liblz4/1.9.4/include\" LDFLAGS=\"-L/data/apps/liblz4/1.9.4/lib\""
    puts stderr "     make GZIP_SUPPORT=1 LZO_SUPPORT=1 LZ4_SUPPORT=1 XZ_SUPPORT=1 ZSTD_SUPPORT=1 -j\\\$(nproc)"
    puts stderr "  4) 安装: mkdir -p $root/bin && cp mksquashfs unsquashfs $root/bin"
    puts stderr "  或直接: bash build_squashfs_tools.sh [4.6.1]"
    puts stderr ""
}

set     version     4.6.1
set     root        /data/apps/squashfs-tools/4.6.1

module-whatis "squashfs-tools $version - mksquashfs/unsquashfs"

prepend-path    PATH                 $root/bin
prepend-path    MANPATH              $root/share/man

# 加载/卸载提示
if { [ module-info mode load ] } {
    puts stderr "[module-info name] loaded (bin=$root/bin)"
} elseif { [ module-info mode remove ] } {
    puts stderr "[module-info name] unloaded"
}

B.4 modulefile.liblz4-1.9.4

#%Module1.0#####################################################################
##
##  liblz4 1.9.4 modulefile
##  部署路径: /data/apps/liblz4/1.9.4 (git clone lz4 v1.9.4, make && make install PREFIX=...)
##
proc ModulesHelp { } {
    global version root
    puts stderr "liblz4 $version - Fast LZ compression library (dev + runtime)"
    puts stderr "Installed by USERNAME@paratera.com"
    puts stderr "Installed at 2026-3-11 00:42:11"
    puts stderr "  安装路径: $root"
    puts stderr "  include:  $root/include"
    puts stderr "  lib:      $root/lib"
    puts stderr "  pkgconfig: $root/lib/pkgconfig"
    puts stderr ""
    puts stderr "构建方法(供维护参考):"
    puts stderr "  1) 在工作目录克隆源码并进入:"
    puts stderr "     git clone --branch v$version --depth 1 https://github.com/lz4/lz4.git lz4-$version"
    puts stderr "     cd lz4-$version"
    puts stderr "  2) 编译并安装到指定前缀(无需 root):"
    puts stderr "     make -j\\$(nproc)"
    puts stderr "     make install PREFIX=$root"
    puts stderr "  3) 若 PREFIX 目录无写权限,需由有权限用户执行 make install,或将 PREFIX 改为有写权限路径后同步到 $root"
    puts stderr ""
}

set     version     1.9.4
set     root        /data/apps/liblz4/1.9.4

module-whatis "liblz4 $version - LZ4 compression library (headers + libs)"

prepend-path    PATH                 $root/bin
prepend-path    LD_LIBRARY_PATH      $root/lib
prepend-path    LIBRARY_PATH         $root/lib
prepend-path    C_INCLUDE_PATH       $root/include
prepend-path    CPATH                $root/include
prepend-path    CMAKE_INCLUDE_PATH   $root/include
prepend-path    CMAKE_LIBRARY_PATH   $root/lib
prepend-path    PKG_CONFIG_PATH      $root/lib/pkgconfig
prepend-path    MANPATH              $root/share/man

# 加载/卸载提示
if { [ module-info mode load ] } {
    puts stderr "[module-info name] loaded (root=$root)"
} elseif { [ module-info mode remove ] } {
    puts stderr "[module-info name] unloaded"
}

B.5 modulefile.libfuse3-headers-3.10.5

#%Module1.0#####################################################################
##
##  libfuse3-headers 3.10.5 - FUSE3 头文件(仅 include,用于编译时复用系统 libfuse3.so.3)
##  路径: /data/apps/libfuse3-headers/3.10.5/
##
set     version     3.10.5
set     root        /data/apps/libfuse3-headers/3.10.5

proc ModulesHelp { } {
    global version root
    puts stderr "libfuse3-headers $version - FUSE3 headers only (for compile-time)"
    puts stderr "Installed by USERNAME@paratera.com"
    puts stderr "Installed at 2026-3-11 11:59:08"
    puts stderr "  路径: $root"
    puts stderr "  include: $root/include"
    puts stderr ""
    puts stderr "用途: 编译 squashfuse 等时提供 fuse3 头文件,运行时仍使用系统 libfuse3.so.3。"
    puts stderr "来源: 从 libfuse 源码 (https://github.com/libfuse/libfuse) 解压后仅拷贝 include 目录到 $root"
    puts stderr ""
}

module-whatis "libfuse3-headers $version - FUSE3 include only (compile with system libfuse3)"

prepend-path    C_INCLUDE_PATH       $root/include
prepend-path    CPATH                $root/include
prepend-path    CMAKE_INCLUDE_PATH   $root/include

# 加载/卸载提示
if { [ module-info mode load ] } {
    puts stderr "[module-info name] loaded (headers=$root/include)"
} elseif { [ module-info mode remove ] } {
    puts stderr "[module-info name] unloaded"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment