No description
  • Python 99.4%
  • Dockerfile 0.6%
Find a file
2025-07-10 11:08:33 +08:00
abq2021 Initial commit 2025-05-25 22:33:38 +08:00
abq2024 Clarify installation guide 2025-07-10 11:08:33 +08:00
abq_license_separated Add guide for building Abaqus 2024 image and for Abaqus/license separated deployment 2025-07-08 21:37:49 +08:00
resources/readme Initial commit 2025-05-25 22:33:38 +08:00
.gitignore Add guide for building Abaqus 2024 image and for Abaqus/license separated deployment 2025-07-08 21:37:49 +08:00
README.md Clarify installation guide 2025-07-10 11:08:33 +08:00

Docker版Abaqus兼容各种Linux版本开箱即用

本文分享了我制作的Abaqus 2021的Docker镜像可以在任何装有Docker的Linux系统上运行包括WSL无需复杂的安装过程开箱即用。下载链接使用方法详见后文。

For English readers, I am sorry that there is no English version of this README because this repository is primarily targeted at Chinese users and I do not have time to translate it into English. FYI, there are other repositories that provide similar solutions in English, such as willfurnass/abaqus-2017-centos-7-singularity, ksHamburg/ABQ2021_on_ubuntu20.04, and danielabler/dockerfiles.

声明

本Abaqus Docker镜像为破解版仅供学习研究请勿用于商业用途。我坚决尊重软件开发商的知识产权呼吁所有用户共同遵守相关法律法规。同时我坚决支持国产工业软件的发展认为国产工业软件在推动国家科技进步和产业升级方面发挥着至关重要的作用。

背景

在Linux上安装Abaqus要比在Windows上复杂一些因为Linux版的Abaqus高度依赖系统的glibc以及其他库文件的版本。在具有高版本glibc的Linux系统上使用低版本Abaqus时可能会遇到问题。

要查看系统的glibc版本可以使用命令 ldd --version

Abaqus官方的Linux安装程序会检查系统的发行版信息限制其只能安装在RHEL系列的系统上但只要修改安装脚本就可以绕过这一限制安装在其他发行版上例如Ubuntu然而顺利安装并不意味着Abaqus能够成功运行。 例如,根据这个issue在glibc版本>=2.25的系统上Abaqus 2020的standard求解器无法正常中止。尽管官方后来发布了Abaqus 2020的Hotfix版本修复了这个问题但由于没有好心人发布该Hotfix版本的破解版因此对于不花钱的用户来说这个问题依然无法解决。

要避免glibc的兼容性问题当然可以使用低版本glibc的系统比如在CentOS 7这种老系统glibc版本为2.17上安装运行古董的Abaqus 6.14就没有问题。但是一些现代化的软件早就抛弃低版本glibc了比如VSCode从1.86版本开始要求远程服务器的glibc版本>=2.28。所以要使用Abaqus就只能放弃新系统的便利性。

解决方案

据我所知Abaqus虽然依赖glibc版本但对Linux内核版本没什么要求。因此可以利用容器技术在高版本系统上安装和运行低版本Abaqus。在安装有Docker的Linux系统中只需要新建一个包含低版本glibc的Docker容器就可以在其中安装和运行低版本Abaqus而不会受到系统glibc版本的限制。

性能方面完全无需担心。Docker的性能损失非常小我在实际使用中没感觉到Abaqus在Docker中和直接运行的速度有差别。

如果是在Windows中的WSL2中运行Docker相比于直接在Windows中运行Abaqus大概有15%的性能损失。不过这应该是WSL2的性能问题而不是Docker的问题。

在Docker中运行Abaqus还能避免残留问题。如果容器中的Abaqus没能正常中止可以直接删除容器相应的Abaqus进程会被杀掉Abaqus scratch目录中的临时文件也会被删除不会残留。

使用Docker的另一个好处是快速部署。只要将Abaqus制作成Docker镜像就可以将Abaqus部署到任何装有Docker的系统上运行无需再次安装真正实现开箱即用。Abaqus的Docker镜像的过程比较繁琐无法通过Dockerfile自动化需要先在基础容器中手动安装Abaqus然后再commit成镜像。不过这个过程只需要做一次之后就能一劳永逸地使用了。

