bash
复制代码
S 列 = Z → 僵尸进程(defunct) 要kill 掉它的父进程
S 列 = D → 不可中断睡眠(通常在等 IO,kill 不掉) 修复IO问题或者重启机器。
如果 IO 永远不回来(NFS 服务器挂了、磁盘坏了),这个进程就永远卡着,只能重启机器。
孤儿进程 正常运行,父已死 能 kill
PXE
bash
复制代码
先跟厂商要过所有的mac地址,然后服务器都连好带扳手的网口和业务网网卡,管理节点装好DHCP服务,TFTP服务,HTTP服务,dhcp就是BMC
dhcp服务 mac地址和BMC,还有PXE dhcp服务 业务口的mac和业务ip一一对应,dhcp里面还附带上了TFTP服务器的地址。上电后,所有BMC
都获得了ip,通过 BMC 远程配置 BIOS (一次性 PXE 启动 (最常用)
ipmitool ... chassis bootdev pxe options=efiboot
只影响下一次启动,之后自动恢复原来的启动顺序 ,硬盘优先
这样装完系统重启后就自动从硬盘启动了,不会再进 PXE)并开机,然后在UEFI阶段,通过PXE网络启动,业务口发dhcp请求获得ip,
顺带也获得了TFTP地址,主动从TFTP服务器拉取grub.efi 引导加载器(UEFI 固件程序), 进入grub后主动从TFTP服务器拉取 grub.cfg
(grub.efi启动后第一件事就是读取grub.cfg, 告诉grub.efi,内核在哪,初始img在哪,启动参数是,kickstart的http链接) ,压缩的
linux内核文件,和初始img ,内核启动,初始img里的anaconda,通过http服务拉取下来kickstart,按照kickstart里面的内容,拉取一
个个rpm包,在目标机器上组成完整的 rocky linux9系统,按照kickstart 配置好操作系统,然后重启,硬盘启动,进入系统
bash
复制代码
BMC 管理口就是标着扳手的那个网口
PXE 服务器上需要跑 4 个服务:
1. DHCP 服务器: 给 PXE 客户端分配 IP 和告知 TFTP 地址
2. TFTP 服务器: 提供引导文件 (grubx64.efi, vmlinuz, initrd.img)
3. HTTP 服务器: 提供 kickstart 文件和安装源 (RPM 包)
4. DNS 服务器 (可选): 给装好的机器分配主机名
通常用一台管理节点跑所有这些服务
这台管理节点本身需要先手动装好系统 (U 盘装或 BMC 挂载 ISO)
bash
复制代码
实际流程是:
1. 管理节点配好 DHCP 服务器并启动
2. 100 台机器接好电源线和管理网线
3. 100 台机器通电 (不需要开机,只要 PDU 通电)
4. BMC 自动上电 (BMC 只要有电就工作,不需要按开机键)
5. BMC 的网卡自动发 DHCP 请求
6. DHCP 服务器自动响应,分配 IP
7. 几分钟后,100 台机器的 BMC 都有了 IP
复制代码
kickstart 就是一份"装系统的完整指令":
- 磁盘怎么分区 (多大的 /boot, /, /var, swap)
- 装哪些软件包 (@core, chrony, vim...)
- root 密码是什么
- 创建什么用户
- 网络怎么配 (DHCP 还是静态 IP)
- 时区、语言、键盘
- 防火墙和 SELinux 开不开
- 装完后执行什么脚本 (%post 段: 配 bond、改主机名、写 yum 源...)
- 装完后重启还是关机
本质上就是把你手动装系统时在图形界面里点的每一个选项,写成文本。
BMC、BIOS、UEFI、GRUB、操作系统之间的关系
bash
复制代码
这几个东西是不同层次的,从底层到上层:
┌─────────────────────────────────────────────────────────┐
│ │
│ 层次 5: 操作系统 (Rocky Linux 9) │
│ 你日常用的系统,跑 K8s、训练任务等 │
│ 存在硬盘上 │
│ │
├─────────────────────────────────────────────────────────┤
│ │
│ 层次 4: GRUB (grubx64.efi) │
│ 引导加载器 (bootloader) │
│ 职责: 从硬盘 (或网络) 加载操作系统内核 │
│ 显示启动菜单: "选择要启动的系统" │
│ 存在硬盘的 EFI 分区 (/boot/efi) 或 TFTP 服务器上 │
│ │
├─────────────────────────────────────────────────────────┤
│ │
│ 层次 3: UEFI 固件 │
│ 存在主板的 SPI Flash 芯片上 (不在硬盘上) │
│ 职责: │
│ - 开机后第一个运行的程序 │
│ - 初始化 CPU、内存、PCIe 设备 (GPU、网卡、NVMe) │
│ - 提供 BIOS Setup 界面 (按 F2/Del 进入的那个) │
│ - 按启动顺序找到 GRUB 并执行它 │
│ - 如果启动项是 PXE,就走网络启动流程 │
│ │
│ UEFI 和 BIOS 的关系: │
│ BIOS 是老标准 (1980 年代),16 位,功能有限 │
│ UEFI 是新标准 (2005 年+),64 位,支持大硬盘、安全启动│
│ 现在的服务器都是 UEFI,但大家习惯把 UEFI 设置界面 │
│ 还是叫 "BIOS 设置" 或 "进 BIOS" │
│ 严格来说应该叫 "UEFI Setup" │
│ │
├─────────────────────────────────────────────────────────┤
│ │
│ 层次 2: BMC 固件 │
│ 独立的芯片,有自己的 CPU 和操作系统 (通常是嵌入式 Linux)│
│ 和主 CPU 完全独立,通电就运行 │
│ 职责: │
│ - 远程开关机 (不需要去机房按按钮) │
│ - 远程控制台 (看到屏幕输出,就像接了显示器) │
│ - 硬件监控 (温度、风扇、电压、硬盘状态) │
│ - 远程挂载 ISO (虚拟光驱) │
│ - 修改 UEFI/BIOS 设置 (不需要进 BIOS 界面) │
│ - 收集硬件日志 (SEL, System Event Log) │
│ │
│ BMC 不参与操作系统的运行 │
│ 操作系统跑起来后,BMC 还在后台默默监控硬件 │
│ │
├─────────────────────────────────────────────────────────┤
│ │
│ 层次 1: 硬件 │
│ CPU、内存、GPU、NVMe、网卡、主板 │
│ │
└─────────────────────────────────────────────────────────┘
谁发起的 DHCP 请求
bash
复制代码
UEFI 固件发起的,不是操作系统,此时操作系统还不存在。
UEFI 固件里内置了一个 PXE 客户端 (网卡固件的一部分)
启动顺序轮到 PXE 时:
UEFI 对业务网卡说: "你去发 DHCP 请求"
网卡发出 DHCP Discover 广播包
这个广播包里带了:
- 自己的 MAC 地址
- 一个标记: "我是 PXE 客户端,我要网络启动"
完全自动,不需要人干预
前提: BIOS 里启用了这个网口的 PXE 功能
TFTP 服务器地址怎么知道的
bash
复制代码
DHCP 服务器告诉它的,塞在 DHCP 响应里一起返回。
DHCP 响应里包含的信息:
- 你的 IP: 10.0.1.11
- 子网掩码: 255.255.255.0
- 网关: 10.0.1.1
- TFTP 服务器地址: 10.0.1.5 ← 就是 dhcpd.conf 里的 next-server
- 要下载的文件名: grubx64.efi ← 就是 dhcpd.conf 里的 filename
对应的 DHCP 配置:
next-server 10.0.1.5; # TFTP 在哪
filename "grubx64.efi"; # 下载哪个文件
所以机器不需要"知道"TFTP 在哪
它只是问 DHCP 要 IP,DHCP 顺便告诉它:
"你的 IP 是这个,另外你去 10.0.1.5 用 TFTP 下载 grubx64.efi 来启动"
Anaconda 哪来的
复制代码
Anaconda 是 Red Hat 系 Linux (RHEL/CentOS/Rocky/Fedora) 的安装程序。
不是 Python 的那个 Anaconda。
它藏在 initrd.img 里。
PXE 下载了 vmlinuz + initrd.img → 内核启动 → 解压 initrd.img
→ initrd 里面就是一个迷你 Linux 系统 + Anaconda 安装程序
→ Anaconda 读取 kickstart 文件 → 自动分区、装包、配置网络
→ 装完重启 → Anaconda 的使命结束
你手动用 ISO 装 Rocky Linux 时看到的图形安装界面,就是 Anaconda。
kickstart 就是把你在图形界面里点的那些选项写成文本文件,实现无人值守安装。
TFTP 是什么,那三个文件干什么
复制代码
TFTP (Trivial File Transfer Protocol):
极简的文件传输协议,UDP 端口 69
没有认证,没有目录列表,只能读写文件
为什么用它: UEFI 固件里内置了 TFTP 客户端,不需要操作系统支持
HTTP 客户端太复杂,UEFI 固件塞不下
三个文件:
grubx64.efi → 引导加载器 (GRUB)
UEFI 下载并执行它
它再去下载内核和 initrd
相当于一个"中间人",知道怎么加载操作系统
vmlinuz → Linux 内核 (压缩的)
操作系统的核心,管理 CPU/内存/设备
GRUB 把它加载到内存并跳转执行
initrd.img → 初始内存盘 (Initial RAM Disk)
一个临时的迷你文件系统,包含:
- 磁盘驱动、网卡驱动、文件系统驱动
- Anaconda 安装程序
内核启动后先用它,装完系统后就不需要了
执行顺序: UEFI → grubx64.efi → vmlinuz + initrd.img → Anaconda → 装系统