这段时间在一台 M1 芯片的 MacBook 上装 CentOS 8,而且特意选了无界面安装路线。折腾下来最大的感受是:网上能找到的教程要么只讲图形界面安装,要么默认你用 x86 主机,M1 用户跟着做几乎每一步都会冒出奇怪的问题。这篇把整条路线从选方案、下镜像到装完配置源全部串起来,适合手里只有 Apple Silicon 设备、又想跑一个纯命令行 CentOS 8 虚拟机的人。
“无界面安装”这个词值得先说清楚。它至少包含两层意思:第一层是安装过程不要图形化界面,也就是让 Anaconda 安装器跑在文本模式下;第二层是装出来的系统不带桌面环境,登录进去就是一个字符终端。很多教程只解决其中一层,结果装完发现进入的是 GNOME 桌面,或者安装过程卡在黑屏上。这篇两个都覆盖,最终目标是一台开机就是命令行的 CentOS 8,默认不启动任何图形服务,方便当本地测试服务器用。
我实际用的方案是 UTM 加 QEMU 的 ARM64 模拟,加上 CentOS 8 的 aarch64 ISO,然后通过添加内核参数强制安装器进入文本模式。整个过程看着步骤多,但只要你理解了 M1 和 x86 的差异,后续每步都是有迹可循的。
1. 为什么要在 M1 芯片上装 CentOS 8:先想清楚无界面到底指哪一层
M1 是 ARM64 架构,和传统 PC 的 x86_64 指令集不通用。这意味着你在网上随便搜到的“下个 CentOS 镜像、写进 U 盘、开机安装”教程,在 M1 上第一步就走不通。M1 设备没有传统 BIOS,也不能像以前的 Mac 那样通过 Boot Camp 直接引导 Linux,最省事的路线就是虚拟机。
虚拟机方案在 M1 上也有选择差异。Parallels Desktop 和 VMware Fusion 都支持 ARM 虚拟机,但它们更偏向“有图形桌面的完整系统”,对只想跑一个无界面服务的人来说偏重。UTM 的好处是轻量、开源,底层用 QEMU 做模拟,也能调用 macOS 自带的虚拟化加速接口。要做纯命令行的 CentOS 8,UTM 是性价比最高的选择。
1.1 无界面安装的两种含义,技术上分别怎么实现
第一种“安装过程无界面”,靠的是 Anaconda 安装器支持文本模式。CentOS 8 默认会尝试启动图形安装器,但你在 GRUB 菜单里往内核参数末尾加上inst.text,它就会切换成字符界面的安装向导。字符界面虽然比不上图形界面直观,但该配的项目一个不少:安装源、软件包、磁盘分区、网络、root 密码、时区全部能设置。
第二种“系统本身无界面”,靠的是软件包选择。CentOS 8 安装器里提供了 Server、Minimal Install、Workstation 等软件包组合。Minimal Install 只装基础命令行工具和必要服务,不装 GNOME、KDE 那些东西。装完后想开图形界面还得自己手动安装包组,所以非常适合当服务器底座。
这两个操作互相独立,但放在一起就是标题想要的效果:安装过程没有图形、装完也没有图形,全程一个字符终端搞定。
1.2 为什么非要用 aarch64 版本,而不是靠转译跑 x86 镜像
M1 上的 UTM 虽然能模拟 x86 环境,也就是用 QEMU 做全指令集模拟,但性能损失非常明显。更关键的是,CentOS 8 官方本来就有 aarch64 架构的镜像,何必绕一大圈去转译。安装时要找文件名带aarch64的版本,比如CentOS-8.5.2111-aarch64-dvd1.iso,不要下x86_64结尾的。
这就像给一台 ARM 手机装 ARM 版 APK,功能和架构对上才能跑得顺。M1 本身就是 ARM64 处理器,虚拟机里跑同样架构的 Linux,QEMU 可以用 macOS 的 Hypervisor.framework 做硬件加速,速度接近原生,而不是靠软件模拟指令集那种慢到怀疑人生的状态。
2. 开工清单:ISO 镜像、UTM 下载和版本选择的三个坑
安装开始前先把物料准备好。M1 Mac 上跑 UTM 没问题,第一次用的话建议直接去官网下最新版 Apple Silicon 版本,也可以在 Mac App Store 里搜 UTM。注意别下成 Intel 版本,虽然官网一般会根据系统自动选择,但下载完还是看一眼安装包架构更稳妥。
UTM 不是一个大程序,安装之后会自带 QEMU 引擎。你不需要单独装 QEMU,也不需要懂 QEMU 的命令行参数,UTM 把所有常用配置都做成了图形界面。不过为了排查问题,你最好知道 UTM 背后是 QEMU,这样遇到黑屏、引导失败时才不会一头雾水。
2.1 CentOS 8 已经 EOL,镜像源和版本怎么选
CentOS Linux 8 的官方维护周期已经结束,原来的 mirror 列表基本都撤了。搜索下载时很容易点进一个已经失效的镜像站,或者下到一个非常旧的测试版本。我的建议是选最后的 8.5.2111 版本,这是 CentOS Linux 8 的最终版本,安装完成后把软件源切到 Vault 归档仓库,还能继续安装带安全更新的基础包。
下载时优先找带dvd1字样的完整安装镜像,不要一开始就用 boot.iso。完整 DVD 镜像里带了 BaseOS 和 AppStream 的软件包数据,安装时可以让安装器直接使用“本地安装源”,不依赖外部网络镜像。boot.iso 或者网络安装镜像需要安装期间就去访问 URL,而在 CentOS 8 EOL 之后,默认的镜像探测经常失败,会给新手增加不必要的麻烦。
2.2 校验 ISO 文件,别让一个下载错误毁掉一小时
下载完 ISO 之后,顺手校验一下哈希。macOS 自带shasum命令,不需要额外安装工具。不同镜像站的 SHA256 值一般在下载页旁边有标注,按下面的命令算一下就能比对:
shasum -a 256 CentOS-8.5.2111-aarch64-dvd1.iso这一步很多人跳过,但虚拟机安装卡住至少有一半是因为镜像不完整。ISO 文件很大,任何中断下载或者 CDN 异常都可能导致文件损坏。校验通过之后再进入下一步,能省掉后面最痛苦的排错阶段。
2.3 镜像方案对比
我整理了三种常见做法的对比,方便你判断为什么推荐 UTM 加完整 ISO:
| 方案 | 架构兼容性 | 安装复杂度 | 无界面友好度 | 适合场景 |
|---|---|---|---|---|
| UTM + CentOS 8 aarch64 DVD | 原生 ARM64 | 中 | 高 | 本地测试服务器、纯命令行环境 |
| Parallels Desktop | 原生 ARM64 | 低 | 低 | 需要图形桌面的完整 Linux |
| Docker 容器 | 原生 ARM64 | 低 | 高 | 只需要应用环境,不需要完整系统 |
如果你只是跑一个 Nginx 或者数据库,Docker 当然更轻。但如果你想要一个完整的、自己控制启动流程的 CentOS 8 系统,虚拟机才是正路。
3. 新建虚拟机到进入文本安装界面:按键级操作备忘
打开 UTM 之后,点新建虚拟机。新建向导里会遇到第一个选择:Virtualize 还是 Emulate。这两个词的差别是两个不同的底层路线:Virtualize 使用 macOS 的虚拟化框架,性能更好;Emulate 使用 QEMU 模拟器,兼容性更广。
我在 M1 上第一次用 Virtualize 装 CentOS 8,结果一直卡在 UEFI 引导阶段,后来切成 Emulate 反而一路顺畅。所以我的经验是:CentOS 8 这种并不是特别激进的内核,用 Emulate 更稳妥。设置界面选 Linux,架构选 ARM64(aarch64)。UTM 会帮你自动选好 QEMU 的机器类型和默认设备,不要乱改。
3.1 虚拟机参数怎么定:别一上来就把 8 核 16G 全塞进去
新建虚拟机的参数设置有四个关键点:
- 内存:安装时给 2048MB 是最低,想舒服一点就给 4096MB。CentOS 8 Minimal 安装完只需要几百 MB 内存,不需要 16G。
- CPU 核心数:给 2 到 4 个就够。M1 的核心数看着多,但给虚拟机太多核,调度反而有额外开销。
- 磁盘大小:建议至少 16GB,20GB 更合适。CentOS 8 基础系统加常用软件包会占到接近 4GB,再算上日志、缓存和临时文件,留点余量。
- 网络:选择默认的 Shared Network,也就是 NAT 模式。这个模式下虚拟机能访问外网,宿主机也能通过内网 IP 访问虚拟机,后续 SSH 正好用得上。
声音、USB 等不必要的设备全部关掉。文本安装根本用不到声卡,保留反而可能让 QEMU 多加载几个无用的驱动模块。设置完成后,把下载好的 aarch64 ISO 挂载到光盘驱动器中,启动虚拟机。
3.2 GRUB 菜单里的一行参数,决定你是黑屏还是文本界面
启动后,虚拟机屏幕会先出现 UEFI 引导画面,然后进入 CentOS 8 安装介质的 GRUB 菜单。默认第一项是安装系统,但这里不要直接按回车。先选中第一项,按字母e进入编辑模式,找到以linux开头的那一行,在行尾加一个空格,再追加inst.text。
追加完成后的效果类似:
linux ... inst.text然后按Ctrl-x启动。这个参数会让 Anaconda 安装器放弃图形模式,直接进入文本安装向导。如果你不加,QEMU 模拟出来的显卡驱动很容易在图形安装界面黑屏,这也是很多 M1 用户卡在第一屏的根本原因。
如果按下Ctrl-x之后没有反应,再确认一遍linux行末尾确实有一个空格,参数没粘在一起。文本安装界面随后会显示在 UTM 的窗口里,虽然是一个个字符拼出来的菜单,但照样能用键盘操作。
3.3 安装过程里你只需要记住 TAB 和回车
CentOS 8 的文本安装界面主要靠方向键、TAB、空格和回车操作。左侧是一列配置项,右侧是选中某个配置项后的详细区域。用方向键上下切换,用 TAB 在按钮和字段之间跳转,空格键勾选复选框,回车确认。
很多人第一次接触字符菜单会不知所措,其实你把它想象成一个没有鼠标的图形界面就行了。重点不是键盘操作复杂,而是你要知道该去哪些配置项里做什么。
4. 文本安装程序里的关键选项:这些选择决定后续能不能省心
进入文本安装界面后,会遇到下面几个配置项。我的建议是不要一路默认,有些默认选项会在装完后给你制造额外工作量。
4.1 安装源与软件包选择
因为用的 DVD 镜像,安装源一般能自动识别成 Local Media。如果它没有自动识别,手动进 Installation Source 里选择Local media,不要选 Closest mirror,否则 EOL 后的镜像探测会失败。
接下来进 Software Selection,这是整个安装过程里最影响最终形态的选项。项目里选择 Minimal Install,也就是“最小安装”。这个选项会跳过所有图形界面相关组件,只保留命令行基础工具。升级、日志、网络、SSH 这些核心服务都会在,但不会多装任何窗口管理器。如果你想要一个跑服务的系统,选这个就对了。
4.2 磁盘分区:自动分区够用,但不代表你不能手动
Installation Destination 默认会自动分区。对大多数测试环境来说,直接接受自动分区没问题。它会自动创建 UEFI 引导分区、swap 和根分区,文件系统用 xfs,CentOS 默认的服务器文件系统,稳定且适合大文件场景。
如果你想手动控制分区,选择 Custom,然后手动创建这几个分区:
/boot/efi,大小为 200MB,用来放 UEFI 引导文件。/boot,大小 1GB,放内核和 initramfs。swap,大小和内存相当,最少给 2GB。/,剩余空间全部给它。
手动分区唯一的好处是内存小时可以显式给足 swap,避免编译软件时内存不足。但如果只是跑常规服务,自动分区完全足够。新手没必要在这里卡太久。
4.3 网络和主机名:这一步千万别跳过
文本安装界面的 Network & Host Name 项目非常关键。进去之后先把网络连接开关打开,让它能通过 NAT 获取到一个 DHCP 地址。如果这一步不做,装完重启后系统根本没有可用网卡,后续 SSH 都连不上。
同时把主机名改成一个有辨识度的名字,比如centos8-arm。主机名在安装时改好,后面就不用再动hostnamectl。改完后这个配置项里应该能看到网卡状态变成已连接,同时出现 IP 地址。有了一行 IP,后面所有远程操作都能原地开始。
4.4 root 密码、普通用户和 Kdump
Root 密码必须设置,这个不多说。文本界面还允许你创建一个普通用户,我强烈建议顺手建一个,并勾选让这个用户拥有管理员权限。因为 CentOS 8 默认的 sshd 配置里,root 用户通过密码远程登录通常是禁用的。如果你只设置了 root 密码,后面想 SSH 进来会发现直接被拒绝。用普通用户登录后再通过sudo提权才是更顺的操作路径。
Kdump 选项可以直接关掉。Kdump 是内核崩溃转储机制,对生产服务器可能有用,但在测试虚拟机里它既占内存又没有实际场景。在 TUI 里取消启用,能给虚拟机省下几百 MB 内存。
所有配置完成后,点 Begin Installation。安装进程会花上几分钟,取决于你给的内存和磁盘速度。M1 的 NVMe 读写非常快,瓶颈基本只在 QEMU 的模拟设备上,耐心等它跑完。
5. 装完重启以后:先把网络和 SSH 拉起来,不然只能面对一个字符黑洞
安装进度到 100% 后,界面上会有 Reboot 按钮。重点来了:重启之前先回 UTM 设置里把光盘驱动器清空,或者把 ISO 挂载移除。不然重启后虚拟机又会从 ISO 引导,进入安装菜单而不是你刚装好的系统。
重启后你会看到一个普通的登录提示符。用刚才创建的用户或者 root 登录。第一次进系统是纯文本环境,什么都还没有配置,第一步就是确认网络状态。
ip a这个命令会列出所有网卡和 IP。如果网卡有地址,说明安装器里设置网络生效了。如果只有lo,没有任何以太网接口的 IP,需要手动激活网络:
nmcli device status nmcli connection show找出你的网卡名,然后重新激活连接。不同环境下网卡名可能叫eth0、enp0s1之类的,按实际名字替换:
sudo nmcli connection up eth0如果连接还不存在,就新建一个 DHCP 连接:
sudo nmcli connection add type ethernet ifname eth0 con-name eth0 sudo nmcli connection modify eth0 ipv4.method auto sudo nmcli connection up eth05.1 启用 SSH 服务
CentOS 8 Minimal 默认安装了 OpenSSH 服务端,但没有自动启动。要让远程终端连进来,手动启用并设置开机自启:
sudo systemctl enable --now sshd检查一下服务状态:
sudo systemctl status sshd如果输出里有Active: active (running),说明 SSH 已经在监听 22 端口。此时回到 Mac 的终端里,用ssh命令连接虚拟机的 IP:
ssh 你的用户名@虚拟机IP地址第一次连接会提示确认主机指纹,输入yes回车,再输入密码就能登录。到这里,你已经有了一台运行在 M1 虚拟机里的纯无界面 CentOS 8,远程管理起来和云服务器没有本质区别。
5.2 如果 SSH 连不上的排查顺序
SSH 连不上时不要慌。先确认虚拟机内部sshd是否在运行,再确认虚拟机和 Mac 能不能互相 ping 通。UTM 的 Shared Network 下,虚拟机的 IP 通常是192.168.x.x网段,以实际ip a输出为准。如果防火墙拦了 22 端口,在虚拟机上放行:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload还有一个小细节,用普通用户登录后,如果要执行sudo,需要确保该用户在wheel组里。安装时如果勾选了管理员权限,这一步通常已经完成。
6. CentOS 8 生命周期结束后的善后:把 yum 源切到 Vault,才能继续装软件
CentOS Linux 8 的维护期结束后,默认的 mirrorlist 基本都失效了。你第一次执行sudo dnf update或者sudo dnf install vim的时候,大概率会看到类似“Cannot prepare internal mirrorlist: No URLs in mirrorlist”的报错。这是正常的,不是你的网络问题,而是源的问题。
要解决这个问题,把/etc/yum.repos.d/下的仓库配置文件从 mirrorlist 模式改成指向 Vault 归档仓库的固定 baseurl。Vault 仓库把 CentOS 8.5.2111 的 BaseOS、AppStream、extras 等仓库都保留了下来,可以在 EOL 之后继续拉取软件包。
6.1 一键切换源
在虚拟机上执行下面的命令,把 repo 文件里的 mirrorlist 注释掉,并把 baseurl 指向 Vault:
sudo sed -i \ -e 's/^mirrorlist=/#mirrorlist=/' \ -e 's|^#baseurl=http://mirror.centos.org/\$contentdir/\$stream|baseurl=https://vault.centos.org/8.5.2111|' \ /etc/yum.repos.d/CentOS-Linux-*.repo然后清理缓存并重建:
sudo dnf clean all sudo dnf makecache如果makecache顺利跑完,说明源已经生效。之后安装常用工具就不会再报错了:
sudo dnf install -y vim wget bash-completion6.2 手动写仓库文件的方式
有些情况下sed匹配不成功,主要是因为不同镜像打包的 repo 文件写法有差异。这时可以直接新建一个干净的仓库文件,把旧的禁用或者移走。比如在/etc/yum.repos.d/下新建CentOS-Vault.repo,内容类似:
[BaseOS] name=CentOS Linux 8.5.2111 - BaseOS baseurl=https://vault.centos.org/8.5.2111/BaseOS/$basearch/os/ gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial [AppStream] name=CentOS Linux 8.5.2111 - AppStream baseurl=https://vault.centos.org/8.5.2111/AppStream/$basearch/os/ gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial这里$basearch在 dnf 解析时会自动替换成aarch64。写入后重新dnf makecache即可。
6.3 时区和时间同步也别忘
无界面服务器最容易出现的一个隐形问题是时间不对。虚拟机刚装完,时区可能是 UTC,本地时间会差 8 小时。SSH 日志、HTTPS 证书校验都会受到影响。改一下时区:
sudo timedatectl set-timezone Asia/Shanghai同时打开 chrony 时间同步服务:
sudo systemctl enable --now chronyd时间同步在虚拟化环境里尤其重要,因为虚拟机暂停再恢复后,系统时间往往会出现偏移。
7. M1 虚拟化环境里的踩坑记录:如果卡住了,照着这个顺序查
最后整理几个我实际遇到过的坑。这些问题是 M1 加 UTM 加 CentOS 8 这个组合里最容易翻车的地方,提前看了能少走很多弯路。
7.1 开机黑屏:先怀疑图形安装器,再怀疑虚拟化模式
黑屏大概率发生在安装阶段,原因通常是 CentOS 8 默认进入图形安装器,但 QEMU 模拟的显卡在 M1 主机上兼容性一般。解决办法就是前面说的,进入 GRUB 编辑模式,在linux行末尾加inst.text。加了之后如果还黑屏,把虚拟机的虚拟化模式从 Virtualize 换成 Emulate,或者反过来再试一次。不同版本的 UTM 和 QEMU 组合表现有差异,切换模式比改一堆参数更直接。
7.2 重启后又进入安装界面
这是忘了摘 ISO。UTM 里打开虚拟机设置,找到光盘驱动器,把镜像从已连接改成断开,或者直接卸载。否则每次重启都会从 ISO 引导,硬盘里已经装好的系统反而不会被启动。
7.3 dnf 报 “No URLs in mirrorlist”
这个问题在 EOL 后的 CentOS 8 上几乎必然出现。不要试图去检查网络连接,直接按第 6 节的内容切到 Vault 源。需要注意,如果你用了 CentOS Stream 的镜像,路径是另一套,不要混用。
7.4 SSH 连不上,但系统本身正常
先看sshd是否在跑,再看网卡有没有 IP。很多时候是安装时没有开启网络连接,导致重启后网卡没有获得 DHCP 地址。用虚拟机的字符终端执行nmcli device status,确定网卡和连接名,重新 up 一次。如果网卡有 IP 但连不上,再用firewall-cmd放行 SSH。
7.5 UTM 暂停恢复之后网络不通
UTM 支持把虚拟机暂停,但恢复后虚拟网卡偶尔会进入异常状态。此时不需要重启系统,在虚拟机里把网卡重新激活即可:
sudo nmcli connection down eth0 sudo nmcli connection up eth0如果连续几次都不行,重启虚拟机基本能恢复。
7.6 安装和运行速度比预期慢
M1 本身性能很强,但 QEMU 模拟的设备多多少少会拖慢速度。安装时选择 Minimal Install,减少需要解压和写入的软件包数量,能明显缩短安装时间。运行阶段尽量不要开太多重型服务,CentOS 8 Minimal 本身很轻,瓶颈通常在你同时跑了编译任务和数据库这类高负载场景。
如果你也跟我一样只是想用 MacBook 在本地维护一个干净的命令行环境,M1 加 UTM 加 CentOS 8 这套组合完全够用。装完之后源切到 Vault、SSH 远程能用、时间同步正常,剩下的就是在里面自由折腾了。