镜像下载

我制作了Abaqus 2021和Abaqus 2024的Docker镜像可以在任何装有Docker的系统中运行。

我制作的镜像包含Standard、Explicit、CAE可以使用GUI、ODB API、以及Cosimulation Services支持User Subroutines。不过因为关联的是gfortran不是Intel Fortran我不保证所有User Subroutines都能正常工作。这个Abaqus镜像的详细制作过程详见后文镜像制作过程

我应该不是国内第一个做Abaqus Docker镜像的人Dockerhub上早就有了其他人做的但我这个应该是功能最全的而且这份README也是目前最详细的。

镜像内容 文件名 大小 链接 MD5
Abaqus 2021 abq2021.tar.xz 1.77 GiB 清华大学云盘 4c599c6e16ba46c81a915d598349582c
Abaqus 2024 abq2024.tar.xz 3.38 GiB 清华大学云盘 8586471644d26d5a5aa2ff3a1ae3c5f4

如果有需要可以联系我制作其他版本的Abaqus的Docker镜像

以上镜像已在以下Linux发行版上测试过

  • Abaqus 2021CentOS 7、Ubuntu 20.04、WSL中的Ubuntu 24.04
  • Abaqus 2024Ubuntu 20.04

我没有把镜像上传到Dockerhub或Github Container Registry主要有两点原因。一是国内访问这些网站受到限制可能不方便拉取这么大的镜像。二是因为版权问题毕竟是破解版软件在国内传播就好就不往外网传了。

使用方法

下文以Abaqus 2021镜像为例介绍使用方法。Abaqus 2024的使用方法类似只需将镜像名和容器名分别改为abq2024和abq2024app即可。

导入镜像

下载abq2021.tar.xz到本地使用xz解压缩得到镜像的打包文件abq2021.tar

xz -dv abq2021.tar.xz

使用以下命令导入镜像:

docker load -i abq2021.tar

导入镜像要几分钟。导入完成后,可以使用 docker images 命令查看镜像或者使用VSCode的Docker插件查看镜像。

创建容器应用不使用CAE图形界面

若不需要使用CAE图形界面则非常简单只需使用以下命令创建一个名为abq2021app的容器。

docker run -d --mount type=bind,source=/home,target=/home --name abq2021app abq2021

该命令在创建容器时,将主机的 /home 目录挂载到容器的 /home 目录,这样容器内就可以直接访问主机 /home 目录下的文件。

创建这个容器一般只需几秒钟不过我也曾遇到用时几分钟的情况原因我也不清楚。创建好容器后就可以在容器中使用Abaqus了。

在容器中以root账户运行Abaqus

创建好容器后就可以运行Abaqus了默认是以root账户运行的。例如要求解Job-1.inp可以用命令

docker exec -it abq2021app /bin/bash

进入容器然后在容器中调用Abaqus

cd /path/to/Job-1.inp
abaqus job=Job-1

或者也可以不进入容器直接调用Abaqus。注意要加上 --workdir 参数指定工作目录。

cd /path/to/Job-1.inp
docker exec --workdir $(pwd) abq2021app abaqus job=Job-1

注意在容器中以root账户运行Abaqus所产生的各种文件的权限均为root。

在容器中以非root账户运行Abaqus

要让docker中的Abaqus以特定用户的权限读写宿主机的文件就需要在容器中创建一个与宿主机用户具有相同UID和GID的用户并且在exec时通过参数 --user UID:GID 指定这个UID和GID。如果容器中没有这个UID还使用 --user UID:GID 强行指定UID和GID那Abaqus许可证服务将无法正常运行。

例如宿主机有个用户叫zhangsanUID和GID都是1001那么只需要在容器中创建一个UID和GID都是1001的用户无论叫不叫zhangsan都行然后指定以UID=1001的身份运行Abaqus即可。

以zhangsan举例在宿主机上执行以下命令在容器中创建一个与zhangsan相同UID和GID的用户user1001

