M4 Pro Mac mini 装机指南:教学、万兆内网与 Dotfiles 统一管理

2026-09-09 00:00    #工具   #macOS   #dotfiles   #yadm   #self-record  

这台 M4 Pro Mac mini 不是我的第一台 Mac,但它是第一台打算当主力开发机用的。之前主力一直在 Arch Linux 上,现在要把日常搬到 macOS,同时保留 Linux 那套按键、终端和配置管理习惯。

它要承担的事情很具体:

  1. 算法教学与课件——写题解、编译讲义、录课、改学生的代码;
  2. 家里那堆节点的入口——Proxmox、Debian、Arch、NAS、Home Assistant,全靠 SSH 和万兆内网串起来;
  3. 知识库与产出——Obsidian 笔记、3D 打印切片、短视频剪辑。

所以装机的判断标准只有一条:能不能把我 Linux 上那套肌肉记忆原样搬过来。下面按这个标准记录装了哪些、哪些坑必须绕、以及配置怎么在多设备之间统一。

说明

本文的安装清单和验证结果都在本机 brew 里实际跑过。表格里的「状态」列反映 2026-09-12 这台机器的真实情况,装机顺序建议直接按第 9 节走。


1. 系统基建与包管理器

Homebrew 是第一步,后面所有软件基本都能一行命令搞定。

1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

装完要把 shellenv 写进 ~/.zprofile,否则新开终端找不到 brew

1echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile

然后是 GNU Coreutils。macOS 默认带的是 BSD 版本命令行工具,sed -idate -dls --color 这些写法行为都不一样,在两台机器间来回切会被绊倒。Homebrew 用 g 前缀避免覆盖系统版本:

1brew install coreutils findutils gnu-tar gnu-sed gawk grep
这一条我还没做

本机目前没有安装 coreutils(command -v gls 为空)。也就是说现在 ls/sed/date 走的仍是 BSD 行为,脚本里写 Linux 风格参数会静默出错。补装后需要在 ~/.zshrc 里把 $(brew --prefix coreutils)/libexec/gnubin 加进 PATH 才能真正顶掉 BSD 版本。


2. 教学与课件开发

工具用途状态
LLVM提供 clangd 语言服务器llvm 已装
GCC保证 C++ 竞赛代码语法与评测机一致✅ 已装
VS Code主 IDE,配 clangd + PlatformIOvisual-studio-code
Neovim原生运行,Linux 配置直接软链过来✅ 已装
Typst本地极速编译讲义与试卷✅ 已装
Obsidian知识库核心,Dataview 管题解与学生进度✅ 已装

两个值得单独说的点:

clangd 不是独立的包。 它随 llvm 一起装,Homebrew 里没有单独的 clangd formula(brew info --cask clangd 会报 unavailable)。所以 VS Code 里用 clangd 插件时,指向 llvm 的路径:

1brew install llvm
2# Apple Silicon 上前缀在 /opt/homebrew
3ls /opt/homebrew/opt/llvm/bin/clangd

Typst 对教学场景是决定性的。 LaTeX 改一行公式重排半分钟,Typst 是毫秒级增量编译,配 VS Code 的 Tinymist 插件基本是所见即所得。现场改卷子的时候这个差距很有用。

1typst compile lecture.typ

3. 远程协同与万兆内网

1brew install --cask tailscale royal-tsx termius microsoft-remote-desktop
工具状态说明
Tailscale待装应该第一时间装,后面所有节点访问都依赖它
Termius✅ 已装集中管 SSH
Royal TSX❌ 待装连接多、需要分组和凭据管理时更顺手
Microsoft Remote Desktop❌ 待装远控 Win 机器跑 SolidWorks
Tailscale 要在配置内网之前装

这台机器的万兆网卡一旦配好静态 IP、接管了内网路由,Tailscale 的「拦截 LAN 流量」选项就会开始影响本机访问内网设备,排错时容易误判成网卡问题。顺序装反了要多花一小时。之前记录过一次 Sequoia 上的内网访问踩坑,见 macOS Sequoia 本地网络权限导致 ERR_ADDRESS_UNREACHABLE——同样是系统层权限而不是应用配置的问题。

