3. Linux安装与启动:虚拟机安装、分区方案、引导过程(BIOS/UEFI、GRUB)、运行级别与systemd目标

Linux系统的安装与启动是进入Linux世界的第一道门槛,也是理解系统底层运作机制的关键环节。本章将围绕“从零开始安装一个可用的Linux系统”这一主线,深入剖析虚拟机环境下的安装流程、磁盘分区策略、固件与引导加载程序(BIOS/UEFI与GRUB)的协作原理,以及系统初始化机制(从传统的SysVinit运行级别到现代systemd目标)的演进。掌握这些内容,不仅能够帮助你顺利完成安装,更能为后续的系统排障、性能调优和服务器管理打下坚实基础。

Linux 安装与启动全链路架构 1. 安装准备 虚拟机/物理机选型 2. 磁盘分区 /boot、/、/home、swap 3. 引导加载 BIOS/UEFI → GRUB 4. 内核与init systemd目标/运行级别 分区方案对比 • 标准分区:/boot 1G, / 50G • LVM:弹性扩展,适合生产 • Btrfs:快照与压缩特性 • swap:建议 = 内存的1-2倍 引导流程(UEFI模式) ① 加电 → UEFI固件自检 ② 读取NVRAM启动项 → EFI分区 ③ 加载grubx64.efi → GRUB菜单 ④ 加载vmlinuz + initramfs systemd 目标映射 runlevel0 → poweroff.target runlevel3 → multi-user.target runlevel5 → graphical.target runlevel6 → reboot.target 关键排障入口 • GRUB Rescue:修复引导加载程序(使用Live CD chroot) • 内核Panic:检查initramfs完整性、磁盘驱动支持 • systemctl get-default / set-default:切换启动目标

3.1 虚拟机安装:从镜像到可用系统

虚拟机(Virtual Machine)是学习Linux最安全、最灵活的实验环境。它通过Hypervisor(如VMware Workstation、VirtualBox、KVM/QEMU)在物理硬件之上模拟出一台完整的计算机,包括CPU、内存、磁盘、网卡等虚拟设备。在虚拟机中安装Linux,可以随时创建快照、回滚状态,避免对宿主机造成不可逆的影响。

3.1.1 核心原理:虚拟化层与硬件模拟

虚拟机安装的本质是“在虚拟硬件上执行真实的操作系统安装程序”。Hypervisor负责将虚拟机的指令翻译并调度到物理CPU上执行(全虚拟化或半虚拟化),同时通过设备模型模拟出IDE/SATA控制器、VirtIO网卡、QXL显示设备等。因此,安装Linux时,选择正确的虚拟硬件类型(如磁盘控制器类型、固件类型)会直接影响系统性能和兼容性。

3.1.2 操作流程:以VirtualBox安装CentOS Stream 9为例

  1. 创建虚拟机:设置名称、操作系统类型(Linux, Red Hat 64-bit)、内存(建议≥2GB)、CPU核心数(≥2)。
  2. 创建虚拟磁盘:选择VDI(VirtualBox Disk Image)格式,动态分配(Dynamic Allocated),大小建议≥20GB。
  3. 设置存储控制器:在“设置→存储”中,将安装ISO镜像挂载到光驱(IDE或SATA控制器)。
  4. 配置网络:默认NAT模式可访问外网;若需宿主机与虚拟机互通,可添加“仅主机(Host-Only)”网卡。
  5. 启动安装:开机后进入安装引导菜单,选择“Install CentOS Stream 9”。
  6. 安装源与软件选择:使用本地ISO源;软件选择“Server with GUI”或“Minimal Install”(根据需求)。
  7. 分区与网络配置:按3.2节方案进行分区;配置主机名、启用网卡并设置静态IP(如192.168.56.10/24)。
  8. 设置root密码与创建用户:完成安装后重启,进入系统。
经验提醒:在虚拟机中安装时,务必先安装“增强功能”(如VirtualBox Guest Additions)或“open-vm-tools”,否则屏幕分辨率无法自适应、剪贴板无法共享、鼠标切换不流畅。

3.1.3 案例拆解:虚拟机磁盘扩容实战