su zhangsan
docker exec abq2021app bash -c "groupadd -g $(id -g) group$(id -g)"
docker exec abq2021app bash -c "useradd -u $(id -u) -g $(id -g) -d /tmp/user$(id -u) user$(id -u)"

之后就可以在宿主机上通过以下命令来运行Abaqus。

docker exec --workdir $(pwd) --user $(id -u):$(id -g) abq2021app abaqus job=Job-1

这种动态创建用户的方法肯定不是正道只能算是一种技巧但确实能解决问题。我不清楚Docker中是否有更好的方法来解决这个问题如果有欢迎指正。

建立快捷方式

每次运行Abaqus都要输入这么长的命令很麻烦用非root账户运行还要在容器中创建用户就更麻烦了。为此可以通过以下方法建立快捷方式之后只需输入 abq2021 命令即可运行Abaqus。

/usr/local/bin 目录下创建一个脚本文件 abq2021 ,内容如下:

#!/bin/bash

# Ensure current user has permission to run docker.
# Check if current user is root or in docker group.
if [ "$(id -u)" -ne 0 ] && [ "$(id -Gn | grep -cw 'docker')" -eq 0 ]; then
    echo "Current user is not in docker group. Please add current user to docker group."
    exit 1
fi

# Ensure the container named "abq2021app" is running.
if ! docker ps --format '{{.Names}}' | grep -q '^abq2021app$'; then
    echo "Docker container 'abq2021app' is not running. Please start the container first."
    exit 1
fi

# Create a new user in the container with the same UID and GID as the host user.
# The group and user will only be created if not already exist.
docker exec --user root abq2021app bash -c \
"if ! getent group $(id -g) > /dev/null 2>&1; then groupadd -g $(id -g) group$(id -g); fi"
docker exec --user root abq2021app bash -c \
"if ! getent passwd $(id -u) > /dev/null 2>&1; then useradd -u $(id -u) -g $(id -g) -d /tmp/user$(id -u) user$(id -u); fi"

# Run abaqus in the container with the new user.
docker exec --workdir "$(pwd)" --user "$(id -u):$(id -g)" abq2021app abaqus "$@"

保存并退出,然后给这个脚本文件赋予执行权限:

chmod +x /usr/local/bin/abq2021

此后,所有具有 Docker 操作权限的用户都可以直接使用 abq2021 命令运行 Abaqus。如果当前用户没有 Docker 权限,可以通过执行 sudo usermod -aG docker $USER 将其加入 docker 用户组,操作完成后需注销并重新登录以使权限生效。

创建并使用容器应用需要使用CAE图形界面

如果需要使用CAE图形界面操作会稍微复杂一些尤其需要注意用户权限的问题。在当前用户的桌面环境下运行以下命令启动容器

docker run -d --mount type=bind,source=/home,target=/home --volume=/tmp/.X11-unix/:/tmp/.X11-unix/ --env="DISPLAY" --name abq2021app abq2021

这里,--volume=/tmp/.X11-unix/:/tmp/.X11-unix/ 用于将宿主机的X11 socket文件挂载到容器中--env="DISPLAY" 用于将当前用户的DISPLAY环境变量传递给容器。

注意这种方式仅适用于当前用户的桌面环境因为传递给容器的DISPLAY变量就是当前用户的。在运行容器时也应以当前用户的身份运行而不是root账户否则会出现权限问题除非使用 xhost + 命令允许root账户访问X11服务器。

在启动CAE图形界面前建议像前文所述在容器中创建一个与当前用户UID和GID相同的用户并在执行exec时通过 --user UID:GID 参数指定。这些步骤可以通过前面介绍的快捷方式脚本 abq2021 实现。在桌面环境下运行以下命令即可启动CAE图形界面

abq2021 cae -mesa

注意:一定要加上 -mesa 参数,否则由于缺少依赖库,图形界面无法正常启动。该参数的作用是关闭硬件加速,改用软件渲染。

其他注意事项

经过测试,如果创建容器时设置 --net=host MPI将无法正常工作从而导致Abaqus/Explicit无法在mp_mode=mpi模式下多核并行。MPI与容器的兼容性问题非常复杂参考文档),这里不做讨论。

镜像制作过程

