【前情提要】 小林,应届生,乐观话痨,入职第一天。导师老周递来一台 MacBook Air M2,说:“你的服务器,在虚拟机里。”小林以为运维就是敲敲命令,结果连终端都没打开过。

一、入职第一天,工位是一台 Mac

小林推开办公室玻璃门的时候,脑子里还回荡着昨晚背的八股文:“Linux 文件权限、进程管理、网络配置……”

结果老周——一个穿格子衫、端着保温杯、看起来像刚打完副本的中年男人——把他领到工位,从抽屉里掏出一台银色 MacBook Air,往桌上一放。

“你的。”

小林愣了两秒:“周哥,咱不是运维吗?不给我发台服务器?”

老周喝了口枸杞水,慢悠悠地说:“服务器在机房,你人在这儿。你总不能抱着机柜敲命令吧?先用 Mac,回头我给你在虚拟机里装 Ubuntu。”

小林眼睛一亮:“虚拟机?就是那种,一台电脑里跑另一台电脑?”

“对,你 Mac 里跑 Ubuntu,Ubuntu 里跑你的服务。搞坏了,快照一恢复,三秒钟满血复活。”老周拍了拍他肩膀,“比你去机房拔网线快多了。”

小林点点头,心想:这工作不错,至少不用搬服务器。

然后老周补了一句:“对了,你终端会用吧?”

小林的笑容凝固了。

二、终端:Mac 的“黑框框”,比你想象的好用

老周拉了一把椅子坐下,指着屏幕说:“先打开终端。聚焦搜索,敲 Terminal,回车。”

小林照做。一个白底黑字的窗口弹出来,最后一行写着:

xiaolin@MacBook-Air ~ %

“这就对了。”老周说,“你以后 90% 的运维工作,都在这一个窗口里完成。”

小林盯着那个 % 号,问:“周哥,这个 % 是啥意思?我看网上教程都是 $。”

老周笑了:“问得好。这个 % 说明你现在用的是 zsh。Mac 从 Catalina 开始,默认 shell 就是 zsh。你网上看到的那些 $,多半是 bash。”

“zsh 和 bash,有啥区别?”

“对你现在来说,区别不大。都是 shell,都是让你跟系统对话的翻译官。”老周用指关节敲了敲桌子,“但你记住一句话:Mac 默认 zsh,Linux 默认 bash。你写脚本的时候,如果第一行写 #!/bin/bash,那就老老实实在 bash 里跑。别在 zsh 里跑 bash 脚本,也别在 bash 里跑 zsh 脚本。会出玄学问题。”

小林点头如捣蒜,虽然他没完全听懂,但他记住了“玄学问题”四个字——听起来很严重。

“那我要切 bash 怎么办?”小林问。

“敲 bash 回车,就进了 bash。敲 exit 或者按 Ctrl+D,就回到 zsh。”老周说,“你试试。”

小林敲了 bash,提示符从 % 变成了 $。他又敲了 exit,变回 %。

“好玩。”小林说。

“好玩吧?还有更好玩的。”老周说,“你敲 echo $SHELL,看看当前默认 shell 是啥。”

小林敲了:

echo $SHELL

输出:

/bin/zsh

“记住了,”老周说,“$SHELL 是当前默认 shell,$0 是当前正在运行的 shell。这两个有时候不一样,你自己心里有数就行。”

小林在笔记本上写下:Mac = zsh,Linux = bash,脚本第一行写 #!/bin/bash。

三、Homebrew:Mac 上的“软件管家”

老周接着说:“你现在这台 Mac,啥软件都没有。你得先装个包管理器。”

“包管理器?”

“你可以理解成 Mac 上的‘应用商店’,但是命令行的。”老周说,“它叫 Homebrew。以后你装软件,基本就是 brew install 软件名,卸载就是 brew uninstall 软件名。比你上官网下 dmg 再拖到 Applications 快多了。”

小林兴奋了:“这个好,我就喜欢命令行的东西。”

“别急,装 Homebrew 有个坑。”老周露出一个意味深长的笑容,“你先把这条命令复制进去。”

老周给了一条命令,是 Homebrew 官网的标准安装命令(Apple Silicon 版本):

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

小林复制、粘贴、回车。

终端开始滚动:

