在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文件即可解决乱码问题

相关推荐
luoyayun3614 小时前
Qt + FFmpeg 视频工具:视频一键压缩功能实现
qt·ffmpeg·音视频·视频压缩
酷虎软件4 小时前
分享链接+视频音频文案提取 API 接口文档
ide·macos·xcode
sanzk5 小时前
firefly开发板ubuntu安装ros2下的micro-ROS Agent
linux·运维·ubuntu
blueman88885 小时前
Qt5通过vcpkg中调用时,在debug模式下调试时总是调用release的plugins文件夹中的dll
c++·qt·cmake
xingke7 小时前
C 语言多文件编程:(一)头文件、extern、编译链接
c语言·开发语言·多文件
wuyk5558 小时前
38.什么是C语言?从语法到工程落地的工程师视角解读
c语言·开发语言·stm32·单片机·mcu·51单片机
Hyyy9 小时前
为什么 macOS 应用一换 Bundle ID,之前授予的权限就全失效了?
macos·electron
p似笑非笑9 小时前
实战验证——把 SDK 塞进一个 macOS 原生 Agent 应用
macos
某不知名網友11 小时前
C/C++动态内存管理,智能指针及RAlI思想。
java·c语言·c++
一杯奶茶¥12 小时前
c语言程序设计大学期末考试考研知识点重点笔记题库复习资料C语言重点考点题库资料合集
c语言·笔记·考研·c语言程序设计·c语言笔记