这部分是我制作Abaqus 2021的Docker镜像的过程仅供参考。

Abaqus 2024镜像的制作过程详见abq2024目录

前置工作

准备好Abaqus 2021的Linux安装包这个安装包是有破解的我就不提供了。安装包里应该包含

  • DS.SIMULIA.Suite.2021.Linux64里面有1、3、4、5几个子文件夹
  • Crack里面的SolidSQUAD_License_Servers是许可证服务器

此外备好centos7镜像可以参考CentOS Docker Official Images,使用以下命令拉取:

docker pull centos:7

国内访问Dockerhub受到限制可以使用国内的镜像加速服务具体方法此处不介绍了。

1. 搭建Abaqus安装环境

这一步可以通过编写Dockerfile来自动化我已经编写好了详见 abq2021/step-1-preliminary 目录。使用以下命令就可以创建一个名为abq2021-tmp1的临时镜像该临时镜像是后续安装Abaqus的基础。

cd /path/to/abq2021/step-1-preliminary
docker build -t abq2021-tmp1 .

注意因为涉及到yum install所以需要网络畅通。过程中出现红字不用怕只要不是错误就行。

以下是对Dockerfile中操作的详细解释

安装Abaqus前需要先在CentOS 7镜像中开启systemd服务并安装Abaqus安装所需的依赖库。

CentOS镜像中的systemd服务默认是关闭的而安装许可证服务需要systemd服务所以需要开启systemd服务。官方给出了开启的办法但有点麻烦有个更简单的办法参考这个项目

官方的CentOS 7镜像非常精简缺少许多命令和库文件。根据我的安装经历Abaqus依赖以下库文件

yum install sudo dos2unix perl libX11 libjpeg libXext

其中sudo、dos2unix和perl对于我所使用的安装包来说是必需的但可能并非所有安装包都依赖这三个。libX11、libjpeg和libXext则是Abaqus CAE运行所必需的依赖库。

此外如果需要User Subroutine那么还需要安装Fortran编译器这里使用gfortran。

yum install gcc-gfortran

如果不怕折腾也可以挑战一下Intel Fortran。这部分后文有更详细的说明

如果要用C++编写User Subroutine还需要安装g++。不过估计没人用C++写子程序,这里我就没装。

2. 手动安装Abaqus

这一步需要手动操作。首先需要修改Abaqus安装脚本以便能够在容器中的CentOS 7上顺利安装否则直接运行安装脚本会报错。

  • 修改安装包中所有的 *.sh 脚本的第一行的shebang#!/bin/sh 改成 #!/bin/bash

  • 修改安装包中所有名为 Linux.sh 的脚本,删除如下几行

      which lsb_release
      DSY_OS_Release=`lsb_release --short --id |sed \'s/ //g\'`
      echo "DSY_OS_Release=\""${DSY_OS_Release}"\""
    

    同时将 export DSY_OS_Release=${DSY_OS_Release} 改为 export DSY_OS_Release=CentOS

以上两步操作我已经写成了一个python脚本可以直接使用详见 step-2-installation 目录中的 modify_installation_file.py ,运行这个脚本,输入安装包所在的目录,即可完成以上两步操作。

之后给整个Abaqus安装包赋予读写执行权限。

chmod -R 777 DS.SIMULIA.Suite.2021.Linux64

接下来就可以在容器中手动安装Abaqus了。创建一个刚制作的abq2021-tmp1镜像的容器并把Abaqus安装包挂载到容器中。切换到 DS.SIMULIA.Suite.2021.Linux64 所位于的目录,使用以下命令:

docker run -d --mount type=bind,source=/absolute/path/to/DS.SIMULIA.Suite.2021.Linux64,target=/root/DS.SIMULIA.Suite.2021.Linux64 --name abq2021-tmp1-1 abq2021-tmp1

将安装包挂载到容器的 /root 目录下。

进入容器abq2021-tmp1-1

docker exec -it abq2021-tmp1-1 /bin/bash

如果挂载成功,应该可以在 root 目录下看到 DS.SIMULIA.Suite.2021.Linux64

在容器中执行命令行版本的安装脚本运行Abaqus安装程序。

