【前情提要】 小林,应届生,乐观话痨,入职第一天。导师老周递来一台 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
“这下重启也不怕了。”小林满意地拍了拍手。
排错思路总结:
brew install卡在Cloning into...,大概率是 GitHub 访问慢。- 临时解决:设置 Homebrew 镜像环境变量。
- 永久解决:把 export 写进
~/.zshrc,再source生效。 - 验证:
echo $HOMEBREW_BREW_GIT_REMOTE看变量是否生效。
七、练习
- 练习一:在 Mac 上打开终端,执行
echo $SHELL,确认当前默认 shell。然后执行bash切换到 bash,再执行echo $0,观察输出。最后exit回到 zsh。 - 练习二:用 Homebrew 安装
tree命令(brew install tree),安装完成后执行tree --version验证。如果安装卡住,尝试配置镜像源。 - 练习三:执行
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 难一点》