目标:得到一台 Rocky Linux 9 机器,并完成最基础的系统设置(软件源、swap、防火墙、SELinux)。本篇不涉及任何 k8s 安装。
本地练习用 Lima 在 Mac 上创建虚拟机;如果是真实服务器,直接从「第 2 步」开始。
网络异常(dnf 卡住 / 虚拟机无法出网)直接看文末「附录 A:网络分层排查实录」。
本篇为阶段 0 上半部分;内核参数与容器运行时见 阶段 0(下)。
1. 创建 Rocky Linux 9 虚拟机(仅 Mac 本地练习需要)
1.1 搭建思路(小白视角)
在动手前,先搞清楚"我们到底在造什么东西":
1
2
3
4
5
6
7
8
9
10
11
12
13
| 你的 Mac(macOS,没有 Linux 内核)
│ k8s 是纯粹的 Linux 技术,macOS 上跑不了
▼
需要一个"电脑里的电脑" = 虚拟机
│ Lima:开源虚拟机工具(brew 安装),底层用 macOS 自带的虚拟化框架
▼
虚拟机开机需要两样东西:
① 系统盘镜像 = 一个"装好 Rocky 9 系统的硬盘文件"(qcow2,约 496MB)
② 规格说明书 = 模板文件 lima/rocky-9-ustc.yaml(用哪个镜像、几张网卡、挂什么目录)
▼
limactl start 读模板 → 校验镜像 → 复制扩容成 30G 系统盘 → 开机 → 自动配好 SSH
▼
limactl shell 进去,就是一台标准的 Rocky Linux 9 服务器
|
为什么要手动下载镜像(而不是让 Lima 自己下):Rocky 官方源国内只有约 50KB/s,
国内最快的中科大镜像站会用 WAF 拦截 Lima 的多线程下载器(403)。
所以用 curl 单线程先下载到本地(1~2 分钟),模板直接指向本地文件——
创建虚拟机时完全不需要联网下载,重建也只要几分钟。
1.2 操作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # ① 安装 Lima(开源虚拟机工具)
brew install lima
# 验证安装:版本号 ≥ 2.0.0 即满足模板门槛(minimumLimaVersion: 2.0.0)
brew info lima | head -2
# 预期输出:==> lima ✔: stable 2.2.0 (bottled), HEAD
# 注:Caveats 里提到的 lima-additional-guestagents 是给"跨架构模拟"用的
#(M 系列芯片跑 x86 虚拟机才需要),aarch64 虚拟机 + Apple Silicon 是同架构,不用装。
# ② 从中科大镜像站手动下载 Rocky 9.8 镜像(约496MB,1~2分钟)
curl -o lima/images/rocky-9.8-aarch64.qcow2 \
https://mirrors.ustc.edu.cn/rocky/9/images/aarch64/Rocky-9-GenericCloud-Base-9.8-20260525.0.aarch64.qcow2
# (可选)校验镜像完整性:输出必须等于模板里的 digest
shasum -a 256 lima/images/rocky-9.8-aarch64.qcow2
# 预期输出:24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe
# ③ 创建并启动虚拟机(4核/6GB内存/30GB磁盘),模板 lima/rocky-9-ustc.yaml 指向上面的本地镜像
limactl start --name=k8s-rocky --cpus=4 --memory=6 --disk=30 --tty=false lima/rocky-9-ustc.yaml
|
预期输出(创建完成后):
1
| INFO[...] READY. Run `limactl shell k8s-rocky` to open the shell.
|
④ 确认虚拟机创建成功(三连验证,都在 Mac 上执行):
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 第一看状态:STATUS 是 Running,且规格符合预期(4核/6GiB/30GiB)
limactl list
# 预期输出:
# NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK
# k8s-rocky Running 127.0.0.1:xxxxx vz aarch64 4 6GiB 30GiB
# 第二看系统:能读出 Rocky Linux 9 的系统信息
limactl shell k8s-rocky -- cat /etc/os-release | head -2
# 预期输出:NAME="Rocky Linux" / VERSION="9.8 (Blue Onyx)"
# 第三看架构:aarch64(与模板 arch 一致)
limactl shell k8s-rocky -- uname -m
# 预期输出:aarch64
|
1
2
| # ⑤ 进入虚拟机(之后所有操作都在虚拟机里执行)
limactl shell k8s-rocky
|
真实服务器:跳过本步,直接 SSH 登录你的 Rocky 9 服务器即可。
以下所有命令在两种环境下完全一致。
1.3 模板文件逐行解读(lima/rocky-9-ustc.yaml)
模板全文如下(它就是你这台虚拟机的"出生证明"):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Lima 虚拟机模板:Rocky Linux 9 (aarch64)
minimumLimaVersion: 2.0.0
images:
- location: "/Users/wyf/work/agentproject/k8study/lima/images/rocky-9.8-aarch64.qcow2"
arch: "aarch64"
digest: "sha256:24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe"
mounts:
- location: "~"
mountTypesUnsupported: [9p]
# 使用 macOS Virtualization.framework 的 NAT 网络(vzNAT)
networks:
- vzNAT: true
|
逐字段拆解:
minimumLimaVersion: 2.0.0 — 版本门槛
Lima 低于 2.0.0 会直接拒绝启动这个模板,而不是做到一半出错。相当于软件包装盒上的"系统要求"。
images: — 虚拟机的系统盘从哪来
| 字段 | 含义 |
|---|
location | 镜像文件位置。可以是 URL(Lima 会联网下载),这里写死本地绝对路径 → 创建时零下载 |
arch | 镜像的 CPU 架构。aarch64 = ARM64,对应 Apple Silicon;Intel Mac 要用 x86_64 |
digest | 镜像的 SHA256 校验值。Lima 用前必校验,文件损坏或被篡改就拒绝启动 |
手动校验镜像完整性的方法(算法必须和模板里一致,MD5 和 SHA256 没有可比性):
1
2
| shasum -a 256 lima/images/rocky-9.8-aarch64.qcow2
# 输出应等于 24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe
|
mounts: - location: "~" — 把 Mac 主目录共享进虚拟机
Mac 的 /Users/wyf 会原样出现在虚拟机的 /Users/wyf(同路径、同数据、实时同步)。
所以虚拟机里能直接看到本教程的 docs 和 scripts,不用来回拷贝。
默认只读(没写 writable: true),虚拟机改不了 Mac 的文件——这是安全设计。
实物证据:开机后这行配置被翻译成虚拟机 /etc/fstab 里的一条记录
lima-... /Users/wyf virtiofs ro,nofail,...(virtiofs 文件系统 + ro 只读)。
附带福利:limactl shell 进虚拟机会自动 cd 到你 Mac 上当前所在的目录。
mountTypesUnsupported: [9p] — 禁用一种挂载实现
目录共享有多种后端技术,9p 是老牌协议但 Rocky 9 内核支持不好。
声明不支持后,Lima 改用 virtiofs(macOS 原生虚拟化框架自带,快且稳)。
networks: - vzNAT: true — 让 Mac 能直接访问虚拟机(关键)
不加这行时,虚拟机只有默认的 usernet 网卡(192.168.5.x),Mac 访问不到虚拟机 IP。
加了 vzNAT 后,macOS 系统框架给虚拟机第二张网卡(lima0,192.168.64.x),
Mac 浏览器可以直接访问——后续在 Mac 上访问 NodePort/Ingress 就用这个 IP:
1
| limactl shell k8s-rocky hostname -I # 取 192.168.64.x 那个
|
等价于 Lima 的 shared 网络,但 vzNAT 不需要安装 socket_vmnet、不需要 sudo,零配置。
命令行参数与模板的关系:--cpus=4 --memory=6 --disk=30 是创建时的规格
(模板里没写,也可以写进模板);--name=k8s-rocky 给虚拟机命名;
--tty=false 表示创建过程无需交互。这些只在创建时有效,之后用
limactl stop / start 开关机即可,参数已固化在 ~/.lima/k8s-rocky/ 里。
附:Lima 日常管理命令速查(都在 Mac 上执行)
| 命令 | 作用 |
|---|
limactl list | 查看所有虚拟机及状态(Running/Stopped) |
limactl shell k8s-rocky | 进入虚拟机终端 |
limactl shell k8s-rocky -- <命令> | 不进入虚拟机,直接在 Mac 终端执行一条虚拟机里的命令 |
limactl stop k8s-rocky | 关机(虚拟机里所有配置和数据保留) |
limactl start k8s-rocky | 开机(= 重启就是 stop 再 start) |
limactl show-ssh k8s-rocky | 查看 SSH 连接方式(可用标准 ssh 命令进虚拟机) |
limactl delete k8s-rocky | 删除(卸载)虚拟机,数据全丢、不可逆,只影响 ~/.lima/k8s-rocky,不动 Mac 任何东西 |
推倒重建(想从头再练一遍时):
1
2
3
4
| limactl stop k8s-rocky
limactl delete k8s-rocky
# 镜像已下载在 lima/images/,重建只需 2~3 分钟:
limactl start --name=k8s-rocky --cpus=4 --memory=6 --disk=30 --tty=false lima/rocky-9-ustc.yaml
|
💡 记忆法:limactl 开头的命令都在 Mac 上执行(管理虚拟机);
本文第 2 步开始的命令都在虚拟机里执行(折腾系统)。拿不准在哪,敲 hostname。
2. 切换到 root,软件源换国内镜像
后续命令都以 root 执行(kubeadm 官方文档也是如此):
网络预检(30 秒钟,避免后面卡死。虚拟机出网状态会随 Mac 的网络环境变化——
换网络、开关代理软件都可能改变它,所以环境有变化就先预检):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # ① 先清理可能残留的代理配置——代理软件关着、配置却还指向它,
# 会造成"假性网络故障",先排除这个干扰项:
grep proxy /etc/dnf/dnf.conf
# 有输出(proxy=http://...)则删掉:
sed -i '/^proxy=/d' /etc/dnf/dnf.conf
env | grep -i proxy
# 有输出(http_proxy=... 等)则清掉:
unset http_proxy https_proxy
# ② 确认 Mac 上的代理软件状态(在 Mac 终端执行,空输出=没在运行):
ps aux | grep -iE 'clash|verge|mihomo' | grep -v grep
# ③ 直连测试(虚拟机里执行。不用 -s:成功显示响应头,失败显示明确报错):
curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/
# 看到 HTTP/2 200 等响应头 → 直连正常,继续往下
# 看到 curl: (28) 超时等报错 → 直连出网被拦(常见于 Mac 装有企业安全软件),
# 打开 Mac 上的 Clash(需开启"允许局域网连接"),
# 然后去「附录 A.3」配好代理再回来
# 想看更详细过程时用 curl -v -m 10 <URL>,能看清卡在 DNS / TCP / TLS 哪一步
|
Rocky 官方源国内很慢,换成中科大镜像(真实服务器如果网络好可跳过)。
第一步永远是"先看清楚"(改配置的黄金法则:先看 → 再改 → 后验证):
1
2
| # 动手前先确认目标文件的真实格式,顺便验证待会儿 sed 的模式能不能匹配上:
grep -nE '^(metalink|mirrorlist|#?baseurl)' /etc/yum.repos.d/rocky.repo | head -6
|
预期输出(Rocky 9.8 的出厂状态,实测):
1
2
3
4
5
6
| 13:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever$rltype
14:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/
23:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever-debug$rltype
24:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/debug/tree/
32:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=source&repo=BaseOS-$releasever-source$rltype
33:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/source/tree/
|
读法:mirrorlist= 行(未注释)= 启用的官方动态源(国内慢,就是要换掉的对象);
#baseurl= 行(带 #)= 注释掉的备用地址(等下要启用并指向中科大)。
每个仓库段(BaseOS / debug / source / AppStream……)都是同样两行成对出现。
💡 老版本 Rocky 显示的是 metalink= + #baseurl=https://...,格式不同。
这正是换源 sed 要兼容两种格式的原因;如果将来版本又变了,以这一步看到的实际格式为准。
确认格式后执行换源(兼容新老两种格式的写法):
1
| sed -e 's|^metalink=|#metalink=|g' -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=https\?://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' -i.bak /etc/yum.repos.d/rocky*.repo
|
⚠️ 三个坑都要防:
① sed 匹配不到时静默成功、不报错,必须验证(很多人栽在这里);
② -i.bak 每次执行都会重新备份当前文件,重复执行会把"原始备份"覆盖成"改后的文件"。
想稳妥留底,动手前先手动存一份:cp /etc/yum.repos.d/rocky.repo{,.orig}(还原:cp 反向拷贝);
③ 多行命令(带 \ 续行)粘贴到终端容易断行,报 command not found / sed: can't read 时,
把命令拼成单行重贴(本文给的换源 sed 就是单行版,可直接复制)。
验证(必须两项都过):
1
2
3
4
5
6
7
| grep -E '^baseurl' /etc/yum.repos.d/rocky.repo | head -3
# 必须看到输出:baseurl=https://mirrors.ustc.edu.cn/rocky/$releasever/BaseOS/$basearch/os/ 等
grep -cE '^(metalink|mirrorlist)' /etc/yum.repos.d/rocky.repo
# 必须是 0(动态源全部被注释)
dnf -y update
|
💡 不换源也能跑? mirrorlist 会按你的 IP 动态分配镜像,运气好分到国内 CDN 也快——
但那是赌手气,不可复现。换中科大 baseurl 的意义是任何时间、任何网络环境都快且稳定,
后面装 containerd、kubeadm、拉镜像全是大流量下载,把不确定性压到最低。
3. 关闭 swap(必须)
为什么必须:k8s 调度器按"容器申请多少内存"做调度决策。开着 swap 时,
内存不够系统会偷偷把内存页换到磁盘,kubelet 看到的内存使用量就失真了,
调度决策变得不可预测——所以 kubelet 检测到 swap 开启会拒绝启动。
1
2
3
4
5
| swapoff -a
# 永久关闭:注释掉 /etc/fstab 中含 swap 的行
sed -i '/swap/s/^/#/' /etc/fstab
# 验证:应输出空行
swapon --show
|
💡 Rocky 云镜像(GenericCloud)默认就没有 swap(/etc/fstab 里无 swap 条目、free -h 的 Swap 全 0),
这两条命令对它是无害的空操作,但必须执行——真实服务器默认有 swap,习惯要养成。
(k8s 1.28+ 有实验性 swap 支持,学习阶段不启用。)
4. 配置防火墙与 SELinux(学习环境简化处理)
1
2
3
4
5
6
7
8
9
10
11
| # 学习环境:直接关闭防火墙,避免端口问题干扰学习
#(Rocky 云镜像默认未安装 firewalld,报 "Unit could not be found" 属正常,跳过即可)
systemctl stop firewalld
systemctl disable firewalld
# SELinux 设为宽容模式(容器运行时需要,云镜像默认 Enforcing,必须改)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 验证:应输出 Permissive
getenforce
|
SELinux 是什么:Linux 普通权限(rwx、属主)管的是"用户能不能访问文件",
SELinux 更进一步,在内核里给每个进程也戴上镣铐——即使是 root 进程,
也只能碰安全策略允许的东西(Rocky/RHEL 系默认开启的强制访问控制)。三种模式:
| 模式 | 行为 | 类比 |
|---|
| Enforcing(强制) | 违规操作直接拒绝并记日志 | 保安:当场拦下 |
| Permissive(宽容) | 违规操作放行,只记日志 | 摄像头:不拦,全拍下 |
| Disabled(关闭) | 完全不工作 | 纪委下班 |
学习环境用 Permissive:containerd/k8s 的某些文件操作会被默认策略误拦,
Enforcing 会导致 Pod 莫名其妙起不来;Permissive 不挡路又保留日志,
事后可用 ausearch -m avc -ts recent 翻看"如果开着会拦什么"。
两条命令的分工:setenforce 0 管"现在"(重启失效),/etc/selinux/config 管"重启后"。
⚠️ 生产环境不要直接关防火墙,应放行 k8s 所需端口
(6443、2379-2380、10250、10259、10257 及 NodePort 30000-32767)。
等学到阶段 9(NetworkPolicy)时你会理解得更深。
常见问题
Q: 换源 sed 执行后 dnf update 依然卡住?
先跑验证命令 grep -E '^baseurl' /etc/yum.repos.d/rocky.repo | head -3。输出为空说明 sed 没匹配到
(Rocky 9.8 是 mirrorlist+http://,老版本是 metalink+https://,本文第 2 步已兼容两种格式)。
输出正常但 dnf 仍卡 0 字节 → 虚拟机直连出网被拦,看「附录 A」。
Q: limactl start 报 403 / 下载镜像很慢?
Rocky 官方源(dl.rockylinux.org)国内约 50KB/s;中科大镜像站的 WAF 会拦截 Lima 的多线程下载器。
按第 1 步的方法:curl 单线程手动下载 + 模板指向本地文件即可,约 1~2 分钟。
Q: 重启虚拟机后这些配置还在吗?
都在。本阶段的配置全部写入了系统文件,永久生效。
(limactl stop / limactl start 就是关机/开机。)
附录 A:网络分层排查实录(虚拟机无法出网时必读)
本节是一次真实排查的完整记录:在一台装有企业安全软件(深信服/微步)+ Clash 代理的 Mac 上,
虚拟机所有直连外网流量被拦截,最终通过"借 Mac 的代理出网"解决。排查方法通用。
A.1 分层排查法(自底向上,逐层缩小范围)
每层一条命令,在哪一层断,问题就在哪一层:
1
2
3
4
5
6
| 第1层 VM → 网关(Mac) ping -c 2 -W 3 192.168.5.2
第2层 DNS 解析 getent hosts mirrors.ustc.edu.cn
第3层 VM → 外网纯 IP ping -c 2 -W 3 223.5.5.5 # 阿里DNS,绕过域名
第4层 VM → 外网 TCP curl -k --connect-timeout 6 https://110.242.68.66/
第5层 Mac → 外网 curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/ # Mac 终端执行
第6层 VM 借 Mac 代理出网 curl -x http://192.168.5.2:7897 https://mirrors.ustc.edu.cn/rocky/ -sI
|
实测结果与推论:
| 层 | 结果 | 推论 |
|---|
| VM→网关 | ✅ 通 | 虚拟网卡正常 |
| DNS | ✅ 能解析 | DNS 由 Lima 网关在 Mac 侧代答,不依赖 VM 真实出网 |
| VM→外网 IP | ❌ 100% 丢包 | 与域名无关,IP 层就断了 |
| VM→外网 TCP | ❌ 000 超时 | 同上 |
| Mac→外网 | ✅ 200 | Mac 网络本身没问题 |
| VM 经 Mac 代理 | ✅ 200 | VM↔Mac 畅通,代理可作绕行方案 |
结论画像:Mac 正常、VM 到 Mac 正常、VM 出网(任意目标)全断 → 问题在 Mac 系统网络层对"虚拟机转发流量"的拦截。
补充命令——虚拟机有两块网卡两条默认路由,可分别强制指定出口测试:
1
2
3
4
5
| ip route # default via 192.168.64.1 (lima0, vzNAT, metric 100 优先)
# default via 192.168.5.2 (eth0, usernet, metric 200)
curl --interface eth0 ... # 强制走 usernet 出口
curl --interface lima0 ... # 强制走 vzNAT 出口
# 两个都 000 → 不是单条链路问题,是系统级拦截
|
A.2 定位真凶:企业安全软件的网络扩展
先排除代理软件干扰(彻底退出 Clash Verge 并 limactl stop && limactl start 重启虚拟机,无效),再查系统扩展:
1
2
3
4
5
6
| # Mac 终端执行:列出所有系统扩展
systemextensionsctl list
# 实测发现两个 activated+enabled 的企业安全组件:
# cn.threatbook.Cardinal.net-extension ← 微步在线(上网行为/威胁情报)
# com.sangfor.auem.sfservice.extension ← 深信服(终端安全/零信任)
|
这类安防客户端在 macOS 网络层挂内容过滤器:本机进程的流量识别放行,虚拟机 NAT 转发的流量
不是"本机认证进程"发出,全部丢弃——完美对上 A.1 的现象画像。
⚠️ 这类软件不要卸载或停用(公司管理制度,可能触发告警)。正确姿势是绕行。
其他辅助排查命令(排除干扰项时用,均在 Mac 执行):
1
2
3
4
| ps aux | grep -iE 'clash|verge|mihomo' | grep -v grep # 确认代理软件进程是否退干净
networksetup -getwebproxy Wi-Fi # 看系统代理开关状态
netstat -rn -f inet | head -8 # 看默认路由是否被 VPN/TUN 劫持
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate # macOS 应用防火墙状态
|
A.3 解决方案:虚拟机借 Mac 的代理出网
前提:Clash Verge 运行中,且开启"允许局域网连接"(Allow LAN)。
1
2
3
4
5
6
7
8
9
10
11
| # 虚拟机里,root 执行:
# dnf 走代理(dnf 不读环境变量,必须写配置;永久生效)
echo 'proxy=http://192.168.5.2:7897' >> /etc/dnf/dnf.conf
# curl 等命令行工具走代理(仅当前终端有效)
export http_proxy=http://192.168.5.2:7897
export https_proxy=http://192.168.5.2:7897
# 验证 → 显示响应头即通
curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/
|
containerd 的代理配置是 systemd drop-in(它是不读环境变量的系统服务),
见 阶段 0(下) 第 6 步。
⚠️ 代理方案的善后(重要):哪天直连恢复了、或者你把 Clash 关了,这些代理配置会让
dnf/curl/containerd 全部连不上(指向一个不存在的代理)。恢复直连前必须清理:
1
2
3
4
5
| sed -i '/^proxy=/d' /etc/dnf/dnf.conf # 删 dnf 代理配置
unset http_proxy https_proxy # 清当前终端的代理变量
# 如果配过 containerd 代理,也要一并删掉:
rm -f /etc/systemd/system/containerd.service.d/proxy.conf
systemctl daemon-reload && systemctl restart containerd
|
一句话:代理配置和代理软件必须同开同关。这正是第 2 步「网络预检」第 ① 小步存在的原因。
为什么 192.168.5.2 可以写死在配置里:它是 Lima 源码内置的 usernet 网关常量(不经过任何
配置文件),语义是"Mac 本机"。虚拟机重启、Mac 重启、换 Wi-Fi、去公司都不会变。同理稳定:
虚拟机 eth0 的 192.168.5.15(按虚拟机 MAC 固定分配)、lima0 的 192.168.64.2。
A.4 Lima 网络拓扑速查
1
2
3
4
5
6
7
8
| ┌─ 物理网(家里/公司 Wi-Fi,Mac 的 en0)—— 这层会随地点变
│
├─ Lima usernet(192.168.5.0/24,Lima 内置默认,无需配置)
│ 虚拟机 eth0 = 192.168.5.15,网关/DNS = 192.168.5.2(= Mac)
│
└─ macOS vzNAT(192.168.64.0/24,模板里 vzNAT: true 开启)
虚拟机 lima0 = 192.168.64.2,网关 = 192.168.64.1(= Mac)
← Mac 浏览器访问 NodePort/Ingress 用这个 IP
|
1
2
3
4
5
6
7
8
9
| # 区分"我在 Mac 还是虚拟机里":看提示符或问 hostname
# wyf@MacBook-Pro % → Mac(zsh,%)
# [wyf@lima-k8s-rocky ~]$ → 虚拟机普通用户
# [root@lima-k8s-rocky ~]# → 虚拟机 root
hostname # lima-k8s-rocky = 虚拟机
# Mac 上 Lima 的可选网络定义(shared/bridged/host,本教程未使用):
cat ~/.lima/_config/networks.yaml
# 注意:里面没有 192.168.5.x —— usernet 网段是编译进 Lima 源码的出厂默认值
|
目录挂载的实物证据:模板里 mounts: - location: "~" 开机后变成虚拟机 /etc/fstab 里的一行
lima-... /Users/wyf virtiofs ro,nofail,...(virtiofs 共享文件系统,ro 只读),
这就是虚拟机里能直接看到 Mac 主目录的原因。
A.5 排查命令总表
| 命令 | 用途 | 执行位置 |
|---|
ip route | 看默认路由/网卡/优先级 | VM |
hostname -I | 看虚拟机所有 IP | VM |
ping -c 2 -W 3 <IP> | 测某层连通性 | VM |
getent hosts <域名> | 测 DNS 解析 | VM |
curl -I -m 8 <URL> | 测 HTTP 通不通 | VM/Mac |
curl --interface eth0 <URL> | 强制指定网卡出口 | VM |
curl -x http://192.168.5.2:7897 <URL> | 经 Mac 代理测试 | VM |
systemextensionsctl list | 查系统网络/安全扩展 | Mac |
networksetup -getwebproxy Wi-Fi | 查系统代理 | Mac |
netstat -rn -f inet | 查 Mac 路由表是否被劫持 | Mac |
ps aux | grep -iE 'clash|verge' | 确认代理进程状态 | Mac |
limactl list / limactl shell <名字> | 查看/进入虚拟机 | Mac |
cat ~/.lima/_config/networks.yaml | 看 Lima 可选网络定义 | Mac |
动手练习
- 用
limactl shell k8s-rocky 以外的另一种方式进入 VM(提示:Lima 自动配置了 SSH,ssh 加端口和密钥,用 limactl show-ssh k8s-rocky 查看)。 - 用附录 A 的分层排查法,在虚拟机里依次执行第 1/2/5 层的命令,确认每层的输出你都看得懂。
下一步
➡️ 阶段 0(下):内核参数与容器运行时