在Mac上通过Multipass虚拟机中的Ubuntu系统使用Graphviz工具

文章目录

安装Multipass并创建Ubuntu虚拟机

确保Multipass已安装在Mac上,可通过官网或Homebrew安装。

powershell 复制代码
brew install multipass
  • 在 macOS 中,通过 brew install multipass 安装的 Multipass 会被下载并安装到
    /opt/homebrew/bin 目录下(如果你的 Mac 是 Apple Silicon 芯片,即 M1/M2 系列);如果是
    Intel 芯片的 Mac,则会安装到 /usr/local/bin 目录下。

使用以下命令创建Ubuntu虚拟机:

bash 复制代码
multipass launch 22.04 --name myubuntu
  • launch 22.04:指定下载 Ubuntu 22.04 LTS 版本(默认是 ARM64 架构,适配 M1/M2 芯片);
    --name myubuntu:给虚拟机命名为 "myubuntu"(可自定义,比如 "ubuntu22"),方便后续管理。

启动虚拟机并进入Shell:

bash 复制代码
multipass shell myubuntu
  • 成功进入后,终端提示符会变成 ubuntu@myubuntu:~$,说明已经在 Ubuntu 系统内了,此时可以执行 Ubuntu
    命令(比如 sudo apt update 更新软件源、ls 查看文件等)。

在Ubuntu虚拟机中安装Graphviz

在虚拟机内运行以下命令更新软件包列表并安装Graphviz:

bash 复制代码
sudo apt update
sudo apt install graphviz

验证安装是否成功:

bash 复制代码
dot -V

配置共享文件夹(可选)或将待执行文件传到虚拟机

若需在Mac和虚拟机间共享文件,使用Multipass挂载目录。例如将Mac的~/graphviz_projects共享到虚拟机:

bash 复制代码
multipass mount ~/graphviz_projects myubuntu:/home/ubuntu/graphviz

在虚拟机内可通过/home/ubuntu/graphviz访问共享文件。

powershell 复制代码
multipass transfer /Users/电脑名/Documents/0qt/251120Grapgviz/1/demo3.dot myubuntu:~/
  • 传输命令执行后,在 Mac 终端执行 multipass shell 虚拟机名(比如 multipass shell myubuntu),进入 Ubuntu 虚拟机;
  • 执行 ls 命令(默认就在 /home/ubuntu 目录),如果输出中能看到
    demo3.dot,说明已经成功放在目标目录了。

使用Graphviz生成图表

在虚拟机内创建或编辑.dot文件,例如:

dot 复制代码
digraph G {
  A -> B;
  B -> C;
  C -> A;
}

使用以下命令生成图表(如PNG格式):

bash 复制代码
dot -Tpng demo3.dot -o demo3.png
  • 命令说明:把 demo3.dot 转换成 demo3.png 图片,生成的 demo3.png
    会保存在同一个目录(/home/ubuntu)。

传输文件到Mac(若未共享文件夹)

将生成的图表从虚拟机复制到Mac:

bash 复制代码
# 在 Mac 终端执行(退出 Ubuntu 或新建终端窗口)
multipass transfer 虚拟机名:~/demo3.png ~/Desktop

之后直接在 Mac 桌面双击 demo3.png 就能查看生成的图形了。

  • 总结:核心是「先把 Mac 上的文件传到 Ubuntu,再在 Ubuntu 中执行」,因为两个系统的文件路径是独立的,Ubuntu
    无法直接访问 Mac 的本地文件~

常见问题处理

若遇到权限问题,确保挂载目录的权限正确:

bash 复制代码
sudo chown -R ubuntu:ubuntu /home/ubuntu/graphviz

若Graphviz命令未找到,检查安装路径或重新安装。

查看demo3.dot从开始执行到执行结束共用了多长时间

  1. 用 time 命令直接计时(最推荐)

在 Ubuntu 终端中,执行 dot 命令时,前面加上 time 关键字,会自动统计命令运行的总时间:

powershell 复制代码
time dot -Tpng demo3.dot -o demo3.png

执行后输出示例:

powershell 复制代码
real	0m0.023s  # 实际总耗时(从开始到结束的墙钟时间,包含等待时间)
user	0m0.018s  # 命令在用户态运行的时间
sys	0m0.005s   # 命令在内核态运行的时间
  • 核心关注 real 字段,就是生成图片的总耗时(示例中是 0.023 秒,即 23 毫秒)。这种方法无需额外操作,执行命令后直接显示结果,适合快速统计。
  1. 用 date 命令记录开始 / 结束时间(手动计算)

如果需要更灵活的时间记录(比如保存到文件),可以用 date 命令分别记录 "开始时间" 和 "结束时间",再计算差值:

先记录开始时间(执行命令前):

powershell 复制代码
start_time=$(date +%s%N)  # 记录当前时间(纳秒级,精准)

执行 dot 生成命令:

powershell 复制代码
dot -Tpng demo3.dot -o demo3.png

记录结束时间并计算耗时:

powershell 复制代码
end_time=$(date +%s%N)
elapsed=$(( (end_time - start_time) / 1000000 ))  # 转换为毫秒(1秒=1000毫秒=1e9纳秒)
echo "生成总耗时:$elapsed 毫秒"

执行后输出示例:

powershell 复制代码
生成总耗时:25 毫秒
  • 这种方法适合需要后续分析(比如多次生成对比耗时)的场景,结果更直观(直接显示毫秒数)。
  • 注意事项:生成耗时通常很短(尤其是小体积的 dot 文件),如果耗时超过几秒,可能是 dot 文件语法错误或文件过大,可先检查 demo3.dot 的语法(执行 dot -v demo3.dot 查看是否有报错)。
    两种方法的结果基本一致,time 命令更简洁,date 命令更灵活,根据需求选择即可。

生成的图表可能有乱码问题

在Multipass虚拟机的Ubuntu中,Graphviz生成的图出现汉字乱码,主要是系统中缺少中文字体支持和Graphviz未配置中文兼容字体导致的。

一、核心原因

1.系统无中文字体:Ubuntu默认不预装中文字体,Graphviz渲染中文时因找不到对应字体,会以乱码(如方框、特殊符号)显示

2.Graphviz字体配置缺失:Graphviz默认使用的字体(如Helvetica)不支持中文,需手动指定支持中文的字体(如宋体、文泉驿等)

3.编码与Locale配置问题:系统编码或区域设置未适配中文,导致字符解析异常

二、解决步骤

1.安装中文字体

在Multipass的Ubuntu终端中执行以下命令,安装中文字体(dot文件中指定了字体,node [shape=box, fontname="WenQuanYi Micro Hei"]; // 中文支持

powershell 复制代码
sudo apt update
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei  # 安装文泉驿系列中文字体

2.配置 Graphviz 字体

在生成图形的 DOT 文件中,显式指定支持中文的字体。例如,在 DOT 脚本中添加字体配置:

c 复制代码
digraph causal_loop {
    rankdir=TB;  // 从上到下布局,贴合因果流向
    node [shape=box, fontname="WenQuanYi Micro Hei"];  // 中文支持
    edge [fontname="SimHei"];
}

重新执行dot文件即可解决乱码问题

相关推荐
石像鬼₧魂石18 小时前
如何配置Fail2Ban的Jail?
linux·学习·ubuntu
椰子今天很可爱19 小时前
五种I/O模型与多路转接
linux·c语言·c++
程序员zgh20 小时前
C++ 互斥锁、读写锁、原子操作、条件变量
c语言·开发语言·jvm·c++
小灰灰搞电子20 小时前
Qt 重写QRadioButton实现动态radioButton源码分享
开发语言·qt·命令模式
喵了meme20 小时前
C语言实战5
c语言·开发语言
aini_lovee1 天前
寻找 MAC 协议的 MATLAB 仿真
开发语言·macos·matlab
神仙别闹1 天前
基于C语言实现B树存储的图书管理系统
c语言·前端·b树
福尔摩斯张1 天前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
刺客xs1 天前
Qt----事件简述
开发语言·qt
2739920291 天前
QButtonGroup (Qt)
qt