Synopsys-Docker-M1-OrbStack指南
Mac M1 + OrbStack 运行 Synopsys Docker 指南
适配自 EETOP 帖子《WIN 下使用 Synopsys docker 使用指南》
(http://bbs.eetop.cn/thread-913461-1-1.html)
原帖为 Windows + Docker Desktop 方案,本文改写为 Mac M1 + OrbStack 方案,
并记录了实际部署中踩过的坑与最终配置。
0. 核心要点(先看这个)
原帖用的是 VNC 桌面(不是 X11 转发),对 Mac 是好消息--不需要装 XQuartz。唯一要处理的关键问题是:
M1 是 ARM64,而镜像和里面的 Synopsys 2016 是 x86_64,必须用 Rosetta 模拟运行。
所有 docker 命令都要加 --platform linux/amd64,否则 M1 会去拉 arm64 版,EDA 工具起不来。
Windows 原帖 vs Mac M1 对照
| 环节 | Windows 原帖 | Mac M1 + OrbStack |
|---|---|---|
| Docker 后端 | Docker Desktop + WSL2 | OrbStack(无需 WSL2) |
| 拉镜像 | docker pull phyzli/... |
加 --platform linux/amd64 |
| 运行容器 | docker run ... |
加 --platform linux/amd64,挂载路径改 Mac 路径 |
--hostname / --mac-address |
lizhen / 02:42:ac:11:00:02 | 一字不改照抄(license 绑定) |
| VNC 端口 5902 | VNC viewer 连 127.0.0.1:5902 | 同左 |
| SSH 端口 1234 | ssh -p 1234 root@127.0.0.1 | 同左 |
| 挂载路径 | //d/mydata:/mnt/mydata |
/Users/sqlmap/eda_data:/mnt/mydata |
当前环境快照(本机实际状态)
| 项 | 值 |
|---|---|
| 容器名 | synopsys(从 objective_burnell 改名;ID 72e63b6f7f8e 等价) |
| 基础镜像 | phyzli/ubuntu18.04_xfce4_vnc4server_synopsys2016(22GB) |
| 本地镜像 | my-synopsys:v1(首次 commit,23.8GB) |
| Docker Hub | sqlmap3/synopsys-m1:v1、sqlmap3/synopsys-m1:v2(私有仓库) |
| VNC | display :2 → 端口 5902 |
| VNC 密码 | 基础镜像/v1 = zhenchen;v2 = 自定义新密码 |
| SSH | 端口 1234,用户 root |
| license 绑定 | --hostname lizhen --mac-address 02:42:ac:11:00:02(不可改) |
| 挂载 | /Users/sqlmap/eda_data ↔ 容器 /mnt/mydata |
1. 一次性配置(首次)
1.1 装 OrbStack
从 https://orbstack.dev 安装。装好后 docker 命令直接可用,兼容 docker CLI。OrbStack 用 Rosetta 2 跑 x86_64 容器,开箱即用。
建议在 OrbStack 设置里给足内存(8G+),EDA 仿真比较吃内存。
1.2 拉基础镜像(强制 x86_64)
docker pull --platform linux/amd64 phyzli/ubuntu18.04_xfce4_vnc4server_synopsys2016
约 22GB,耐心等待。--platform linux/amd64 不能漏。
1.3 创建并启动容器
先建挂载目录:
mkdir -p ~/eda_data
启动(首次):
docker run -it --platform linux/amd64 \
-p 5902:5902 -p 1234:22 \
--hostname lizhen --mac-address 02:42:ac:11:00:02 \
-v /Users/sqlmap/eda_data:/mnt/mydata \
--name synopsys \
phyzli/ubuntu18.04_xfce4_vnc4server_synopsys2016
参数说明:
| 参数 | 含义 |
|---|---|
--platform linux/amd64 |
强制 x86_64,Rosetta 模拟(必加) |
-p 5902:5902 |
VNC 端口映射 |
-p 1234:22 |
SSH 端口映射 |
--hostname lizhen |
主机名,license 绑定,不可改 |
--mac-address 02:42:ac:11:00:02 |
MAC 地址,license 绑定,不可改 |
-v /Users/sqlmap/eda_data:/mnt/mydata |
Mac 目录挂载到容器,用于数据交换 |
--name synopsys |
容器命名(可选,方便后续操作) |
-it |
交互式(首次启动用);后台常驻改 -d |
⚠️ hostname 和 MAC 是和镜像里 license 文件匹配的,绝对不要改,改了 license 失效。
2. 每日启动流程
容器创建一次后永久存在,以后不要再用 docker run(会创建新容器并因端口占用报错),用 docker start 复用。
三步启动
# 1. 确保 OrbStack 在跑(没跑就启动,等几秒)
open -a OrbStack
# 2. 启动容器
docker start synopsys
# 3. 容器内启动 VNC(每次都要手动起,这个镜像不会自动起 VNC)
docker exec synopsys bash -c "vncserver -kill :2 2>/dev/null; rm -f /tmp/.X2-lock /tmp/.X11-unix/X2; vncserver -geometry 1440x1080 :2"
-geometry按你观看 VNC 的屏幕逻辑分辨率选,见 §4.2。
验证是否就绪
# VNC 握手应返回 RFB 003.008
echo "" | nc -w 3 127.0.0.1 5902 | head -c 12
3. 连接使用
3.1 VNC 图形桌面
容器里是 xfce4 桌面 + vnc4server,display :2 对应端口 5902。
方式 A:Mac 自带「屏幕共享」(最快,但兼容性一般)
- Finder -> 前往 -> 连接服务器(⌘K)
- 输入
vnc://127.0.0.1:5902 - 密码:基础镜像/v1 用
zhenchen;v2 用你自定义的密码
⚠️ Mac 自带「屏幕共享」和 vnc4server 偶有兼容问题,可能触发 X 服务器崩溃(症状:连上立即断开,容器内 Xvnc 进程消失)。连不上或一连就崩,换下面专用客户端。
方式 B:TigerVNC(和 vnc4server 同源,兼容性最好,推荐)
brew install --cask tigervnc-viewer
# 打开 TigerVNC Viewer,地址 127.0.0.1:5902,输入 VNC 密码
方式 C:RealVNC Viewer(体验最顺)
brew install --cask vnc-viewer
# 打开后地址 127.0.0.1:5902,输入 VNC 密码
3.2 SSH 连接(可选)
原帖提到 docker exec 进容器编译会有 bug,用 ssh 可避开。
容器内先改 root 密码(默认空,ssh 不允许空密码登录):
docker exec -it synopsys passwd
Mac 上连接:
ssh -p 1234 root@127.0.0.1
3.3 测试 VCS
VNC 桌面里开终端,或 SSH 进容器:
cd /mnt/mydata
vcs tb.sv
./simv
VCS + Verdi 联合仿真:
vcs tb.sv -debug_all -lca -kdb
./simv -gui=verdi
4. VNC 密码与分辨率
4.1 修改 VNC 密码
vnc4server 的密码只取前 8 个字符,设 ≤8 位,长了只认前 8 位。
改密码只影响当前运行容器,不会自动进 Docker Hub 镜像--要同步到镜像得重新 commit+push(见 §5)。
# 1. 改密码(交互输入,在容器内写 /root/.vnc/passwd)
docker exec -it synopsys vncpasswd
# 2. 重启 VNC 让新密码生效(Xvnc 启动时才读密码文件)
docker exec synopsys bash -c "vncserver -kill :2; rm -f /tmp/.X2-lock /tmp/.X11-unix/X2; vncserver -geometry 1440x1080 :2"
改完用新密码连 vnc://127.0.0.1:5902 验证。
4.2 分辨率(geometry)
-geometry 是 VNC 虚拟桌面尺寸,设成观看那块屏的逻辑分辨率,VNC 窗口刚好满屏不滚动。本机两块屏:
| 在哪块屏看 VNC | 屏幕信息 | 用这个 geometry |
|---|---|---|
| MacBook 主屏(默认缩放) | 2560×1600 Retina | 1440x900 |
| MacBook 主屏(更多空间) | 2560×1600 Retina | 1680x1050 |
| 外接 4K 屏 | 3840×2160,逻辑 1920×1080 | 1920x1080 |
| 外接 4K,想要更大桌面 | 3840×2160 | 2560x1440 |
geometry 是启动参数,每次启动 VNC 时指定,不用 commit 进镜像。想换分辨率,kill 再用新 geometry 启动即可。
5. Docker Hub 私有仓库(备份/跨机)
把容器当前状态(含配置)固化成镜像,推到私有仓库,供其他机器拉取。
⚠️ 版权红线:镜像含 Synopsys 商业软件 + 破解 license。只能推到私有仓库、只自己访问。公开推送 = 传播盗版商业软件,违法,也违反原帖「仅供个人学习使用」。
5.1 准备:确保仓库私有
push 前在 hub.docker.com:Account Settings -> Security -> Default Repository Visibility 改成 Private。否则首次 push 会建成 Public 仓库(有公开暴露窗口)。
Docker Hub 免费(Personal)档对私有仓库可能有限制,如不能建私有仓库需开 Pro($5/月)。或改用本机 registry(免费、私有、即时)。
5.2 登录
docker login
# 输入 Docker Hub 用户名 + 密码或 Personal Access Token
# (开了两步验证必须用 Access Token)
凭据存在 macOS keychain,配置文件里看不到明文。
5.3 固化 + 打 tag + 推送
# 1. commit 容器为本地镜像
docker commit synopsys sqlmap3/synopsys-m1:v2
# 2. 推送
docker push sqlmap3/synopsys-m1:v2
推送预期:
- 基础层显示
Layer already exists(和 v1/基础镜像共享,跳过) - 实际上传 ~1.8GB(commit 出的可写层,含 coc 配置 + 新密码)
- 成功标志:
v2: digest: sha256:...
5.4 push 报 EOF / 断连(常见坑)
大 blob(~1.8GB)上传时网络断开,报 ... EOF。Docker push 支持断点续传,已传完的层重试时跳过,直接重试即可(不用重新 commit):
# 自动重试 5 次
for i in 1 2 3 4 5; do
echo "=== 第 $i 次尝试 ==="
docker push sqlmap3/synopsys-m1:v2 && echo "✅ 推送成功" && break
echo "⚠️ 失败,8秒后重试..."
sleep 8
done
仍频繁断:换网络;或 OrbStack Docker engine 配置加 {"max-concurrent-uploads": 1};或走兜底 docker save 存 tar(见 §5.6)。
5.5 在另一台机器拉取使用
docker login
docker pull sqlmap3/synopsys-m1:v2
docker run -it --platform linux/amd64 \
-p 5902:5902 -p 1234:22 \
--hostname lizhen --mac-address 02:42:ac:11:00:02 \
-v ~/eda_data:/mnt/mydata \
--name synopsys \
sqlmap3/synopsys-m1:v2
# 启动 VNC(分辨率按那台机器屏幕选)
docker exec synopsys bash -c "vncserver -geometry 1440x1080 :2"
连 vnc://127.0.0.1:5902,v2 用自定义密码(不是 zhenchen)。
5.6 兜底:docker save(不走 Docker Hub)
网络不稳或不想用 Docker Hub,存成 tar 手动拷贝:
# 存(约 23GB,需磁盘空间)
docker save -o ~/synopsys-v2.tar sqlmap3/synopsys-m1:v2
# 在另一台机器加载
docker load -i synopsys-v2.tar
5.7 验证推送
# ⚠️ docker manifest inspect 有已知鉴权 bug(报 unable to decode token),别用它验
# 用 Docker Hub 网页:https://hub.docker.com/r/sqlmap3/synopsys-m1/tags 看 tag 和大小
# 终极验证:另一台机器 docker pull 能拉下来 = 成功
6. 容器管理
docker ps -a # 查看所有容器(含已停止)
docker start synopsys # 启动
docker stop synopsys # 停止
docker restart synopsys # 重启
docker exec -it synopsys bash # 进入容器
docker rename 旧名 新名 # 改容器名(不影响功能)
docker rm -f synopsys # 删除容器(挂载的 eda_data 不受影响)
7. 故障排查
7.1 VNC 连不上 /「无法通信」
最常见:容器里 VNC 进程崩了(Rosetta 模拟下 Xvnc 偶尔不稳,或 Mac「屏幕共享」连上时触发崩溃)。症状:Mac 侧 5902 有 OrbStack 代理监听,但容器内没人监听。
诊断:
docker exec synopsys bash -c "ps aux | grep Xvnc | grep -v grep" # VNC 是否在跑
docker exec synopsys bash -c "ss -tlnp | grep 5902" # 5902 是否监听
修复(重启 VNC):
docker exec synopsys bash -c "vncserver -kill :2 2>/dev/null; rm -f /tmp/.X2-lock /tmp/.X11-unix/X2; vncserver -geometry 1440x1080 :2"
反复崩则换 TigerVNC/RealVNC 客户端。
7.2 VNC 日志在哪
docker exec synopsys tail -30 ~/.vnc/lizhen:2.log
XIO: fatal IO error 11 = X 服务器挂了,按 7.1 重启。
7.3 docker 命令报「failed to connect to the docker API」
原因:OrbStack 没运行(被整个退出)。
open -a OrbStack
docker info # 等几秒,确认就绪
7.4 容器 Exited (137)
137 = 被 SIGKILL,通常是关 OrbStack 时容器被一起杀掉,正常。docker start synopsys 重新拉起即可。
7.5 exec format error / cannot execute binary file
漏了 --platform linux/amd64,M1 拉到 arm64 镜像。删除重来,带上 --platform linux/amd64。
7.6 端口被占用(5902/1234)
lsof -i :5902
lsof -i :1234
通常是旧容器还在跑,docker ps 检查,停掉或删掉。
7.7 pull 报 not found(私有仓库)
私有仓库未 docker login 就 pull 会报 not found。先 docker login 再 pull。
8. 其他可用镜像
原作者另提供两个镜像,hostname 和 MAC 都和 synopsys2016 一致,命令照套(同样加 --platform linux/amd64):
| 镜像 | 内容 | License |
|---|---|---|
phyzli/centos8_xfce4_tigervnc_hspice2010 |
Hspice 2010 | 2060 年到期,需 lmgrd |
phyzli/centos8_xfce4_tigervnc_virtuosoic617_mmsim15_calibre2015 |
Virtuoso IC617 + MMSIM15 + Calibre 2015 | Virtuoso 永久;Calibre 2015 到 4963 年,免挂 license |
9. 性能与注意事项
- Rosetta 模拟,性能打折:x86 的 Synopsys 在 ARM 上是翻译执行,编译/仿真比真 x86 机器慢不少。给 OrbStack 多分内存(8G+)。
- MAC 地址是 license 关键:Docker 设的 MAC 跟宿主机架构无关,M1 上没问题,但必须保留原值
02:42:ac:11:00:02。 - 少数工具可能在 Rosetta 下崩:VCS/Verdi/Virtuoso 一般能跑;极个别带反调试或硬件指纹检测的工具可能起不来。报 segfault 而非配置错误,基本是模拟的锅,只能上 x86 主机/云服务器。
- 容器后台常驻:用
-d启动,或docker start已停止的容器。前台-it跑的话终端别关。 - 别重复
docker run:容器还在就docker start复用,再 run 会建第二个容器并端口冲突。
附:一键启动脚本
保存为 ~/start-synopsys.sh:
#!/bin/bash
# 容器名(可改成你的);分辨率按需调整
NAME=synopsys
GEO=1440x1080
# 1. 确保 OrbStack 在跑
if ! docker info >/dev/null 2>&1; then
echo "启动 OrbStack..."
open -a OrbStack
for i in $(seq 1 60); do
docker info >/dev/null 2>&1 && break
sleep 1
done
fi
# 2. 启动容器
echo "启动容器 $NAME..."
docker start $NAME
# 3. 启动 VNC
echo "启动 VNC..."
docker exec $NAME bash -c "vncserver -kill :2 2>/dev/null; rm -f /tmp/.X2-lock /tmp/.X11-unix/X2; vncserver -geometry $GEO :2"
# 4. 验证
sleep 1
if echo "" | nc -w 3 127.0.0.1 5902 | head -c 12 | grep -q RFB; then
echo "✅ 就绪!VNC: vnc://127.0.0.1:5902 (v2 用自定义密码,v1/基础镜像用 zhenchen)"
else
echo "⚠️ VNC 未就绪,看日志: docker exec $NAME tail -20 ~/.vnc/lizhen:2.log"
fi
赋权运行:
chmod +x ~/start-synopsys.sh
~/start-synopsys.sh

浙公网安备 33010602011771号