万兆网卡的吞吐值得单独监控,第 6 节的 Stats 菜单栏可以实时显示,不用每次开活动监视器。


4. 硬件创客与全栈

1brew install --cask bambu-studio orcaslicer miniforge
2brew install node
包名注意

Bambu 的 cask 名是 bambu-studio,写成 bambustudio 会报 not found。相关还有 bambu-connect(打印机联网管理),两者不是一个东西。


5. AI 与多媒体

1brew install --cask cherry-studio ollama
工具用途状态
Cherry Studio桌面端 AI 客户端,接 DeepSeek 等 API 生成测试数据与代码骨架❌ 待装
Roo CodeVS Code 里的 agent 插件⚠️ 见下
Ollama常驻后台跑本地模型❌ 待装
剪映专业版 / CapCut短视频与引流视频,M4 媒体引擎渲染很快❌ 待装
Roo Code 不是桌面 App

它是 VS Code 扩展,在插件市场里装,brew install --cask roo-code 找不到。另外 brew 里能装到的是海外版 capcut,国区的剪映专业版(jianying-pro 这个 cask 名并不存在)得走官网下载。

24G 内存跑本地模型是个尴尬的档位:7B/8B 量化模型很舒服,再往上就要认真算 KV cache 占用。写代码辅助用 API 更划算,本地模型我主要留给离线场景和批量数据清洗。


6. 终端方案:Kitty + tmux

终端我选 Kitty:GPU 加速(macOS 上走 Metal),纯文本配置,原生分屏。详细配置单独写了一篇:

装机时最容易踩的三个点:

1. Option 键。 常见建议是无脑加 macos_option_as_alt yes,否则 Alt 组合键失灵。但这行会把 Option 从 macOS 的系统输入行为里抢走(失去输入 © 这类字符,以及一些 App 依赖的 ⌥ 菜单项)。我现在的配置是:

1# 注:暂不使用 macos_option_as_alt —— 用户选择保留 ⌘ 习惯(见下方 ⌘W noop)
2macos_option_as_alt both

both 表示左右两个 Option 键都当 Alt 用。判断依据是:只有当你在终端里跑 vim/neovim 且大量用 Alt 组合时,这行才是必需的,否则它是有代价的取舍,不是必选项。

2. 字体。 Nerd Font 是图标字体的超集,不加的话 tmux 状态栏和 powerline 类主题会掉字:

1brew install --cask font-jetbrains-mono-nerd-font

本机当前实际装的是 font-fira-code-nerd-font,但 kitty.conf 里写的是:

1font_family      JetBrainsLxgwNerdMono
2font_size        17.0
验证字体名是否匹配

font_family 必须匹配系统注册名而不是文件名。装完字体后用 Kitty 自带工具核对,改完在 Kitty 里按 Ctrl+Shift+F6 重载配置:

1kitty --list-fonts "JetBrains" | head -20

名字对不上时 Kitty 会静默回退到默认字体,图标显示成方块,很难第一时间联想到字体。

3. tmux 配置路径。 tmux 的查找顺序是 ~/.tmux.conf 优先,只有它不存在才去看 XDG 路径。我这边两个都有,需要小心哪个才是真正生效的:

1tmux -V
2grep -n "prefix" ~/.config/tmux/tmux.conf   # 主配置(完整定制)
3cat ~/.tmux.conf                             # 只放了少量覆盖项
一个容易漏的按键协议问题

本机 ~/.tmux.conf 里只有这么一行,是 coding agent 在 tmux 下工作时的必要修正:

1set -g extended-keys-format csi-u

不设置时 tmux 默认向应用广播 xterm 风格的扩展键序列,现代终端(Kitty / Ghostty)里 Alt+方向键Shift+Enter 会被错误解析。改完需要重启整个 tmux servertmux kill-server),只 kill 当前会话不生效。

