一、系统开机启动过程

3.1 启动流程概览

开机
 → BIOS 或 EFI(加电自检,找到启动设备)
 → MBR(Master Boot Record,硬盘 0 磁道 0 扇区,前 512 字节)
 → GRUB(多系统引导选择)
 → 通过 GRUB 找到 vmlinuz 和 initramfs(驱动硬件)
 → 内核启动,产生 init 进程
 → /etc/inittab(确定系统启动级别)
 → /etc/rc.sysinit(获取网络环境和主机类型、测试与载入设备、是否启动 SELinux、
                    模块加载、设置系统时间等)
 → /etc/fstab
 → 按照 inittab 中的级别启动 /etc/rcX.d/ 中的服务
 → /etc/rc.local
 → gdm(系统登录界面)

BIOS = Basic Input and Output System;EFI = Extensible Firmware Interface。

3.2 /etc/rc.local

在该文件中写入登录前要自动执行的命令或脚本。例如:

mount /soft/rhel-server-6.3-x86_64-dvd.iso /yum/ -o loop

/etc/rc.local 通过 /etc/rcX.d/S99local 软链接生效。如果该软链接丢失,写到 rc.local 中的命令不会执行:

ll /etc/rc5.d/S99local
# lrwxrwxrwx. 1 root root 11 Jul 14 07:26 /etc/rc5.d/S99local -> ../rc.local

3.3 让开机后自动关机的几种方式

  1. 将 inittab 默认级别改为 0。
  2. 在 /etc/rc.local 中加一句 init 0。
  3. 在必须自启动的服务脚本(如 /etc/init.d/network)中加一句 init 0。
  4. 在环境变量文件(如 /root/.bash_profile)中加 init 0。
  5. 在定时任务中定义一个时间执行 init 0。

二、GRUB 引导加载程序

4.1 GRUB 简介

GRUB(Grand Unified Boot Loader)是一个 boot loader 程序,能够引导大多数自由操作系统(Linux、FreeBSD、NetBSD、GNU Mach 等)以及大多数商业操作系统。

rpm -qa | grep grub
# grub-0.97-77.el6.x86_64

rpm -qi grub-0.97-77.el6.x86_64

4.2 GRUB 配置文件

GRUB 配置文件路径:

vim /boot/grub/grub.conf

如果使用了 EFI 分区(/boot/efi),路径为:

vim /boot/efi/EFI/redhat/grub.conf

配置文件示例及字段说明:

default=0                                          # 默认启动第一个系统
timeout=5                                          # 5 秒选择时间,写负数表示一直等待
splashimage=(hd0,0)/grub/splash.xpm.gz             # GRUB 界面背景图片,hd0 由 device.map 指定

title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
    root (hd0,0)                                   # boot 分区
    kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS \
           rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto \
           KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM LANG=en_US.UTF-8 rhgb quiet
    initrd /initramfs-2.6.32-279.el6.x86_64.img

内核启动参数说明:

参数 说明
rhgb RedHat Graphics Boot,用图片代替启动过程中的文本信息,启动后可用 dmesg 查看
quiet 启动过程中只显示重要信息,硬件自检等消息不显示

4.3 GRUB 配置问题

问题 1:不同分区方案下的 grub.conf 写法

分区方案 A:

分区 挂载点
/dev/sda1 /boot
/dev/sda2 swap
/dev/sda3 /
title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rhgb quiet
    initrd /initramfs-2.6.32-279.el6.x86_64.img

分区方案 B(无独立 /boot 分区):

分区 挂载点
/dev/sda1 /
/dev/sda2 swap
title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda1 rhgb quiet
    initrd /boot/initramfs-2.6.32-279.el6.x86_64.img

问题 2:删除 /etc/fstab 中 /boot 行的影响

假设 /etc/fstab 内容如下:

/dev/sda1   /boot       ext4   defaults   1 1
/dev/sda2   /           ext4   defaults   1 2
/dev/sda3   swap        swap   defaults   0 0
tmpfs       /dev/shm    tmpfs  defaults   0 0
devpts      /dev/pts    devpts gid=5,mode=620 0 0
sysfs       /sys        sysfs  defaults   0 0
proc        /proc       proc   defaults   0 0

删除第一行(/dev/sda1 /boot)后重启:

  • GRUB 不受影响,系统正常启动。
  • 只是启动后 /dev/sda1 没有挂载到 /boot 目录而已。
  • 原因:GRUB 找 vmlinuz 和 initramfs 不是通过 /boot 目录,而是直接读取 /dev/sda1;且从启动顺序来看,fstab 在 GRUB 之后执行。

