3. Linux安装与启动:虚拟机安装、分区方案、引导过程(BIOS/UEFI、GRUB)、运行级别与systemd目标
Linux系统的安装与启动是进入Linux世界的第一道门槛,也是理解系统底层运作机制的关键环节。本章将围绕“从零开始安装一个可用的Linux系统”这一主线,深入剖析虚拟机环境下的安装流程、磁盘分区策略、固件与引导加载程序(BIOS/UEFI与GRUB)的协作原理,以及系统初始化机制(从传统的SysVinit运行级别到现代systemd目标)的演进。掌握这些内容,不仅能够帮助你顺利完成安装,更能为后续的系统排障、性能调优和服务器管理打下坚实基础。
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为例
- 创建虚拟机:设置名称、操作系统类型(Linux, Red Hat 64-bit)、内存(建议≥2GB)、CPU核心数(≥2)。
- 创建虚拟磁盘:选择VDI(VirtualBox Disk Image)格式,动态分配(Dynamic Allocated),大小建议≥20GB。
- 设置存储控制器:在“设置→存储”中,将安装ISO镜像挂载到光驱(IDE或SATA控制器)。
- 配置网络:默认NAT模式可访问外网;若需宿主机与虚拟机互通,可添加“仅主机(Host-Only)”网卡。
- 启动安装:开机后进入安装引导菜单,选择“Install CentOS Stream 9”。
- 安装源与软件选择:使用本地ISO源;软件选择“Server with GUI”或“Minimal Install”(根据需求)。
- 分区与网络配置:按3.2节方案进行分区;配置主机名、启用网卡并设置静态IP(如192.168.56.10/24)。
- 设置root密码与创建用户:完成安装后重启,进入系统。
3.1.3 案例拆解:虚拟机磁盘扩容实战
背景:某开发者的虚拟机磁盘初始分配20GB,使用半年后根文件系统使用率达95%,导致服务异常。约束:不能重装系统,需在线扩容。
操作步骤:
- 在VirtualBox中关闭虚拟机,执行
VBoxManage modifyhd disk.vdi --resize 40960(扩容至40GB)。 - 启动虚拟机,使用
lsblk确认磁盘空间已增加(/dev/sda从20G变为40G)。 - 使用
growpart /dev/sda 3扩展分区(假设根分区为第3分区)。 - 使用
pvresize /dev/sda3(若为LVM)或resize2fs /dev/sda3(若为ext4)扩展文件系统。 - 使用
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,要求磁盘空间可在线扩展。
方案设计:
- 创建物理卷(PV):
pvcreate /dev/sda2 /dev/sdb1 - 创建卷组(VG):
vgcreate vg_data /dev/sda2 /dev/sdb1 - 创建逻辑卷(LV):
lvcreate -L 1.5T -n lv_home vg_data - 格式化并挂载:
mkfs.xfs /dev/vg_data/lv_home,编辑/etc/fstab添加自动挂载。 - 扩容演练:新增磁盘后
vgextend vg_data /dev/sdc1,再lvextend -L +500G /dev/vg_data/lv_home,最后xfs_growfs /home在线扩展文件系统。
风险与代价:LVM增加了管理复杂度;若卷组元数据损坏,恢复难度较大,需定期备份 /etc/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引导的完整链路
- 固件阶段:BIOS/UEFI初始化硬件,选择启动设备。
- GRUB阶段1:BIOS模式下,GRUB的boot.img被加载到内存,它随后加载core.img(通常位于/boot/grub2/i386-pc/)。UEFI模式下,固件直接加载grubx64.efi。
- GRUB阶段2:GRUB读取配置文件
/boot/grub2/grub.cfg,显示菜单,等待用户选择内核或编辑启动参数。 - 内核加载:GRUB根据菜单项加载
vmlinuz-<version>和initramfs-<version>.img到内存,并传递启动参数(如root=/dev/mapper/vg_root-lv_root、quiet、splash)。 - initramfs阶段:内核解压initramfs到内存根文件系统,加载必要的驱动(如SCSI、SATA、NVMe、文件系统模块),然后挂载真正的根文件系统。
- init进程:内核执行
/sbin/init(符号链接到systemd),系统进入用户态初始化阶段。
e 键可编辑启动项。常见参数包括:ro(只读挂载根)、rhgb(Red Hat图形启动)、quiet(隐藏详细日志)、systemd.unit=emergency.target(进入紧急救援模式)。
3.3.3 案例拆解:修复GRUB引导故障
现象:某服务器重启后黑屏,显示 GRUB Rescue> 提示符。原因:/boot分区损坏或grub配置丢失。
修复步骤:
- 使用CentOS安装光盘或Live USB启动,进入救援模式(Troubleshooting → Rescue a CentOS system)。
- 选择“1”挂载根文件系统到
/mnt/sysimage。 - 执行
chroot /mnt/sysimage切换根环境。 - 重新安装GRUB到磁盘:
grub2-install /dev/sda(BIOS模式)或grub2-install --target=x86_64-efi --efi-directory=/boot/efi(UEFI模式)。 - 重新生成配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg。 - 退出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配置错误)。
解决步骤:
- 进入紧急模式:在GRUB菜单按
e,在linux行末尾添加systemd.unit=emergency.target,按Ctrl+X启动。 - 检查网络配置:
ip addr查看网卡状态,cat /etc/sysconfig/network-scripts/ifcfg-ens33检查配置。 - 修正配置:确保
BOOTPROTO=static时填写了正确的IP、网关、DNS;或改为BOOTPROTO=dhcp。 - 重启网络服务:
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会阻止服务被任何方式启动(包括依赖触发)。