Kitty 自带的分屏确实能顶掉一部分 tmux 场景,但我还是保留 tmux:会话要跨 SSH 存活着,Kitty 的窗口布局做不到断线重连后原样恢复。


7. 扩展工具

7.1 窗口管理与键盘流

工具作用状态
AeroSpace平铺窗口管理器,类 i3/Hyprland,无需关 SIP✅ 已装,⚠️ 未配置
Raycast替代 Spotlight,带剪贴板历史和插件生态✅ 已装
Karabiner-Elements键位映射,CapsLock →「单击 Esc、长按 Ctrl」✅ 已装

AeroSpace 的安装三步:

1brew install --cask nikitabobko/tap/aerospace
2# 或直接走主仓库
3brew install --cask aerospace
  1. 首次启动后,在 系统设置 → 隐私与安全性 → 辅助功能 里授权(不授权它完全不动,也不报错);
  2. 复制默认配置:
    1cp /Applications/AeroSpace.app/Contents/Resources/default-config.toml ~/.aerospace.toml
    
  3. 改完配置按 Option + Shift + ; 热重载。
本机卡在第二步

brew list --cask 里 aerospace 已装(0.21.3-Beta),但 ~/.aerospace.toml~/.config/aerospace/ 都不存在,等于装了个默认键位的空壳。想复刻 i3 手感的话,主修饰键建议从 Option 换成 CtrlSuper,否则会和终端、Karabiner 的映射打架。

7.2 虚拟化与监控

1brew install --cask orbstack stats iina cyberduck

7.3 现代 CLI 效率套件

1brew install zoxide eza bat ripgrep fd lazygit btop
工具替代价值状态
zoxidecd按频率智能跳转,不用敲完整路径
ezals带 Git 状态、图标
batcat语法高亮,自动分页
rggrep -r快一个数量级,默认读 .gitignore
fdfind语法极简
lazygitgit add -p终端内秒级暂存、回滚
btoptop现代化资源监视

这一组是纯赚的:零配置,装完就能把 Linux 上的搜索/预览手感带过来。Neovim 的 telescope / fzf-lua 也全都依赖 rg + fd + fzf,属于地基。

7.4 教学演示辅助

1brew install --cask shottr keycastr obs
2brew install --cask snipaste
工具用途状态
Shottr / Snipaste截图贴图,长截图与标注✅ Shottr 已装,❌ Snipaste 待装
KeyCastr屏幕按键回显,录编码教学视频必备✅ 已装
OBS StudioApple Silicon 深度优化,硬件编码录屏推流✅ 已装
AppCleaner拖进去卸载,清残留✅ 已装
录课前先测一次编码

OBS 里硬件编码选 Apple H.264 (VideoToolbox)。用默认的 x264 会吃满 CPU 且风扇起飞,录 4K 演示直接掉帧。KeyCastr 记得设一个不显眼的半透明样式,否则学生注意力全在按键上。


8. Dotfiles:Stow 还是 yadm

我手上有 macOS、Arch Linux、Debian 三套环境,配置必须统一。两个主流方案:

评估维度GNU Stowyadm
工作原理集中目录 + 外派软链接整个 Home 目录是一个 Git 裸仓库
模块化管理极强,可精细 stow nvim较弱,整目录共享一条 Git 时间线
跨系统差异繁琐,需手动按系统建目录原生后缀识别,自动适配 OS
文件侵入性软链接易被部分软件覆盖报错实体文件,与普通操作无异
敏感信息保护无原生支持自带 yadm encrypt 加密

结论:多设备异构场景选 yadm。 关键就在「跨系统差异」这一行——kitty.conf 在 Mac 上需要 macos_option_as_alt,在 Linux 上不需要,这种分支用 Stow 得靠手工维护平行目录,yadm 只要改文件名。

小修正

官方只有 yadm encrypt / yadm decrypt,没有 yadm crypt。加密需要额外的 gpg 配置,见 Encryption 文档

