一、系统开机启动过程
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 让开机后自动关机的几种方式
- 将
inittab默认级别改为0。 - 在
/etc/rc.local中加一句init 0。 - 在必须自启动的服务脚本(如
/etc/init.d/network)中加一句init 0。 - 在环境变量文件(如
/root/.bash_profile)中加init 0。 - 在定时任务中定义一个时间执行
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)。
此处评论已关闭