本文档基于 ln01 登录节点与 gpu_4090 / gpu_5090 分区的实测环境,记录在 BSCC-N56R5 集群上从源码构建 Apptainer 1.4.5,并配套部署 LZ4 压缩与 FUSE 挂载 SIF 能力的完整流程。所有路径和脚本均以当前工作目录:
- 工作目录:
/data/run01/${USER}/USERNAME/dev260311 - 应用根目录:
/data/apps
为前提,如在其他账号 / 目录使用,请相应替换前缀。
- 登录节点:
ln01(Ubuntu 22.04.5 LTS,内核 5.15) - Slurm:
- 分区:
gpu_4090、gpu_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
-
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.4cd 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
- 作用:为 Apptainer 1.4.5 及
-
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
- 作用:为
通过 ldconfig -p 验证:
libuuid.so.1/libuuid.solibseccomp.so.2libgpgme.so.11libfuse3.so.3libfuse.so.2libcryptsetup.so.12libz.so(zlib,已装zlib1g-dev)
这些满足 Apptainer 1.4.5 的典型运行时依赖,无需额外 root 操作。
在工作目录:
- 源码路径约定:
/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脚本位置:/data/run01/${USER}/USERNAME/dev260311/build.sh
- 主要行为:
- 使用 Slurm 提交(
#SBATCH --gpus=8 -p gpu_4090) - 通过 SSH 隧道 + git proxy 拉取依赖(如首次编译需要)
- 设置:
SCRIPT_DIR=/data/run01/${USER}/USERNAME/dev260311SRC_DIR=${SCRIPT_DIR}/apptainer-1.4.5PREFIX=/data/apps/apptainer/1.4.5BUILDDIR=${SRC_DIR}/builddir
- 加载依赖 module:
module load golang/1.23.6module load liblz4/1.9.4
- 执行:
./mconfig -b builddir -p $PREFIXmake -C builddir -j$(nproc)make -C builddir install
- 使用 Slurm 提交(
使用方式:
cd /data/run01/${USER}/USERNAME/dev260311
sbatch build.sh构建完成后:
- 可执行文件:
/data/apps/apptainer/1.4.5/bin/apptainer - 建议通过 module 管理(见第 6 节)。
Apptainer 1.4.5 需要 squashfs-tools >= 4.3。本环境选择 4.6.1,并仅启用 gzip + LZ4 压缩,以减少依赖。
位置:/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/includeLDFLAGS:-L/data/apps/liblz4/1.9.4/lib
make参数:
- 进入
make -C squashfs-tools \
GZIP_SUPPORT=1 \
LZ4_SUPPORT=1 \
-j$(nproc)- 安装:
- 复制
mksquashfs、unsquashfs到${PREFIX}/bin - 建立符号链接:
sqfstar -> mksquashfssqfscat -> 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
Apptainer 1.4.5 可以通过 squashfuse_ll 使用 FUSE 直接挂载 SIF 内部的 squashfs 分区,避免「Converting SIF file to temporary sandbox...」导致磁盘占用暴涨。
- 源码目录:
/data/run01/${USER}/USERNAME/dev260311/squashfuse - 获取方式(已完成)示例:
git clone https://github.com/vasi/squashfuse.git
cd squashfuse
git checkout 0.6.1
./autogen.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-gnuFUSE3_INC=/data/apps/libfuse3-headers/3.10.5/includeCPPFLAGS="-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 -j32make 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
所有 modulefile 模板均在工作目录下,建议统一安装到 /data/apps/modulefiles。
- 模板:
modulefile.apptainer-1.4.5 - 目标:
/data/apps/modulefiles/apptainer/1.4.5
示例内容要点:
set root /data/apps/apptainer/1.4.5prepend-path PATH $root/binprepend-path LD_LIBRARY_PATH $root/libconflict apptainer、conflict singularityModulesHelp中包含构建步骤与使用说明。- 加载提示:
需要 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- 模板:
modulefile.squashfuse-0.6.1 - 目标:
/data/apps/modulefiles/squashfuse/0.6.1 - 要点:
PATH增加/data/apps/squashfuse/0.6.1/binMANPATH、PKG_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- 模板:
modulefile.squashfs-tools-4.6.1 - 目标:
/data/apps/modulefiles/squashfs-tools/4.6.1 - 要点:
PATH增加/data/apps/squashfs-tools/4.6.1/binModulesHelp中记录仅启用 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.1modulefile.liblz4-1.9.4→/data/apps/modulefiles/liblz4/1.9.4modulefile.golang-1.23.6→/data/apps/modulefiles/golang/1.23.6modulefile.libfuse3-headers-3.10.5→/data/apps/modulefiles/libfuse3-headers/3.10.5
示例(1 卡 4090):
salloc -p gpu_4090 --gpus=1
module use /data/apps/modulefiles
module load apptainer/1.4.5
apptainer --versionmodule 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,不再在临时目录解包整镜像。
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本指南在 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.sh、build_squashfuse.sh、build_squashfs_tools.sh)和 modulefiles,将部署过程固化,便于后续在其他账号 / 节点复现。
维护或迁移时,仅需调整少量前缀路径(/data/apps、工作目录)即可在新环境重建同样的 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 ""#!/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#!/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 ""#%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"
}#%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"
}注意:下方 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"
}#%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"
}#%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"
}