==> Checking for `sudo` access (which may request your password)...
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
...
==> Downloading and installing Homebrew...

然后,卡住了。

Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-cask'...

一分钟,两分钟,三分钟。光标不动了。

小林:“周哥,它是不是死了?”

老周凑过来看了一眼:“没死,在克隆仓库。但你这网速,估计得等到下班。”

“那怎么办?”

“换镜像源。”老周说,“Homebrew 默认从 GitHub 拉代码,国内访问 GitHub 有时候看运气。咱们换成国内镜像。”

老周让小林按 Ctrl+C 中断安装,然后执行:

export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"

然后重新运行安装命令。

这次,终端刷刷刷地跑完了。

==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
==> Run `brew help` to get started

“装好了。”老周说,“但你现在 brew 命令还用不了,因为 PATH 没配。”

“PATH?”

“系统找命令的路径。”老周说,“你敲 brew --version 试试。”

小林敲了:

brew --version

输出:

zsh: command not found: brew

“看到了吧?”老周说,“Homebrew 装在 /opt/homebrew/bin/ 里,但这个目录不在你的 PATH 里。你得把它加进去。”

老周让小林执行:

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

然后再次敲:

brew --version

输出:

Homebrew 4.x.x

“成了。”小林说。

“记住两件事,”老周竖起两根手指,“第一,Apple Silicon 的 Homebrew 装在 /opt/homebrew/,Intel Mac 装在 /usr/local/。你在网上搜教程,看到 /usr/local/ 别慌,那是 Intel 的路径。第二,brew install 装的是命令行工具,brew install --cask 装的是图形界面软件。别搞混。”

小林在笔记本上写下:

  • Homebrew 安装命令:官网那条
  • Apple Silicon 路径:/opt/homebrew/
  • Intel Mac 路径:/usr/local/
  • PATH 配置:eval "$(/opt/homebrew/bin/brew shellenv)" 写进 ~/.zshrc
  • 国内镜像:清华 TUNA

四、Apple Silicon:你的 Mac 是 ARM,不是 Intel

装完 Homebrew,老周没急着走,又补了一刀:“你知道你这台 Mac 是什么架构吗?”

“M2?”小林说。

“M2 是芯片型号,我问的是架构。”老周说,“你敲 uname -m。”

小林敲了:

uname -m

输出:

arm64

“看到了吗?arm64。”老周说,“以前 Mac 是 Intel 芯片,架构是 x86_64。现在 Apple Silicon 是 ARM 架构,arm64。这两个架构的软件,不能随便混用。”

“那有啥影响?”

“影响大了。”老周说,“你以后下软件、下镜像,都得看架构。比如你下 Ubuntu 镜像,得下 ARM64 版,不能下 AMD64 版。下错了,虚拟机直接黑屏,你查半天查不出来。”

小林心里一紧,赶紧记下:Apple Silicon = arm64,Intel Mac = x86_64,下载镜像认准 ARM64。

“那 Ubuntu 有 ARM64 版吗?”小林问。

“有,Ubuntu 从 20.04 开始就正式支持 ARM64 了。”老周说,“你下 Ubuntu 26.04 LTS 的 ARM64 镜像就行。别下 Server 版,下 Desktop 版,带图形界面,你入门方便。”

“26.04?我看网上好多教程都是 22.04。”

“26.04 是最新的 LTS,2026 年 4 月刚出的。”老周说,“命令用法和 22.04 基本一样,你跟着学没问题。而且 26.04 有些新东西,比如 sudo 用 Rust 重写了,叫 sudo-rs,但语法没变,你感知不到。”

小林点点头,虽然“Rust 重写”四个字对他来说跟“量子力学”差不多。

五、VMware Fusion:在 Mac 里装一台“电脑”

“好了,基础打完了。”老周站起来,伸了个懒腰,“现在装虚拟机。”

“装哪个?”

“VMware Fusion。”老周说,“Mac 上主流虚拟机就三个:VMware Fusion、Parallels、UTM。Parallels 要钱,UTM 免费但配置略麻烦。VMware Fusion 现在个人使用也免费了,对 Apple Silicon 支持也好,就它了。”

老周让小林打开浏览器,搜索 “VMware Fusion download”,找到 Broadcom 官网,下载 Apple Silicon 版本。