落地工作流

 1# 1. 安装与初始化(裸仓库藏在 ~/.local/share/yadm,不干扰 ~/ 下其他项目)
 2brew install yadm
 3yadm init
 4
 5# 2. 像用 git 一样添加配置
 6yadm add ~/.config/kitty
 7yadm add ~/.config/tmux
 8yadm add ~/.aerospace.toml
 9yadm add ~/.zshrc
10yadm add ~/.gitconfig
11
12# 3. 处理跨系统差异:双井号后缀,可组合 os / arch / hostname / user
13mv ~/.config/kitty/kitty.conf ~/.config/kitty/kitty.conf##os.Darwin
14yadm alt          # 手动生成本机对应版本的软链
15
16# 4. 提交与推送
17yadm commit -m "feat: init mac workspace"
18yadm branch -M main
19yadm remote add origin git@github.com:<用户名>/dotfiles.git
20yadm push -u origin main

可用后缀条件:##os.Darwin##os.Linux##arch.arm64##hostname.主机名##user.用户名##default,逗号可以叠加(如 ##os.Darwin,arch.arm64),条件越多优先级越高。若不想让变体和生成软链混在同一目录,可放到 ~/.config/yadm/alt/ 下保持相对路径。

优先用条件块,其次才用变体文件

分隔变体意味着改一处要在每个变体里各改一遍。能写进文件内的条件优先:

1# macOS 上用 pbcopy/pbpaste,Linux 走 xclip
2if-shell "test \"$(uname -s)\" = Darwin" \
3  "set -g clipboard on" \
4  "set -g default-command 'xclip -selection clipboard'"

变体文件留给那种"文件本身不支持条件语法"的场景(比如 kitty.conf),或者是真的两套完全不同的配置。

换新机器只要一行:

1yadm clone git@github.com:<用户名>/dotfiles.git

再配合 bootstrap 脚本自动装 Homebrew 和整个 bundle(bootstrap 文件必须放在 ~/.config/yadm/bootstrap 且有可执行位):

1#!/bin/sh
2# ~/.config/yadm/bootstrap —— 要写成幂等的,clone 后会自动提示运行
3if [ "$(uname -s)" = "Darwin" ]; then
4  command -v brew >/dev/null 2>&1 || \
5    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
6  [ -f "$HOME/.Brewfile" ] && brew bundle --global
7fi

.Brewfile 的写法:

1cask  "kitty"
2cask  "aerospace"
3cask  "orbstack"
4cask  "font-fira-code-nerd-font"
5brew  "ripgrep"
6brew  "fzf"
7brew  "yadm"

这样 brew install 清单本身也进了 dotfiles,换机重装从「照文章一条条复制」变成一条 brew bundle

本机这一条完全没开始

yadm 已装,但 yadm statusGit repo does not exist,即从未 init~/.Brewfile 也不存在。这台机器的配置目前只存在于这台机器上。装完软件就该开始第 8 节,不要等到要迁第二台机器时才后悔。


9. 装机顺序建议

按实际踩坑倒推,建议顺序:

  1. Homebrew + shellenv —— 没有它后面全是手动下载;
  2. Tailscale —— 在内网/路由还没被折腾之前先装(见第 3 节);
  3. GNU coreutils —— 后面所有 shell 脚本的语法基线;
  4. Kitty + Nerd Font + tmux —— 终端和按键手感先对齐,之后所有操作都顺手;
  5. yadm init + .Brewfile —— 把 1~4 的成果当场纳管,越早开始越省事;
  6. CLI 效率套件、VS Code + clangd + PlatformIO、Neovim 配置软链、Typst、Obsidian;
  7. 剩下的按需:OrbStack / OBS / 切片 / AI 客户端。
一句话总结

macOS 装机的难点从来不是装什么,而是怎么让一台 Unix 里的"异类"表现得像 Linux:coreutils 补齐行为差异、Kitty 补齐终端能力、AeroSpace 补齐窗口管理、yadm 补齐跨设备一致性。这四件事做完,剩下的只是选软件口味。


相关