Linux 上用 Docker 跑新版 COMSOL:解决 glibc 版本不够的问题

前言 如果你的服务器是 Ubuntu 18.04(或更老)但想用 COMSOL 6.3 / 6.4 这种新版本,安装时大概率会被这个错误劝退: glibc 2.28 not found This installation of COMSOL requires glibc 2.28 or later ...
Linux 上用 Docker 跑新版 COMSOL:解决 glibc 版本不够的问题
Linux 上用 Docker 跑新版 COMSOL:解决 glibc 版本不够的问题

前言

如果你的服务器是 Ubuntu 18.04(或更老)但想用 COMSOL 6.3 / 6.4 这种新版本,安装时大概率会被这个错误劝退:

glibc 2.28 not found
This installation of COMSOL requires glibc 2.28 or later

Ubuntu 18.04 自带 glibc 2.27,COMSOL 6.3+ 要求 2.28+,版本差一点点装不上

不要手动升级 glibc。glibc 是所有二进制程序的基础,强行替换会让系统启动不了、SSH 也登不进去,云服务器直接报废。

正确的解决方案是 Docker 容器化:在容器里跑新版 Ubuntu,里面装 COMSOL;宿主机系统完全不动。本文以 Ubuntu 18.04 + COMSOL 6.4 为例,记录完整流程和踩过的坑。


一、整体思路

  • 文件永远在宿主机上,容器只是临时借用 CPU/内存来运行
  • COMSOL 装在宿主机的 /opt/comsol64/ 里,容器删了文件还在
  • 容器和宿主机之间通过 挂载(bind mount) 共享目录
  • GUI 通过宿主机的 X11 socket 转给已有的 VNC 桌面

二、安装 Docker(Ubuntu 18.04专属)

2.1 Docker 官方源不再支持 Ubuntu 18.04

Ubuntu 18.04 在 2023 年 EOL,Docker 官方仓库已经不再为 bionic 发包。如果你用网上常见的 docker-ce 教程,会报:

E: 仓库 "https://download.docker.com/linux/ubuntu bionic Release" 没有 Release 文件

直接用 Ubuntu 自带源的 docker.io 就行,版本 20.10,跑容器完全够用。

2.2 安装

sudo apt update
sudo apt install -y docker.io

# 启动并开机自启
sudo systemctl enable --now docker

# 加当前用户到 docker 组(免 sudo)
sudo usermod -aG docker $USER

# 必须重新登录让组生效
exit
# 重新 SSH 进来

2.3 配置镜像加速(国内必做)

直连 Docker Hub 经常超时,配国内镜像加速:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.nju.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

2.4 验证

docker --version
docker run --rm hello-world

# 拉一下我们要用的 Ubuntu 22.04 基础镜像
docker pull ubuntu:22.04

hello-world 能跑出 “Hello from Docker!”、ubuntu:22.04 能拉下来就成。


三、准备目录和 ISO

# 宿主机上的目录规划
sudo mkdir -p /opt/comsol64        # COMSOL 安装目标
sudo chown -R $USER:$USER /opt/comsol64
mkdir -p ~/comsol_iso              # 放 ISO
mkdir -p ~/comsol_work             # 工作文件(.mph)
mkdir -p ~/comsol-docker           # Dockerfile 目录

# 把你的 COMSOL ISO 文件放到 ~/comsol_iso/
# 比如从你 Mac 上传:
# scp ~/Downloads/COMSOL.6.4.293.x64_dvd.iso zzz@<服务器IP>:~/comsol_iso/

ls -lh ~/comsol_iso/
# 应该看到几个 GB 的 ISO 文件

:light_bulb: 目录名 comsol64 只是个标签,里面装什么版本都行。装 6.3 也可以叫 comsol64,纯习惯问题。


四、写 Dockerfile 并构建镜像

cd ~/comsol-docker

cat > Dockerfile << 'EOF'
FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai

# COMSOL 运行需要的所有依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    # X11 基础
    libx11-6 libxext6 libxrender1 libxrandr2 libxi6 \
    libxcursor1 libxinerama1 libxft2 libxtst6 libxss1 \
    libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \
    # OpenGL
    libgl1 libglu1-mesa libegl1 libgles2 \
    # 字体
    libfontconfig1 libfreetype6 fontconfig \
    fonts-dejavu fonts-liberation fonts-noto-cjk \
    # GTK / WebKit (COMSOL 帮助系统)
    libgtk-3-0 libwebkit2gtk-4.0-37 \
    libatk1.0-0 libatk-bridge2.0-0 libnss3 libcups2 \
    # 音频和常用库
    libasound2 libgomp1 \
    # 消除 GTK 警告(可选但推荐)
    libcanberra-gtk-module libcanberra-gtk3-module \
    librsvg2-common shared-mime-info \
    # 工具
    xauth ca-certificates locales \
    && rm -rf /var/lib/apt/lists/* \
    && fc-cache -fv

RUN locale-gen en_US.UTF-8 zh_CN.UTF-8
ENV LANG=en_US.UTF-8

# 创建和宿主机一致的用户(避免文件权限问题)
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG USER_NAME=zzz
RUN groupadd -g ${GROUP_ID} ${USER_NAME} && \
    useradd -m -u ${USER_ID} -g ${GROUP_ID} -s /bin/bash ${USER_NAME}

USER ${USER_NAME}
WORKDIR /home/${USER_NAME}

CMD ["/bin/bash"]
EOF

构建:

cd ~/comsol-docker
docker build \
    --build-arg USER_ID=$(id -u) \
    --build-arg GROUP_ID=$(id -g) \
    --build-arg USER_NAME=$(whoami) \
    -t comsol-runtime .

$(id -u)$(id -g)$(whoami) 自动取当前用户的 UID/GID/用户名。这一步至关重要——让容器内的用户和宿主机一致,避免后续保存的文件权限混乱(不然 .mph 文件会归属 root,宿主机用户改不动)。

构建大概 3–5 分钟,看到 Successfully tagged comsol-runtime:latest 即成功。


五、在容器里安装 COMSOL(要在 VNC 桌面里操作)

:warning: 这一步必须在 VNC 桌面的终端里跑,因为 COMSOL 安装器是 GUI,需要图形界面。

5.1 连进 VNC 桌面

用 RealVNC Viewer / TurboVNC Viewer 连到服务器的 VNC 桌面。桌面里打开终端(XFCE 的 Terminal Emulator)。

验证你在对的地方:

echo $DISPLAY
# 应该是 :1 或类似,不能是空、不能是 localhost:10.0(那是 SSH 转发)

5.2 挂载 ISO

sudo mkdir -p /mnt/comsol_iso
sudo mount -o loop ~/comsol_iso/COMSOL.6.4.293.x64_dvd.iso /mnt/comsol_iso

# 验证
ls /mnt/comsol_iso/
# 应该看到 setup、setupgui、bin/ 等

文件名按你实际的 ISO 改。挂载时提示 WARNING: device write-protected, mounted read-only正常的,ISO 本来就是只读的。

5.3 允许容器访问 X11

xhost +local:
# 输出 "non-network local connections being added to access control list"

5.4 启动安装容器

docker run --rm -it \
    --name comsol-installer \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
    -v /mnt/comsol_iso:/iso:ro \
    -v /opt/comsol64:/usr/local/comsol/multiphysics:rw \
    -v $HOME/comsol_work:/home/$(whoami)/comsol_work \
    --net=host \
    --shm-size=4g \
    comsol-runtime \
    bash

进入容器后提示符可能看起来和宿主机一样(因为我们用了同样的用户名),验证一下:

# 容器内
ldd --version | head -1
# ldd (Ubuntu GLIBC 2.35-...) 2.35  ← 容器里是 2.35,证明在容器里

cat /etc/os-release | grep VERSION
# VERSION="22.04 ..."

5.5 运行安装器

cd /iso
./setup

GUI 窗口会弹到你的 VNC 桌面上。安装时的关键设置

步骤 选什么 License 按你的许可证类型选 Install Directory :warning: 手动改成 /usr/local/comsol/multiphysics Components 按需勾选模块 Install Directory 这一步特别重要

COMSOL 默认建议 /usr/local/comsol64/multiphysics 这种带版本号的路径,但容器里这个目录不存在,而 /usr/local/ 是 root 拥有的,容器里的用户没权限创建——会报"目标文件夹无效"。

必须手动改成 /usr/local/comsol/multiphysics(去掉 comsol64 那一层),这个路径已经是我们挂载好的目录,可以写。

填好后 Next,安装 10–30 分钟,看你勾了多少模块。

5.6 安装完成

# 容器内验证
ls /usr/local/comsol/multiphysics/bin/
# 应该看到 comsol 文件

exit    # 退出容器

宿主机验证:

ls /opt/comsol64/bin/
# 同样应该看到 comsol,证明文件持久化了

卸载 ISO(不再需要):

sudo umount /mnt/comsol_iso

六、写启动脚本

6.1 GUI 模式启动脚本

cat > ~/run_comsol.sh << 'SCRIPT_EOF'
#!/bin/bash
# COMSOL 6.4 GUI 启动脚本

if [ -z "$DISPLAY" ]; then
    echo "错误:DISPLAY 变量为空,请在 VNC 桌面终端里运行"
    exit 1
fi

xhost +local: > /dev/null

docker run --rm -it \
    --name comsol \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
    -v /opt/comsol64:/usr/local/comsol/multiphysics \
    -v $HOME/comsol_work:/home/$(whoami)/comsol_work \
    --net=host \
    --shm-size=8g \
    comsol-runtime \
    /usr/local/comsol/multiphysics/bin/comsol -3drend sw "$@"
SCRIPT_EOF

chmod +x ~/run_comsol.sh

-3drend sw 是软件渲染参数,适合无 GPU 的服务器。如果有显卡用硬件加速,去掉这个参数(或换成 -3drend ogl)。

6.2 Batch 模式启动脚本

cat > ~/run_comsol_batch.sh << 'SCRIPT_EOF'
#!/bin/bash
# COMSOL 6.4 Batch 模式启动脚本
# 用法: ./run_comsol_batch.sh input.mph output.mph [其他 comsol batch 参数]

if [ $# -lt 2 ]; then
    echo "用法: $0 <input.mph> <output.mph> [其他参数]"
    echo "示例: $0 model.mph result.mph -np 48"
    exit 1
fi

INPUT="$1"
OUTPUT="$2"
shift 2
EXTRA_ARGS="$@"

INPUT_NAME=$(basename "$INPUT")
OUTPUT_NAME=$(basename "$OUTPUT")
LOG_NAME="${OUTPUT_NAME%.mph}.log"

docker run --rm \
    --name comsol-batch-$$ \
    -v /opt/comsol64:/usr/local/comsol/multiphysics \
    -v $HOME/comsol_work:/home/$(whoami)/comsol_work \
    --net=host \
    --shm-size=16g \
    comsol-runtime \
    /usr/local/comsol/multiphysics/bin/comsol batch \
    -inputfile /home/$(whoami)/comsol_work/$INPUT_NAME \
    -outputfile /home/$(whoami)/comsol_work/$OUTPUT_NAME \
    -batchlog /home/$(whoami)/comsol_work/$LOG_NAME \
    $EXTRA_ARGS
SCRIPT_EOF

chmod +x ~/run_comsol_batch.sh

6.3 设置别名(可选,避免影响其他用户)

如果服务器多人共用一个账号,老用户可能还在用 COMSOL 6.1(不要碰他们的环境)。只给自己加新版本的快捷命令:

echo 'alias comsol64="$HOME/run_comsol.sh"' >> ~/.bashrc
source ~/.bashrc

效果:

  • 老用户 comsol → 继续走 PATH 里的老版本(不受影响)
  • comsol64 → 走 Docker 跑新版本

七、日常使用

7.1 GUI 交互模式

每次工作流:

  1. Mac 打开 RealVNC Viewer,连服务器 :1
  2. VNC 桌面里打开 XFCE 终端
  3. 跑:
    ~/run_comsol.sh
    # 或用 alias
    comsol64
    
  4. COMSOL 启动,正常用,保存的 .mph 文件存到 ~/comsol_work/

打开已有文件:

comsol64 -open /home/zzz/comsol_work/mymodel.mph

注意路径用容器内的(/home/zzz/comsol_work/),等于宿主机的 ~/comsol_work/

7.2 Batch 模式(推荐用于大模型)

不需要 GUI,可以 SSH 直接跑、扔后台、关掉终端继续算:

# 文件先放进 ~/comsol_work/
cp mymodel.mph ~/comsol_work/

# 前台跑
~/run_comsol_batch.sh mymodel.mph result.mph -np 48

# 扔后台跑(推荐)
nohup ~/run_comsol_batch.sh mymodel.mph result.mph -np 48 \
    > batch.out 2>&1 &

7.3 监控正在跑的 batch

# 看容器状态
docker ps

# 看 COMSOL 求解日志
tail -f ~/comsol_work/result.log

# 看容器资源占用
docker stats

# 判断是否完成(recovery 文件消失 = 任务结束)
ls ~/comsol_work/result.mph.recovery 2>/dev/null || echo "完成"

7.4 batch 常用参数

~/run_comsol_batch.sh model.mph result.mph \
    -np 48 \                # 使用 48 核
    -study std1 \           # 只跑名为 std1 的研究
    -paramfile params.txt   # 参数扫描

# 看全部参数
docker run --rm comsol-runtime \
    /usr/local/comsol/multiphysics/bin/comsol batch -help

实测在 Ubuntu 18.04 上跑 COMSOL 6.4,性能和原生安装基本无差异(容器化的性能损耗对计算密集型应用几乎可以忽略)。唯一的代价是首次启动多 1-2 秒(加载共享库),后续启动就秒开。

希望这篇能帮到同样卡在 glibc 版本问题上的同学。有补充欢迎反馈。

1 个帖子 - 1 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文