下载、安装、一路下一步。装完之后,打开 VMware Fusion,界面弹出来。

“新建虚拟机。”老周说,“但你 Ubuntu 镜像还没下,今天先不装。你先把镜像下了。”

老周给了 Ubuntu 官网地址:https://ubuntu.com/download/desktop,让小林选 26.04 LTS ARM64 版本下载。

“下完放桌面,明天来装。”老周说,“今天你先熟悉一下终端,把 Homebrew 用熟。对了,你装个 Hugo 试试。”

“Hugo?那是啥?”

“一个静态网站生成器。”老周说,“咱们第一个项目,就是用它搭一个博客。你先装上,明天我们开搞。”

小林敲:

brew install hugo

终端跑了一会儿,输出:

==> Downloading https://...
==> Installing hugo
🍺  /opt/homebrew/Cellar/hugo/0.x.x: 1,234 files, 56.7MB

小林敲:

hugo version

输出:

hugo v0.x.x+extended darwin/arm64

“装好了。”小林说。

“注意看最后那个 darwin/arm64。”老周说,“darwin 是 macOS 的内核名,arm64 是架构。以后你看到 linux/amd64、linux/arm64,都是同样的道理。平台 + 架构,决定了这个软件能不能在你的机器上跑。”

小林在笔记本上重重写下:平台 + 架构 = 能不能跑。

六、排错挑战:Homebrew 卡在 “Cloning into…”

第二天,小林到工位,打开终端,想再装个 wget。结果:

brew install wget

终端停在:

Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-core'...

又是这个。

小林等了五分钟,没动静。他想起昨天老周说的镜像源,但他昨天只设了环境变量,重启终端后好像失效了。

他检查了一下:

echo $HOMEBREW_BREW_GIT_REMOTE

输出是空的。

“果然。”小林自言自语,“环境变量只在当前终端有效,关了就没了。”

他重新执行:

export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"

然后再次 brew install wget。

这次,几秒钟就装好了。

小林想了想,把这三行 export 写进了 ~/.zshrc:

echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"' >> ~/.zshrc
echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"' >> ~/.zshrc
echo 'export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"' >> ~/.zshrc
source ~/.zshrc

“这下重启也不怕了。”小林满意地拍了拍手。

排错思路总结:

  1. brew install 卡在 Cloning into...,大概率是 GitHub 访问慢。
  2. 临时解决:设置 Homebrew 镜像环境变量。
  3. 永久解决:把 export 写进 ~/.zshrc,再 source 生效。
  4. 验证:echo $HOMEBREW_BREW_GIT_REMOTE 看变量是否生效。

七、练习

  1. 练习一:在 Mac 上打开终端,执行 echo $SHELL,确认当前默认 shell。然后执行 bash 切换到 bash,再执行 echo $0,观察输出。最后 exit 回到 zsh。
  2. 练习二:用 Homebrew 安装 tree 命令(brew install tree),安装完成后执行 tree --version 验证。如果安装卡住,尝试配置镜像源。
  3. 练习三:执行 uname -m,记录你的 Mac 架构。然后去 Ubuntu 官网下载对应的 26.04 LTS 镜像,确认文件名中是否包含 arm64(Apple Silicon)或 amd64(Intel)。

参考答案

练习一:

echo $SHELL        # 输出 /bin/zsh
bash               # 进入 bash
echo $0            # 输出 bash 或 -bash
exit               # 回到 zsh

要点:$SHELL 是登录 shell,$0 是当前进程 shell。Mac 默认 zsh,Linux 默认 bash。

练习二:

brew install tree
tree --version

如果卡在 Cloning into...,执行:

export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"

然后重试。

练习三:

uname -m

Apple Silicon 输出 arm64,Intel Mac 输出 x86_64。Ubuntu 26.04 LTS 下载页中,Apple Silicon 选 arm64,Intel 选 amd64。

下集预告

小林下载好了 Ubuntu 26.04 LTS ARM64 镜像,准备在 VMware Fusion 里装虚拟机。但他不知道,NAT 网络、ARM64 镜像、磁盘分区,每一个都可能让他卡住。老周说:“装虚拟机不难,难的是装完之后,你 Mac 怎么连上它。”

下一集:《在 Mac 里装一台 Ubuntu,比装 App 难一点》