装系统的内容
约 2059 字大约 7 分钟
2026-01-27
boot menu(启动菜单) 是什么?
boot menu会列出了所有它能找到的“启动设备”,比如: - 硬盘(平时正常开机用的那个) - U盘 - 光驱(DVD/CD) - PXE(通过网络启动) 按 F11(不同品牌电脑可能是 F12、Esc、F10 等)就是在说:“嘿,别按默认方式启动了,让我自己挑一个启动源!”
系统镜像iso
ISO 就是一个完整的系统安装包(比如 Windows、Ubuntu 等)的“虚拟光盘”。
电脑收到指令后,就会假装你插了一张安装光盘,然后开始运行里面的程序 → 进入系统安装界面
BIOS和UEFI
BIOS 和 UEFI 都是电脑主板里的一段“小软件”,负责检查硬件有没有问题,然后把控制权交给操作系统。
注:对于windows的机器,可以 win + R后,输入
msinfo32| 项目 | BIOS(Legacy) | UEFI(现代版,新电脑主流) |
|---|---|---|
| 样子 | 黑底白字,像 DOS,很丑,只能用键盘操作 | 彩色图形界面,很多还能用鼠标点,像个小系统 |
| 开机速度 | 慢(要一个个检查硬件) | 快很多(并行检查,省时间) |
| 支持大硬盘 | 最大只支持 2TB 硬盘(老限制) | 支持超大硬盘(现在主流都几 TB、十几 TB 没问题) |
| 安全性 | 基本没有防病毒功能 | 有“安全启动”(Secure Boot),防恶意软件偷偷改启动文件 |
| 启动方式 | 用 MBR 分区表(老分区方式) | 用 GPT 分区表(新分区方式) |
| 现在谁用得多 | 老电脑(2010 年前后)、部分老主板 | 几乎所有新电脑(Win 10/11 时代基本都是 UEFI) |
电脑开机到底做了什么?
简易流程图
1. 按电源键
↓
2. BIOS/UEFI 通电(POST) & 自检硬件(check self)
↓
3. 读启动顺序(Boot menu)
↓
4. 从 ISO 加载引导程序(bootmgr / grub / isolinux)
↓
5. 加载操作系统内核
↓
6. 出现安装界面 / 系统桌面
↓
7. 你开始操作(分区、安装、试用等)详细说明
- 按电源键 → 主板通电
电脑先通电,主板芯片组开始工作。
BIOS/UEFI 固件启动(你进 BIOS 设置的那个程序)
- 先做 POST 自检(Power-On; Self-Test):检查 CPU、内存、硬盘、显卡、主板这些硬件有没有坏。
- 如果坏了,会“嘀嘀嘀”报警或黑屏卡住。
- 如果正常,屏幕上通常闪过一堆硬件信息(内存多少、CPU 型号等)。
- 自检完后,BIOS/UEFI 就问自己:“接下来从哪儿启动OS呢?”
- 先做 POST 自检(Power-On; Self-Test):检查 CPU、内存、硬盘、显卡、主板这些硬件有没有坏。
读取启动顺序(Boot Order)
- BIOS/UEFI 看你 BIOS 设置里排的顺序(比如:1. 硬盘 2. U盘 3. 网络)。
- 如果你按了 F11 进了 boot menu 并手动选了“系统镜像 ISO”(或 U盘、光驱),它就会优先听你的,忽略默认顺序,直接从你选的这个 ISO 启动。
从 ISO 开始加载(这里正式进入“走操作系统”阶段) 一旦选了 ISO,BIOS/UEFI 就把控制权交给 ISO 里的启动程序。接下来就看你这个 ISO 是什么类型的了(Windows、Linux、PE 等):
如果是 Linux ISO(比如 Ubuntu、CentOS): - 先加载 isolinux 或 grub(启动引导器)。 - 出现菜单:Try Ubuntu(试用) / Install Ubuntu(安装)。 - 选安装 → 加载内核 → 进入图形安装界面。
选择PXE安装
PXE(Preboot eXecution Environment,网络预启动环境)就是让电脑不插硬盘、不插 U 盘/光盘,直接从网络下载引导文件来启动/安装系统。
dnsmasq
dnsmasq很常用,它可以同时提供 DHCP + TFTP + PXE 引导,下载dnsmasq之后,默认可以在/etc/dnsmasq.conf下修改对应的配置, 这里的PXE安装将基于dnsmasq
核心流程:
目标机开机 → BIOS 设置 Network/PXE 优先 → 网卡发出 DHCPDISCOVER(广播)。
PXE 服务器收到请求 → dnsmasq 回复 DHCPOFFER → 分配 IP + 网关 + next-server=自身 + filename=pxelinux.0。
目标机收到 ACK → 用 TFTP 从 PXE服务器 下载 /var/lib/tftpboot/pxelinux.0。
pxelinux.0 加载 → 读取 /var/lib/tftpboot/pxelinux.cfg/default(或 MAC 匹配文件)。
自动加载 kernel = centos7/vmlinuz + initrd = centos7/initrd.img。
内核启动 → dracut 加载 → 根据 APPEND 参数发起 HTTP 请求到 http://58.186.119.194/one/jsos → 下载 .treeinfo → squashfs.img(stage2)→ 进入 Anaconda 安装程序。
安装继续走网络仓库(inst.repo=) → 完成分区、下载 RPM 包、配置 bootloader → 重启后从本地硬盘启动新系统。
和 ISO 启动的区别:
- ISO:本地光盘/U盘提供所有文件(kernel/initrd + 完整仓库)。
- PXE:前期小文件(kernel/initrd)走 TFTP,后期大文件走 HTTP/NFS,从服务器远程仓库安装(不需要把整个 ISO 拷到本地)。
pxelinx.0
pxelinux.0 是 SYSLINUX 项目提供的一个小型的网络引导加载器(PXE bootloader),简单来说,它的作用是:
- 取代本地硬盘上的 boot 扇区,让机器能从网络继续往下引导。 它非常小(几十 KB),专门设计用于 PXE 环境,通过 TFTP 下载后在内存中运行。 一旦运行起来,它会: - 读取同一个 TFTP 目录下的 pxelinux.cfg/ 文件夹里的配置文件 - 通常先找 pxelinux.cfg/<目标机的 MAC 地址>(全大写十六进制,比如 98039B19E4BA) - 如果找不到,就依次找 pxelinux.cfg/default(默认菜单)
菜单选项(default)会告诉它下一步下载哪个 kernel(vmlinuz)和 initrd(initrd.img),以及传递什么启动参数(比如 inst.repo=...)
vmlinuz
全称:Virtual Memory LINUx + gZip(压缩的 Linux 内核)。
为什么叫 vmlinuz?
vmlinux 是未压缩的原始内核文件(很大)。用 gzip 压缩后改名叫 vmlinuz(z 代表压缩),体积小很多,便于快速加载到内存。启动时,bootloader(如 pxelinux/grub)会先解压它,然后把控制权交给这个内核。
大小:通常 5-15 MB(压缩后)。 在 PXE 里的作用:pxelinux.0 加载菜单后,会下载这个文件到内存,启动真正的 Linux 内核 → 内核醒来后开始认硬件、加载驱动。
一句话:vmlinuz = Linux 内核本身(压缩版),它是操作系统启动后的“核心大脑”
initrd.img
全称:Initial Ram Disk image(初始 RAM 磁盘镜像),现在很多发行版用 initramfs;
它就是一个临时的小型文件系统,塞在内存里,帮助内核“先活下来”,然后再去找真正的硬盘根分区(/)。
里面包含:
- 最基本的工具(busybox 等)
- 必要的内核模块(.ko 文件):硬盘控制器(SATA/NVMe)、文件系统(ext4/xfs)、网络驱动等
- 一个 init 脚本(/init):负责加载模块、挂载真实根分区、切换控制权
在客户端(目标机)从 PXE 服务器下载以下文件时,基本都是使用 TFTP 协议,所以抓包时你应该能在 UDP 69 端口(TFTP 默认端口)看到完整的交互过程。
| 顺序 | 文件 / 阶段 | 协议 | 端口 | 是否应该在 69 端口看到 | 备注 |
|---|---|---|---|---|---|
| 1 | pxelinux.0(或 bootx64.efi) | TFTP | UDP 69 | 是 | DHCP 告知的第一个 filename |
| 2 | pxelinux.cfg/ 中的配置文件(如 default 或 MAC 地址文件) | TFTP | UDP 69 | 是 | pxelinux.0 会继续请求 |
| 3 | menu.c32 / vesamenu.c32 / ldlinux.c32 等模块 | TFTP | UDP 69 | 是 | 如果菜单需要这些组件 |
| 4 | vmlinuz(内核) | TFTP | UDP 69 | 是 | APPEND 中的 KERNEL 指定的路径 |
| 5 | initrd.img(初始内存盘) | TFTP | UDP 69 | 是 | APPEND 中的 initrd= 指定的路径 |
| 6 | squashfs.img / stage2 / 后续 RPM 包 | HTTP / HTTPS / NFS | TCP 80 / 443 或 NFS 端口 | 否 | 内核启动后由 dracut 发起的网络请求 |
日志排查
- dnsmasq:tail -f /var/log/dnsmasq.log
- Nginx:tail -f /var/log/nginx/access.log
- TFTP 传输:tcpdump -i ens35f1np1 udp port 69
mount loop
mount loop就是把一个 ISO 文件当成一个“虚拟光盘”挂载到某个目录,让系统像真的插了一张光盘一样访问里面的内容。
mount -o loop JSOS_100-64251018.iso /var/www/html/one/jsos
# 或更现代的写法(推荐)
mount JSOS_100-64251018.iso /var/www/html/one/jsos它做了什么?
ISO 文件本质是一个“文件系统镜像”(里面有目录结构、文件、bootloader 等)
-o loop 告诉内核:用 loop 设备(一种虚拟块设备)把这个 ISO 文件“映射”成一个块设备 然后像挂载普通分区一样,把这个虚拟块设备挂到 /var/www/html/one/jsos 这个空目录上 挂载成功后,/var/www/html/one/jsos 目录里就能看到 ISO 里面的所有文件和目录结构了(比如 .treeinfo、LiveOS/squashfs.img、images/pxeboot/vmlinuz 等)