./root/DS.SIMULIA.Suite.2021.Linux64/1/StartTUI.sh

Abaqus安装要点

  1. 安装第一步去掉默认勾选的Isight保留勾选

    5 [*] SIMULIA Established Products
    6 [*] SIMULIA Established Products CAA API
    
  2. 按照提示输入文件夹4的路径/root/DS.SIMULIA.Suite.2021.Linux64/4 ,之后确认。

  3. 选择安装产品的时候只选择1-5

    1 [*] Abaqus/Standard Solver
    2 [*] Abaqus/Explicit Solver
    3 [*] Cosimulation Services
    4 [*] Abaqus ODB API Services
    5 [*] Abaqus CAE
    6 [ ] Abaqus Samples
    ...
    

    提示为了节省空间我没有安装Abaqus Samples约700 MiB这不影响使用但运行 abaqus verify -user_exp 时会提示验证失败因为验证user_exp所依赖的算例文件是随Abaqus Samples一起安装的。

  4. 提示安装许可证时,注意选择"Skip licensing configuration"。后面会手动安装许可证服务。

    1 ( ) SIMULIA FLEXnet
    2 ( ) DSLS
    3 (X) Skip licensing configuration
    
  5. 之后一路默认安装即可。

至此Abaqus安装完毕。

关联Fortran编译器

要使用User Subroutines就需要关联Fortran编译器。Abaqus 2021默认采用Intel Fortran编译器但Intel Fortran是Intel Parallel Studio XE的一部分是收费的。不想花钱可以使用gfortran。

在之前的步骤1中已经安装了gfortran编译器现在只需要修改Abaqus的一个配置文件即可我参考了这个文档)。

对容器中 /usr/SIMULIA/EstProducts/2021/linux_a64/SMA/site/lnx86_64.env 文件做以下修改:

  • 修改编译器,将

    fortCmd = "ifort"   # <-- Fortran compiler
    

    改为

    fortCmd = "gfortran"   # <-- Fortran compiler
    
  • 修改编译选项,将这一串很长的编译选项

    compile_fortran = [fortCmd,
                       '-V',
                       '-c', '-fpp','-fPIC','-extend_source',
                       '-DABQ_LNX86_64', '-DABQ_FORTRAN',
                       '-auto',    # <-- important for thread-safety of parallel user subroutines
                       '-pc64',                  # set FPU precision to 53 bit significand
                       '-align', 'array64byte',
                       '-prec-div', '-prec-sqrt',# improve precision of FP divides and sqrt
                       '-fp-model', 'precise',   # floating point model: precise
                       '-fimf-arch-consistency=true', # math library consistent results
                       '-mP2OPT_hpo_vec_divbyzero=F',
                       '-no-fma',                # disable floating point fused multiply-add
                       '-fp-speculation=safe',   # floating point speculations only when safe
                       '-fprotect-parens',       # honor parenthesis during expression evaluation
                       '-fstack-protector-strong', # enable stack overflow protection checks
                       '-reentrancy', 'threaded',  # important for thread-safety
                       #'-init=zero','-init=arrays',  # automatically initialize all arrays to zero
                       #'-init=snan', '-init=arrays', # automatically initialize all arrays to SNAN
                       '-msse3',                      # generate SSE3, SSE2, and SSE instructions
                       '-axcore-avx2,avx',    
                       '-WB', '-I%I', '-I'+abaHomeInc, '%P']
    

    改为

    compile_fortran = [fortCmd,
                       '-c', '-fPIC', '-extend_source',
                       '-Warray-bounds', '-I%I']
    
  • 修改链接选项,将这一串链接选项

    link_sl = [fortCmd,
               '-V',           
               '-cxxlib', '-fPIC', '-threads', '-shared','-Wl,--add-needed', 
               '%E', '-Wl,-soname,%U', '-o', '%U', '%F', '%A', '%L', '%B', '-parallel',           
               '-Wl,-Bdynamic', '-shared-intel']
    

    改为

    link_sl = [fortCmd,
               '-fPIC', '-pthread', '-shared',
               '%E', '-Wl,-soname,%U', '-o', '%U', '%F',   '%A', '%L', '%B',
               '-Wl,-Bdynamic', '-lifport', '-lifcoremt']
    

