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:v1sqlmap3/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 自带「屏幕共享」(最快,但兼容性一般)

  1. Finder -> 前往 -> 连接服务器(⌘K)
  2. 输入 vnc://127.0.0.1:5902
  3. 密码:基础镜像/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)上传时网络断开,报 ... EOFDocker 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. 性能与注意事项

  1. Rosetta 模拟,性能打折:x86 的 Synopsys 在 ARM 上是翻译执行,编译/仿真比真 x86 机器慢不少。给 OrbStack 多分内存(8G+)。
  2. MAC 地址是 license 关键:Docker 设的 MAC 跟宿主机架构无关,M1 上没问题,但必须保留原值 02:42:ac:11:00:02
  3. 少数工具可能在 Rosetta 下崩:VCS/Verdi/Virtuoso 一般能跑;极个别带反调试或硬件指纹检测的工具可能起不来。报 segfault 而非配置错误,基本是模拟的锅,只能上 x86 主机/云服务器。
  4. 容器后台常驻:用 -d 启动,或 docker start 已停止的容器。前台 -it 跑的话终端别关。
  5. 别重复 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
posted @ 2026-07-09 14:04  LeslieQ  阅读(78)  评论(0)    收藏  举报