背景:某开发者的虚拟机磁盘初始分配20GB,使用半年后根文件系统使用率达95%,导致服务异常。约束:不能重装系统,需在线扩容。

操作步骤:

  1. 在VirtualBox中关闭虚拟机,执行 VBoxManage modifyhd disk.vdi --resize 40960(扩容至40GB)。
  2. 启动虚拟机,使用 lsblk 确认磁盘空间已增加(/dev/sda从20G变为40G)。
  3. 使用 growpart /dev/sda 3 扩展分区(假设根分区为第3分区)。
  4. 使用 pvresize /dev/sda3(若为LVM)或 resize2fs /dev/sda3(若为ext4)扩展文件系统。
  5. 使用 df -h 验证根分区容量已更新。

复盘:扩容前必须备份重要数据;LVM方案在扩容时比传统分区更灵活,这也是生产环境推荐LVM的原因之一。

3.1.4 常见误区与总结

  • 误区1:虚拟机磁盘性能与物理机一致。实际上,虚拟磁盘I/O有额外开销,生产数据库不建议跑在默认配置的虚拟磁盘上。
  • 误区2:安装时选择“Use All Space”自动分区,导致后续无法灵活调整。建议手动分区。
  • 误区3:忽略swap分区。当物理内存不足时,swap可防止OOM Killer直接杀死进程。

3.2 分区方案:从标准布局到LVM与Btrfs

磁盘分区是安装过程中最需要谨慎决策的环节。分区方案决定了系统的可扩展性、数据安全性和备份恢复的便捷性。Linux支持多种分区工具(fdisk、parted、gdisk)和文件系统(ext4、XFS、Btrfs),并提供了LVM(逻辑卷管理)这一强大的抽象层。

3.2.1 核心原理:分区表类型与文件系统

现代Linux支持两种分区表格式:MBR(Master Boot Record)和(GUID Partition Table)。MBR最多支持4个主分区,单分区最大2TB;支持128个分区,单分区最大9.4ZB(Zettabyte),且自带冗余和校验。UEFI固件强制要求使用,而传统BIOS可以使用MBR或(需支持)。

分区/文件系统 推荐大小 文件系统 用途与说明
/boot 1GB ext4 / XFS 存放内核vmlinuz、initramfs和GRUB文件;UEFI模式下为EFI System Partition(ESP,FAT32格式,通常512MB-1GB)
/ (根) ≥50GB ext4 / XFS / Btrfs 系统核心文件与应用程序;生产环境建议≥100GB
/home 剩余空间 ext4 / XFS 用户数据;独立分区便于重装系统时保留用户文件
swap 2GB-8GB swap 虚拟内存;服务器可根据内存大小设置,如内存≤8GB时swap=2倍内存,内存>8GB时swap=内存大小
/data(可选) 按需 XFS / Btrfs 应用数据、数据库文件;独立挂载点便于配额与备份

3.2.2 判断方法:如何选择分区方案

  • 学习/测试环境:单分区(/)+ swap即可,简单快捷。
  • 生产服务器:建议使用LVM,将/boot独立(LVM不支持/boot),根、/home、/var作为逻辑卷,便于在线扩容。
  • 数据库服务器:数据目录(如/var/lib/mysql)使用独立挂载点,文件系统选择XFS(高并发写入)或ext4(成熟稳定)。
  • 容器/虚拟化宿主机:考虑使用Btrfs,支持子卷、快照和压缩,适合Docker/Podman存储。

3.2.3 案例拆解:LVM分区方案实施

场景:某公司部署一台文件服务器,预计未来3年数据增长至2TB,要求磁盘空间可在线扩展。

方案设计:

  1. 创建物理卷(PV):pvcreate /dev/sda2 /dev/sdb1
  2. 创建卷组(VG):vgcreate vg_data /dev/sda2 /dev/sdb1
  3. 创建逻辑卷(LV):lvcreate -L 1.5T -n lv_home vg_data
  4. 格式化并挂载:mkfs.xfs /dev/vg_data/lv_home,编辑 /etc/fstab 添加自动挂载。
  5. 扩容演练:新增磁盘后 vgextend vg_data /dev/sdc1,再 lvextend -L +500G /dev/vg_data/lv_home,最后 xfs_growfs /home 在线扩展文件系统。