问题 3:同一硬盘上安装两个 Linux 系统,谁的 GRUB 生效?

分区情况:

分区 挂载点 说明
/dev/sda1 /boot 第一个系统 boot 分区
/dev/sda2 / 第一个系统的根
/dev/sda3 swap
/dev/sda4 extended 扩展分区
/dev/sda5 / 第二个系统的根,无 boot 分区

在安装第二个系统时,若勾选了 "install boot loader on /dev/sda",则第二个系统的 GRUB 会覆盖第一个系统的 GRUB;若未勾选,则仍使用第一个系统的 GRUB。

如果第一个系统是 Windows、第二个是 Linux,默认即可引导 Windows。如果两个都是 Linux,第二个系统的 GRUB 默认没有第一个系统的引导记录,需要手动添加第一个系统的引导项:

title linux01
    root (hd0,0)
    kernel /vmlinux-xxx ro root=/dev/sda2
    initrd /initramfs-xxx
title linux02
    root (hd0,4)
    kernel /boot/vmlinux-xxx ro root=/dev/sda5
    initrd /boot/initramfs-xxx

如果想恢复使用第一个系统的 GRUB,执行:

grub-install /dev/sda

该命令将当前系统的 GRUB 配置安装到 sda 的 MBR 中,覆盖其他系统的 GRUB。

4.4 制作 GRUB 开机画面

GRUB 仅支持 640×480 分辨率、XPM 格式、14 色深 的图片。

(1) 转换图片格式

安装 ImageMagick(需要使用 convert 工具):

yum install -y ImageMagick

将图片转换为符合 GRUB 要求的格式:

convert -resize 640x480 -colors 14 123.jpg splash.xpm

该命令将 123.jpg 转换为符合要求的 splash.xpm。

(2) 检查图片是否符合要求

more splash.xpm

在文件头部若能找到以下信息,则说明图片可以被 GRUB 正常显示:

static char *10[] = {
"640 480 14 1",

(3) 压缩图片

gzip -9 splash.xpm

(4) 替换背景图

将得到的 splash.xpm.gz 放到 /boot/grub/ 路径下,替换原图片即可。

4.5 GRUB 加密码

给 GRUB 加密码可以防止别人在启动系统时修改 GRUB 进入单用户模式修改 root 密码。但有 GRUB 密码并不绝对安全,别人仍可通过 rescue 模式进入系统。

使用 grub-md5-crypt 产生密码加密串:

grub-md5-crypt
# Password:
# Retype password:
# $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/

在 grub.conf 中添加密码行,建议加到第一个 title 的上面(密码锁住它之后的所有引导项):

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/

title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS \
           rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto \
           KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM LANG=en_US.UTF-8 rhgb quiet
    initrd /initramfs-2.6.32-279.el6.x86_64.img

4.6 GRUB 排错

注意:以下实验不要使用 LVM,LVM 不支持这种手动引导方式。

当 GRUB 丢失或配置有误时,系统启动会进入 grub> 命令行界面。可按以下步骤手动引导:

grub> root (hd0,0)
grub> kernel /vmlinuz-xxxxxxx ro root=LABEL=/
grub> initrd /initramfs-xxxxxxxx
grub> boot
命令 说明
root (hd0,0) 指定 /boot 分区所在位置
kernel ... 指定内核文件及根分区(root 分区不要写错,LABEL 形式或 /dev/sdax 形式均可)
initrd ... 指定 initramfs 文件
boot 启动系统

进入系统后,修正 GRUB 配置,必要时执行 grub-install /dev/sda 重新安装 GRUB。

4.7 硬盘安装 Linux 系统

准备一个专门的分区存放安装文件(下例中为 /dev/sda6,挂载到 /soft):

df -h
# /dev/sda6   47G  4.0G  40G  9% /soft

需要准备的文件:

/soft/rhel-server-6.3-x86_64-dvd.iso
/soft/isolinux/
/soft/images/
/soft/vmlinuz
/soft/initrd.img

重启系统,在 GRUB 界面按 C 键进入命令行:

grub > root (hd0,5)
grub > kernel /vmlinuz
grub > initrd /initrd.img
grub > boot

之后进入系统安装界面,与光盘安装过程基本一致。唯一不同的是在选择安装方式时选择 Hard drive,然后指定 ISO 文件所在分区(如 /dev/sda6)。

最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