马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 TYUTlfx 于 2025-6-9 17:55 编辑
过程中用到的脚本已经整理保存在 github 上
eda_docker_env: dockerfile and scripts for eda
配置环境的原因
由于大部分开源工具,公开课程的实验环境对 Ubuntu 的支持会比较完善,为了方便学习所以服务器选择了 Ubuntu 22.04。但由于新版的 Synopsys 对 Debian 系的操作系统支持越来越差,在 Ubuntu 上跑新版本的工具一部分会触发 coredump,fatal error,缺少库文件(很多是 libc 不兼容的)等问题。所以需要对 Synopsys 的使用做进一步处理。
基于 docker 的运行环境
因为部分工具收到影响,vcs 和 verdi 运行良好。所以选择将工具和 license 仍然部署在 Ubuntu 物理机上,然后建立一个 centos 的系统镜像,进行一些操作使得容器中的操作与使用物理机尽量保持一致。容器只承担提供运行环境的作用。
使用 Dockerfile 构建镜像
- FROM centos:centos7.9.2009
- # create user
- RUN groupadd -g 1000 liuyi
- RUN groupadd -g 1001 pub_group
- RUN useradd -u 1000 -g 1000 -G ly -M -d /home/ly -s /bin/bash ly
- RUN useradd -u 1001 -g 1001 -G pub_group -M -d /home/tot -s /bin/bash tot
- # install dependency
- RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
- RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
- RUN yum update -y
- RUN yum upgrade -y
- RUN yum groupinstall -y 'Development Tools'
- RUN yum install -y iproute vim epel-release systemd NetworkManager
- RUN yum install -y tree xterm csh ksh java-1.8.0-openjdk glibc.i686
- RUN yum install -y glibc elfutils-libelf motif libXp libpng libjpeg-turbo expat glibc-devel gdb redhat-lsb libXScrnSaver apr apr-util compat-db47 xorg-x11-server-Xvfb mesa-dri-drivers
- RUN yum install -y xorg-x11-fonts-misc xorg-x11-fonts-ISO8859-1-75dpi
- RUN yum install -y pulseaudio-libs pulseaudio-libs-glib2 numactl-libs
- RUN yum install -y flex fontconfig freetype glib2 libICE libX11 libxcb libXext libXi libXrender libSM libxkbcommon-x11 libXt-devel libGLU-devel mesa-libOSMesa-devel mesa-libGL-devel mesa-libGLU-devel xcb-util-keysyms xcb-util-image xcb-util-wm xcb-util-renderutil
- # copy env scripts
- COPY basrc_synopsys_env /etc
- ENTRYPOINT ["/bin/bash"]
复制代码
- 基于官方的 7.9.2009 镜像,创建自己需要的用户和组,并使用 -d 指定家目录位置但使用 -M 表示不需要创建该家目录(我们会挂载自己的 /home 目录上去)。
- 然后安装必要的软件包,原来系统中的 mirrorlist 以及域名都已经无法使用了,所以用 sed 处理一下换成新的域名。
- 如果有需要的话可以添加 COPY 命令将必要的文件如一些写好的环境变量 COPY 到镜像中。比如我将新思的环境变量都写在了一个文件中,并且在 bashrc 中 source 了该文件,那么在构建镜像是将它 COPY 到和宿主机相同的位置即可
在 dockerfile 所在目录执行 docker build --network host -t centos-eda-env . 即可构建生成镜像。这里的 network 是保障构建过程中的网络通畅,与后面容器的网络配置是独立的。
创建用户和组的命令我用 gpt 写了一个脚本,检测当前机器上的所有用户和组,可以直接使用 bash user_cmd_gen.sh > user_cmd.txt 然后将输出 user_cmd.txt 中需要的部分粘贴到 Dockerfile 中
使用 docker-compose 管理容器docker-compose 使用 yml 脚本配置,启动后就带开机自启的功能,非常方便。我们可以简单的配置一些环境变量以及挂载点。
- services:
- centos-eda-env:
- image: centos-eda-env:latest
- container_name: eda-env-container
- volumes:
- - /tmp/.X11-unix:/tmp/.X11-unix:rw # 映射 X11 显示目录
- - /opt:/opt # 映射 /opt 目录
- - /home:/home # 映射 /home 目录
- network_mode: host # 使用宿主机网络
- stdin_open: true # 保持标准输入打开,类似 -it
- tty: true # 允许容器分配伪终端,类似 -it
- entrypoint: ["/bin/bash", "-l"] # 指定启动命令为 /bin/bash -l
- restart: always
复制代码
- 在services 下声明一个服务,这里是 centos-eda-env
- image 是上一步生成的镜像
- container_name 启动容器后容器的名称,用来登录容器
- 第一个挂载点都是 X11 转发相关的配置,因为我们要使用到带有图形界面的软件,需要配置好该文件使内外保持一致。
- 挂载的 /opt 是我安装 Synopsys 工具的位置,如有需要请修改成自己的安装目录。/home 目录完全挂载宿主机的。
- 配置成 host 网络,则容器内外的网络环境将是一致的,这样的话可以避免一些 X11 和 license 的配置问题,也不用考虑容器如何联网。
- 其他配置是打开终端交互,启动模式设置等运行相关操作,不需要特殊配置。
在 docker-compose.yml 文件所在目录执行 docker-compose up -d,其中 -d 是后台运行。想要停止容器就使用 docker-compose down 即可
运行环境
想要在容器中与容器外实现体感一致的操作,可以执行
- docker exec -e DISPLAY=$DISPLAY --user $USER:$GROUPS -w $PWD -it eda-env-container /bin/bash -l
复制代码
- -e 是映射 DISPLAY 变量,定义 X11 转发的显示目标。
- --user 是指定登入容器的用户 id 和组 id,$USR 和 $GROUP 都是 linux 原生的环境变量,可以直接使用。
- -w 是指定进入容器后的工作目录,指向当前目录会显得切换比较丝滑。
- -it 是以交互模式登入容器
- 最后是容器名加上登入命令,这里使用 /bin/bash -l 而不是直接写 /bin/bash 的原因是我在构建的镜像中的 /etc/profile 中写入了一些环境变量,而 profile 只有在登录时被加载。docker 默认的进入容器并没有登录这一步,所以要使用 -l 参数,才能正确的加载 profile 中的变量。
但每次都敲这么一大串命令显然不够优雅,所以我在宿主机的全局环境变量里封装了一个函数
- goto_syn() { docker exec -e DISPLAY=$DISPLAY --user $USER:$GROUPS -w $PWD -it eda-env-container /bin/bash -l}
复制代码
这样我只需要输入 goto_syn 就能进入容器了,如下图所示: 进入容器后就能正常使用各种 eda 工具啦
总结
通过 docker 实现了一个 eda 软件的运行环境,目前测试在 ubuntu22.04 的环境下 vcs23 和 verdi23 是不需要进入容器使用的,icc2,dc,pt,fm 都需要在容器中使用。像这样使用挂载的方式来部署 docker 的好处就是只在需要时进入容器就行,平常做前仿 vcs,verdi 还可以和其它工具方便的混用。
|