风险与代价:LVM增加了管理复杂度;若卷组元数据损坏,恢复难度较大,需定期备份 /etc/lvm 配置。

风险提示:切勿在系统运行期间直接删除或修改正在使用的物理卷或逻辑卷,这会导致文件系统损坏。所有LVM操作前应确认目标卷未挂载或已卸载。

3.2.4 常见误区与总结

  • 误区1:swap分区越大越好。实际上,过度依赖swap会导致系统性能严重下降(磁盘远慢于内存),应优先增加物理内存。
  • 误区2:将/boot放在LVM中。GRUB对LVM的支持有限,/boot应使用普通分区或独立ESP。
  • 误区3:忽略分区对齐。使用fdisk时建议选择“对齐到扇区”或使用parted的“optimal”对齐,否则SSD性能会大幅下降。

3.3 引导过程:BIOS/UEFI与GRUB的协作

引导过程是操作系统启动的第一阶段,涉及固件(BIOS/UEFI)、引导加载程序(GRUB)和内核三者的紧密配合。理解这一过程,是解决“开机黑屏”“GRUB Rescue”“内核Panic”等问题的前提。

3.3.1 核心原理:两种固件模式

传统BIOS(Legacy BIOS):加电后,CPU执行BIOS固件中的代码,进行POST(Power-On Self-Test)自检,然后根据CMOS中的启动顺序,读取第一个可引导磁盘的MBR(第0扇区,512字节)。MBR中的引导代码(446字节)负责查找并加载活动分区的引导扇区,进而加载GRUB。

UEFI(统一可扩展固件接口):加电后,UEFI固件直接读取NVRAM中的启动项(Boot Entry),定位到EFI系统分区(ESP,FAT32格式),加载其中的 .efi 引导程序(如 grubx64.efi)。UEFI支持安全启动(Secure Boot),可校验引导程序的数字签名,防止恶意软件篡改。

3.3.2 操作流程:GRUB引导的完整链路

  1. 固件阶段:BIOS/UEFI初始化硬件,选择启动设备。
  2. GRUB阶段1:BIOS模式下,GRUB的boot.img被加载到内存,它随后加载core.img(通常位于/boot/grub2/i386-pc/)。UEFI模式下,固件直接加载grubx64.efi。
  3. GRUB阶段2:GRUB读取配置文件 /boot/grub2/grub.cfg,显示菜单,等待用户选择内核或编辑启动参数。
  4. 内核加载:GRUB根据菜单项加载 vmlinuz-<version> 和 initramfs-<version>.img 到内存,并传递启动参数(如 root=/dev/mapper/vg_root-lv_root、quiet、splash)。
  5. initramfs阶段:内核解压initramfs到内存根文件系统,加载必要的驱动(如SCSI、SATA、NVMe、文件系统模块),然后挂载真正的根文件系统。
  6. init进程:内核执行 /sbin/init(符号链接到systemd),系统进入用户态初始化阶段。
关键参数解析:在GRUB菜单按 e 键可编辑启动项。常见参数包括:ro(只读挂载根)、rhgb(Red Hat图形启动)、quiet(隐藏详细日志)、systemd.unit=emergency.target(进入紧急救援模式)。

3.3.3 案例拆解:修复GRUB引导故障

现象:某服务器重启后黑屏,显示 GRUB Rescue> 提示符。原因:/boot分区损坏或grub配置丢失。

修复步骤:

  1. 使用CentOS安装光盘或Live USB启动,进入救援模式(Troubleshooting → Rescue a CentOS system)。
  2. 选择“1”挂载根文件系统到 /mnt/sysimage。
  3. 执行 chroot /mnt/sysimage 切换根环境。
  4. 重新安装GRUB到磁盘:grub2-install /dev/sda(BIOS模式)或 grub2-install --target=x86_64-efi --efi-directory=/boot/efi(UEFI模式)。
  5. 重新生成配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg。
  6. 退出chroot,重启系统。

复盘:该故障通常由意外断电、分区表变更或错误编辑grub.cfg导致。建议定期备份 /boot 目录和 /etc/fstab,并记录原始分区布局。

