您的位置:首页 > 运维架构 > Linux

RHCE课程-系统管理部分|2、linux系统启动流程

2008-11-13 17:36 639 查看
这节课程是相当重要的。也是RHCE考试上午的考的主要内容,系统排错。只要你看懂了系统的启动流程,排错就基本没有多大问题了。
计算机启动,上电自检就不说了。下面就是LINUX的启动流程
1:硬件读取引导扇区
2:加载LILO或者Grub
3:加载内核
4:挂装根文件系统
5:启动init,一切进程的“祖父”
6:读取/etc/inittab文件
7:读取rc.sysinit文件
8:运行rcX.d下的文件(文件都是init.d下的符号链接)
其中有一个xinetd的超级进程,调用/etc/xinetd.conf配置文件,从配置文件中知道读/etc/xinetd.d文件,结束后调用Miggetty
9:读取/etc/rc.d/rc.local 文件

启动引导工具引导并运行核心
分为两个独立的阶段
第一阶段:存放在启动扇区
第二阶段;/boot目录下的文件
在Linux中常用的启动引导工具
grub
lilo

第一阶段即BIOS从启动扇区中读入IPL(初始化程序引导工具)这一过程。因为MBR的空间太小,所以启动引导工具往往还需要从其他地方进一步读入数据,即所谓第二阶段。这通常是一个可以做选择的交互界面。

GRUB:Grand Unified Bootloader
被广泛地用于替代lilo
支持在启动时使用命令行模式
支持md5加密保护
可以从ext2/ext3、ReiseFS、JFS、FAT、minix及FFS文件系统上启动
其配置文件为/boot/grub/grub.conf
更动grub.conf即可立时生效
如果硬盘上的MBR被更动过,可以用
/sbin/grub-install /dev/hda来重安装grub

grub.conf的范例:
timeout=10 #等待10秒自动进入默认操作系统
splashimage=(hd0,0)/grub/splash.xpm.gz #grub启动背景画面
default=0 #默认进入第一个标题
title Red Hat Linux (2.4.20-18) #Red Hat Linux标题
root (hd0,0) #根文件系统位置
kernel /vmlinuz-2.4.20-18 ro root=LABEL=/ #核心位置与核心加载参数
initrd /initrd-2.4.20-18.img #启动initrd ram盘
title windows #另一个操作系统的标题
rootnoverify (hd0,1) #操作系统存放在hd0,1上,不要在grub里mount
chainloader +1 #从hd0,1的第一个扇面启动

内核模型
单片型内核
单片型内核将各种硬件支持、网络协议与文件系统管理都编译入一个单一的文件中。
模块型内核:
模块型内核则允许计算机在使用到某一项功能的时候自动加载,防止了核心臃肿,是大部分情况下的标准构建。

默认核心存放路径:/boot
核心版本命名规则
主版本号、次版本号、补丁级数
Red Hat附加参数:发布号
显示当前系统的内核信息#uname -r
核心RPM包
kernel-<version>.<arch>.rpm
预编译核心及模块
kernel-source-<version>.<arch>.rpm
核心源代码,需要人工编译出核心并安装
kernel-<version>.src.rpm
www.kernel.org上发布的原始核心源代码包,需要build出arch包再使用

vmlinuz
是可引导的、压缩的内核。“vm”代表 “Virtual Memory“, Linux支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。
vmlinuz的建立有两种方式: (1) 编译内核时通过“make zImage”创建,zImage适用于小内核的情况,它的存在是为了向后的兼容性。 (2) 内核编译时通过命令make bzImage创建 (单独编译内核映像,不编译驱动模块,生成内核映像bzImage)

Initrd
initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。#mkinitrd initrd-版本号.img 版本号

核心启动流程
检测硬件设备
设备驱动初始化
将根分区以只读方式挂载
载入初始进程(一般是init)

init从/etc/inittab中读取数据并初始化
init运行级别
系统启动脚本
执行运行级别对应目录下的脚本
设置热键
定义UPS设备脚本
在虚拟控制台上循环开启getty进程
定义runlevel 5时的X显示管理器

init定义了0~6这7个运行级别
运行级别可以被指定于:
系统启动时作为核心加载参数被指定
未被指定的情况下,系统启动时从/etc/inittab中读取
在系统运行中,root用户键入init [0-6]来指定。
用户可以用/sbin/runlevel来查看当前的运行级别

•系统的运行级别默认情况下为:
•0:关机
•1/S/emergency:单用户模式,通常用于维护系统
•2:多用户模式但无网络
•3:多用户模式(字符界面)
•4:用户定义,未定义情况下与3相同
•5:X11(包括网络)
•6:系统重启

/etc/rc.d/rc.sysinit是系统启动用的脚本
从/etc/sysctl.conf中读取核心参数
设置系统时钟
载入keymap
激活swap分区
设置主机名
检查根文件系统并挂载
加载Raid设备
激活磁盘限额
检查并挂载其他文件系统
清除失效锁及PID文件

每一个运行级别都对应一个目录
/etc/rc.d/rcX.d
目录内存放的,即当前运行级别需要开启的服务脚本
对应/etc/rc.d/init.d/目录下的链接
链接文件开头是S,表示启动;开头是K,则表示关闭。
切换运行级别,即运行这个目录里所有的脚本
用户可以通过ntsysv调整当前运行级别的开关服务,或用chkconfig,调整某一运行级别下的开关服务。

/etc/rc.d/rc.local
在运行级别目录下被最后一个调用
一般系统用户将针对此台计算机的开机定制设置写入其中,而非/etc/rc.d/rc.sysinit。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息