这样就可以了。可以通过命令 abaqus verify -user_std 来验证是否成功关联Fortran编译器。如果提示PASS说明关联成功。

安装完成后, exit 退出容器将容器的更改提交为一个新的临时镜像abq2021-tmp2

docker commit abq2021-tmp1-1 abq2021-tmp2

3. 安装Abaqus许可证服务

在步骤2中我们选择了"Skip licensing configuration"现在我们需要手动安装Abaqus许可证服务并修改Abaqus许可证配置文件。

在宿主机中将Abaqus安装包中Crack文件夹下的SolidSQUAD_License_Servers拷贝到step-3-license目录中。注意是将SolidSQUAD_License_Servers文件夹拷贝到step-3-license目录中而不是拷贝文件夹中的内容。

目录结构如下:

step-3-license
├── SolidSQUAD_License_Servers
│   ├── Vendors
│   ├── Windows
│   ├── install_or_update.bat
│   ├── install_or_update.sh
│   └── ...
└── Dockerfile

给整个SolidSQUAD_License_Servers文件夹赋予读写执行权限

chmod -R 777 /path/to/SolidSQUAD_License_Servers

接下来的步骤可以通过Dockerfile自动化完成我已经编写好了详见 abq2021/step-3-license 目录。使用以下命令创建一个名为abq2021-tmp3的临时镜像

cd /path/to/abq2021/step-3-license
docker build -t abq2021-tmp3 .

以下是对Dockerfile中操作的详细解释

以abq2021-tmp2为基础镜像安装许可证服务。

首先拷贝宿主机的SolidSQUAD_License_Servers到容器中的 /usr 目录下,并对文件 SolidSQUAD_License_Servers/install_or_update.sh 做如下修改,将

INITSYSTEM="`detect_linux_init_system`"

这句改成

INITSYSTEM="systemd"

修改的原因的是容器中的systemd与真实系统中的systemd有所不同detect_linux_init_system函数无法正确识别systemd。如果不修改会导致安装脚本执行失败。

在执行安装脚本之前,先创建一个软链接,否则会提示找不到 ld-lsb.so.3 。在容器中执行以下命令:

ln -s /usr/lib64/ld-linux-x86-64.so.2 /lib/ld-lsb.so.3

完成以上操作后,在容器中执行许可证服务器的安装脚本:

/usr/SolidSQUAD_License_Servers/install_or_update.sh

注意安装许可证LMGRD时出现 sed: cannot rename /etc/sed*****: Device or resource busy 是正常的现象,不用管。

安装完成后,进行破解。修改 /usr/SIMULIA/EstProducts/2021/linux_a64/SMA/site/custom_v6.env 文件,将

license_server_type=DSLS
dsls_license_config="/var/DassaultSystemes/Licenses/DSLicSrv.

改为

license_server_type=FLEXNET
abaquslm_license_file="27800@localhost"

注意27800是许可证服务的端口号端口号取决于具体的许可证文件。至此完成许可证的配置即破解完成。

最后,需要将 /var/DassaultSystemes/SIMULIA/Commands 添加到环境变量PATH中以便直接调用abaqus命令。

在启动容器时,要启动许可证服务,命令如下:

systemctl start flexlmsrvssq

4. Squash镜像

上一步得到的临时Docker镜像已经几乎可以正常使用了但在Abaqus调用MPI时例如使用mp_mode=mpi进行多核并行时会报以下警告

Unexpected end of /proc/mounts line `overlay / overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/l/...

这似乎是由MPI的bug引起的详见这个问题。由于Docker是分层存储的经过前三步制作的镜像中包含了许多层导致 /proc/mount 文件中一行超过512个字符MPI无法正确解析。

解决方法是使用将镜像squash成一个层这样就没问题了。

我使用了docker-squash工具。pip安装完docker-squash后使用以下命令将镜像squash成一个层

docker-squash -f $(($(docker history abq2021-tmp3 | wc -l | xargs)-1)) -t abq2021:latest abq2021-tmp3

至此Abaqus 2021的Docker镜像制作完毕。