3.3.4 常见误区与总结

  • 误区1:认为UEFI启动必须关闭Secure Boot。实际上,只要引导程序有有效签名(如shim.efi),Secure Boot可以保持开启。
  • 误区2:混淆MBR与。磁盘上也可以安装传统BIOS引导(需BIOS启动分区),但UEFI模式必须使用。
  • 误区3:修改内核参数后不更新GRUB配置。使用 grub2-editenv list 查看当前默认参数,修改 /etc/default/grub 后需重新生成grub.cfg。

3.4 运行级别与systemd目标:系统初始化的演进

系统初始化是内核启动后的第一个用户态进程(PID 1)所执行的任务。传统SysVinit使用“运行级别”(Runlevel)定义系统状态,而现代systemd使用“目标”(Target)单元,提供了更灵活、并行的启动方式。

3.4.1 核心原理:从Runlevel到Target

SysVinit通过 /etc/inittab 定义默认运行级别,并通过 /etc/rc.d/rc<N>.d/ 目录下的脚本按顺序启动或停止服务。运行级别是互斥的,切换级别会停止不属于该级别的服务。

systemd引入了“目标”概念,每个目标是一组服务的集合。目标之间可以依赖和并行启动,且支持动态加载。例如,graphical.target 依赖 multi-user.target,而 multi-user.target 又依赖 basic.target。systemd通过socket激活、D-Bus激活等机制,实现了服务的按需启动。

SysVinit运行级别 systemd目标 说明
0 poweroff.target 关机
1 rescue.target 单用户模式(救援模式),用于维护
2 multi-user.target 多用户,无图形界面(Red Hat系中2/3/4均映射到此)
3 multi-user.target 多用户,文本模式(标准服务器模式)
4 multi-user.target 未使用/自定义
5 graphical.target 多用户,图形界面
6 reboot.target 重启

3.4.2 判断方法:查看与切换目标

  • 查看当前默认目标:systemctl get-default
  • 设置默认目标:systemctl set-default multi-user.target(服务器无图形界面)
  • 临时切换目标:systemctl isolate graphical.target(立即切换)
  • 查看当前活动目标:systemctl list-units --type=target
  • 查看服务依赖:systemctl list-dependencies graphical.target

3.4.3 案例拆解:服务器启动卡在“A start job is running for wait for network”

现象:某服务器重启后,系统长时间卡在等待网络服务,最终超时进入多用户模式。分析:systemd等待 network.service 或 NetworkManager-wait-online.service 完成,但网卡未获得IP地址(DHCP超时或静态IP配置错误)。

解决步骤:

  1. 进入紧急模式:在GRUB菜单按 e,在 linux 行末尾添加 systemd.unit=emergency.target,按 Ctrl+X 启动。
  2. 检查网络配置:ip addr 查看网卡状态,cat /etc/sysconfig/network-scripts/ifcfg-ens33 检查配置。
  3. 修正配置:确保 BOOTPROTO=static 时填写了正确的IP、网关、DNS;或改为 BOOTPROTO=dhcp。
  4. 重启网络服务:systemctl restart NetworkManager,然后 systemctl reboot。

复盘:为避免此类问题,生产服务器应使用静态IP,并设置 systemctl disable NetworkManager-wait-online.service(如果不需要等待网络就绪)。

3.4.4 常见误区与总结

  • 误区1:认为 init 3 和 systemctl isolate multi-user.target 完全等价。实际上,SysVinit的 init 命令是同步的,而systemd的isolate是异步的,且会处理依赖关系。
  • 误区2:直接删除 /etc/rc.d/rc*.d 下的脚本。在systemd中,应使用 systemctl disable 来禁用服务。
  • 误区3:混淆 systemctl stop 与 systemctl mask。stop只是停止当前运行,mask会阻止服务被任何方式启动(包括依赖触发)。
总结复盘:Linux安装与启动是一个环环相扣的链路。虚拟机安装降低了实验门槛,但生产环境仍需谨慎规划分区;BIOS/UEFI与GRUB的协作决定了系统能否被正确引导;而systemd目标则接管了内核之后的全部用户态初始化。建议读者在虚拟机中反复练习:手动分区、LVM扩容、GRUB密码设置、救援模式修复、切换systemd目标。只有亲手操作过这些场景,才能真正理解Linux的启动哲学。