Lin.ux系统启动的基本过程和步骤:学习
最近在某个版.块看到有人讨论GRUB的问题,这里是.我个人的一些理解。域名
我想大部分还.是正确的,但肯定也有理解错.误的地方,在这里抛砖引玉了!.
Linux系统启动过程大致按照如下步骤进行(这是..一个简述): 杀毒
第一.阶段:BIOS启动引导阶段; 乙肝
在该过程中.实现硬件的初始化以及查.找启动介质; 鲜花
. 从MBR中装载启动引导管理器(GRUB)并.运行该启动引导管理 婚庆
第二阶段:GRUB启.动引导阶段; 美容
. 装载s.tage1 健康
. 装载sta.ge1.5.
. .装载stage2投资
. 读取/boot/grub.co.nf文件并显示启动菜单; 美容
装载所选.的kernel.和initrd文件到内存中 乙肝
第三阶段:内核阶段:
. . 运行内核启动参数;教育
. . 解压initrd文件并挂载initd文件系统,装载必须的驱动;电影
. 挂载.根文件系统 电子
第四阶段:Sy.s V init初始化阶段:电影
启动/sbi.n/init程序.;.
. 运行rc.sysinit脚本,设置系统环境,启.动swap分区,检查和挂载文件系统;外贸
读取/etc/inittab文件,.运行在/.et/rc.d/rc.d中定义的不同运行级别的服务初始化.脚本;.
打开字符终端1-6号控制台/打开图形显示管.理的7.号控制台( 游戏 )
同时在上述过程中各.阶段所需要读取的.文件和操作的对象:电影
BIOS启动.引导阶段 GRUB启动引导阶段 . 内核阶段 . /init/sysinit阶段.
====.=============================================.=================.================================(广告)
None /.boot/grub/gru.b.conf /boot/vmlinuz- /etc/rc.d/rc.sysin.it
. . /boot/grub/stage1_.5 /boot/initrd- /etc/inittab[成人用品]
. ./boot/grub/stage.2 /.etc/rc.d/rc.d.
. . . . /etc/rc.d/init.d/*--------------彩票
. . . . --------------彩票
(下面是详细.的过程) . . . 外贸
第一阶段:
系统上电开机后,主板BIOS(Basic I.nput / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:C.PU、内存、显卡、I/O、键盘鼠.标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Co.mplementary Metal Oxide. Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后.,信息不会丢失。.
执行POST代码对系统外围关键设备检测通.过后,系统启动自举程序, 根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的.启动器,.比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并.执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取.该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。电脑
注: 在我们的现行系统中,大多关键设备都是连在主板上的。因此主.板BIOS提供了一个操作系统(软件)和系统外围关键.设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备.是否“准备好”,以供操作系统使用。.
第二阶段:
BIOS通过下面两种方法.之一来传递引导记录: 女人
第一., 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引.导记录(MBR)中.
第.二, 将控制权传递给initial pr.ogram loader(IPL),该程序安装在磁盘分区的启动引导扇区中--------------彩票
无论上面的哪种情况中,IPL都是MBR的一部分并应该.存储于一个不大于446字节的磁盘空间中,.因为MBR是一个不大于512字节的空间。虚拟主机
因此IPL仅仅是GRUB的第.一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作用,该部分提供了GRUB启动菜单.和交互式的GRUB的shell。启动菜单在启动时候通过/boot/grub/g.rub.co.nf文件所定义的内容生成。在启动菜单中选择了kernel之.后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。.
完成之后后续的引导权被移.交给kernel。 婚庆
假设Boot Loader为grub (gru.b-0.97.),其引导系统的过程如下:教育
grub分为stage1 (stage1_5) 和stage2两个阶段。stage1可以看成是initial program loaderI(IPL),而.stage2则实现了grub的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:ker.nrl,i.n.itrd,root)等。--------------彩票
stage 1:MBR(512 字节,0头0道1扇区),前.4.46字节存放的是 stage1,.后面存放硬盘分区表信息,BIOS将stag1载入内存中0x7c00处并跳转执行。stage1(/stage1/stage.S)的任务非常单纯,仅仅是将硬盘0头0道2扇.区读入内存。0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是st.age2或者stage1_5的入口。教育
注:此.时stage1是没有能力识别文件系统的,其定位.硬盘0头0道2扇区过程如下:.
BI.OS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头.0道2扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存0x8000处。定位0头0道2扇区有.两种寻址方式:LBA、CHS。(广告)
start.S的主要功能是将stage2或stage1_5从硬盘.载入内存,如果是stage2,则载入0x820处.;如果是 stage1_5,.则载入0x2200处。域名
注:这里的stage2或者stage1_5不是./boot分.区/boot/grub目录下的文件,这个时候.grub还没有能力识别任何文件系统。分以下两种情况: 鲜花
(1)假如.start.S读取的是stage1_5,它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中.间的桥梁,stage1_5有识别文件系统的能.力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stag.e2文件,将stage2载入内存并执行。.
(2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的st.age2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。这种情况.下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻.址(而非通过访问具体的文件系统),其寻址范围有限.,限制在8G.B以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。 美容
假如是情形(2),我们将/boot./g.rub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删.除后,则系统启动过程中grub会启动失败。.
这个地方经常要进行的操作:
是关于grub常用的几个指令对应的函数.: 健康
grub.>root (hd0,0) -.-?root指令为grub..指定了一个根分区虚拟主机
grub>kernel /xen.gz-2.6.1.8-37.el5 . . . --?kernel指令将操作系统内核载入内存 鲜花
grub>module /vmlinuz-2.6.18-37..el5xen ro root=/d.e.v/sda2 --?module指令加载指定的模块健康
grub>module /initrd-2.6.18-37.el5xen.img . . --?指定init.rd文件 鲜花
gr.ub>boot . . --.?boot 指令调用相应的启动函数启动OS内核电影
第三阶段:
如阶.段2所述,grub>boot指令后,系统启动的控制权移交给kernel。Kernel会立即初始化.系统中.各设备并做相关配置工作,其中包括CPU、I/O、存储设备等。域名
关于设备驱动加载,有两部分.:一部分设备驱.动编入Linux Kerne.l中,Kernel会调用这部分驱动初始化相关设备,同时将日志输出到kernel message buffer,系统启动后dmesg可以查看到这部分输出信息。另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrd(ramdisk)中.。
在2.6内核中,支持两种格式的init.rd,一种是2.4内核的文件系统镜像image-init.rd,一种是cpio格式。以 cpio 格式为例,内核判断initrd为cpio的文件格式后.,会将initrd中的内容释放到rootfs中。 --- 印刷
initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系.统/时,会先访问in.itrd文件系统。将initrd中的内容打开来看,会发现有bin、de.vetc、lib.、procsys、sysroot、init等文件(包含目录)。其中包含了一些设备的驱动模块,比如scsi ata等设备驱动模块,同时还有几.个基.本的可执行程序 insmod, modprobe, lvm,nash。主要目的是加载一些存储介质的驱动模块,如上面所说的scsi ideusb等设备驱动模块,初始化LVM,把/根文件系统以只读方式挂载。服务器
initrd中的内容释放到ro.otfs中后,Kernel会执行其中的init文件,这里的init是一个脚本,由nash解释器执行。这个时候内核的控制权移.交给init文件处理,我们查看init文件的内容,.主要也是加载各种存储介质相关的设备驱动。 --------------彩票
驱动加载后,会创建一个根设备,然后将根文件系统/以只读的方式挂载。这步结束后释放未使用内存并执行switchr.oot,转换到真正的根/上面去,同.时运行/sbin/init程序,开启.系统的1号进程,此后系统启动的控制权移交给 ini.t 进程。关于switchroot是在nash中定义的程序。 鲜花
Linux Kernel需要适应多种不同的硬件架构,但.是将所有的硬件驱动编入Kernel又是不实际的,而且Ke.rnel也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上Linux Kernel仅是包含了基本的硬件驱动,在系统安装过程中会检测系.统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 in.itrd 。这样在以后启动.系统时,一部分设备驱动就放在initrd中来加载。 建材
第四阶段:
init进程起来后,系统启.动的控制权移交给i.nit进程。 乙肝
/sbin/in.it进程是.所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:健康
1)执行系统初始化脚本(/etc/rc.d/.rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此.系统基本算运行起来了,后面.需要进行运行级别的确定及相应服务的启动;.
2)确定启.动后进入的运行级别;.
3) 执行/etc/rc.d/rc,该文.件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/e.tc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/et.c/init.d下的相应文件。 鲜花
4)有关key sequ.ence的设置 建材
5) 有关UPS的脚本定义
6)启动虚拟终端/sbin./mingetty <性病>
7)在运行级别5上运行X
这时呈现给用户的就是最终的登录界面.。 女人
至此,系统启动过程完毕:)
说明:
1)/et.c/rc.d/rc.s.ysint -- System Initialization Tasks (广告)
它的主要工作有:
配置selinux,
系统时钟,
内核参数(/e.tc/sysctl.conf), 婚庆
hostname,
启用swap分区,
根文件.系统的检查和二次挂载(读写),.
激活RAID和LVM设备,
启用磁盘quota
检查并挂载其它文件系统
等等。
GRUB的基本原理以及.对GRUB的操作控制方法: 女人
GRUB全.称为.Grand Unified Boot Loader,是Linux操.作系统主流的启动引导管理器。主要作用是启动和装.载Linux操作系统。系统启动过程中一旦完成了BIOS自检,GRUB会被立刻装载。在GRUB里面包含了可以载入操作系统的代码以及将操作系统引导权传递给其他启动引导管理器的代码。GRUB可以允许用户选择使用不同的kernel启动系统,或者在启动系统的.过程中设置不同的启动参数。.
而通常BI.OS会以下面两种方法之一来调.用启动引导管理器: 杀毒
将控制权移交给于驱动器主.引导记录的initial program loade.r(IPL);.
将.控制权移交给其他启.动引导管理器,再由他们将控制权移交给安装在分区引导扇区的IPL.
通常情况下启动引导管理器.GRUB.由两部分组成(stage1和stage2): 汽车
stage1比较小,通常可.以驻留.在MBR或者各个磁盘分区的启动扇区中,主要作用是装载stage2。.
stage2比.较大,从磁盘的启动引导分区读取 建材
至于在stage1和stage2之间存在一个sta.ge1.5,是因为s.targe1.5具有识别文件系统的能力。电脑
在.Linux系统中对GRUB的配置有两种方法: 杀毒
主要引导管理器:
会将启动引导管理器的stage1安装在MBR上,这时启动引导管理.器必须被配置.为可以传递控制权到其他操作系统;外贸
次要引导管理器:
会.将启动引导.管理器的stage1安装在一些分区的引导扇区上,而其他的启动引导管理器会被安装在MBR上,由他们来向Linux启动引导管理器传递控制权。学习
GRUB在启动过程中可以提供命令行交互界面,可以从ext系列,reiserfs,fat等多种文件系统引导系统,并且可以提供密码加密功能,.其内容在/boot分区下.,系统启动过程中由配置文件/boot./g.rub/grub.conf来定义启动方式,对该配置文件的更改会立即生效。电影
在配置文件/boot/grub/grub.co.nf文件中定义的内容包.括:--- 印刷
grub所在的分区,引导系统所使用.的kerne.l文件位置,硬件初始化使用的initrd文件位置,以及启动参数。 乙肝
例如:
grub>root (hd0,0) .. . --?.root指令为grub指定了一个根分区教育
grub>.kernel /xen.gz.-2.6.18-37.el5 . --?kernel指令将操作系统内核载入内存.
grub>mod.ule /vmlinu.z-2.6.18-37.el5xen ro root=/dev/sda2 . --?module指令加载指定的模块虚拟主机
grub>module /initrd-2.6.18-37.el5.xen.img . . --?指定initrd文件.
grub>boot . . . --.?boot 指令调用相应的启动函数启动OS内核 杀毒
可见其指定的内容大多数在/boot分区.,如果切换到/.boot分区之后会看到这些内容:.
/boot/vml.inuz-* l.inux kernel的一个copy;域名
/boot/initrd*.im.g 初始化的ram .disk文件 建材
/boo.t/grub/device.map . linux设备名和grub设备名的映射文件 健康
/boot/grub/grub..con.f 主配置文件外贸
通常GRUB出.错几率不是很大,但一旦出现问题恐怕采.用最多的方式是重装grub到MBR中。--- 印刷
在这种时候需要注意的问题有:
首先,设备映射关系:
GRUB里面对设备名称的定义.和系统中对设备名称.的定义方法不一样:--- 印刷
.(fd0) . /dev/fd0.
. (hd0) /dev/sda . /dev/hda(广告)
(hd1.) /dev/sdb . /dev/hdb 杀毒
如够进入系统或者救援模式,可.执行命令/sbin/grub-install /dev/sda(或者hda)进行G.RUB重装:.
# /.sbin/gr.ub-install device学习
处.于某种原因MBR中信息出错可以使用上面的命令将其重装到磁盘主引导记录中;但是如果在不能进入系统的情况下就需要通过grub的命令行界面进行手动设.置,这个时候.就要注意上面所提到的映射关系。电脑
同时,在grub命令行中对grub进行手动设置的时候需.要注意所.使用的命令:.
.# root (hd0,0) . --?指定启动分区.
# se.tup(hd0) . --?表示将grub安装在主引导记录上 建材
.# quit . . --?退出grub shell 乙肝
下面是一个完整的grub.conf文件内.容:外贸
[
root@d.hcp-0-195 ~]# cat /et.c/grub.conf 杀毒
# grub.co.nf genera.ted by anaconda 婚庆
#
# Note that you do. not have to rerun grub after mak.ing changes to this file
# NOTICE: .You have a /boot par.tition. This means that[成人用品]
# . all kernel and initrd. paths are relative to /boot/, eg.学习
# root. (hd0,0) 杀毒
# . kernel /.vmlinuz-version ro root=/dev/VolGroup001/LogVol00学习
# .initrd /initr.d-version.img[成人用品]
#boot=/dev/sda
default=0
timeout=30
splashimage=(hd0,0)/grub/.splash.xpm..gz域名
hiddenmenu
password --md5 $1$apEcJWb.A$D.TJ8a6mKn/3yrTTSXBtdH0 乙肝
titl.e Red H.at Enterprise Linux Client (2.6.18-8.1.1.el5) 婚庆
root. (hd0,0).
kernel. /..vmlinuz-2.6.18-8.1.1.el5 ro root=/dev/VolGroup001/LogVol00 crashkernel=128M@16M 女人
initr.d /initrd-2.6.18-8..1.1.el5.img教育
系统启动运行级别的概念以及服务的.定制方法;.
当.initrd可以正常检测和装载之后,最后的工作就基本上由操作系统来进行了。当系统的init进程起来之后系统启动的控制权移交给in.it进程。域名
/sbin/init进程是所有进程的父进程,当i.nit起来之后,它首先会读取配置文件/etc/inittab,进行以下工作.:.
1)执行系统初始化脚本(/e.tc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,后面需要进行运行级别.的确定及相应服务的启动,(从这个角度可以看..出如果要定义系统的init动作,需要修改/etc/rc.d/rc.sysinit脚本) 汽车
2)通过对/et.c/inittab.文件的读取确定启动后进入的运行级别;投资
3) 在相应的运行级别中执行/etc/rc.d/rcx.d目.录下的脚本名称,该文件定义了服务启动的顺序是先K后S,而具体的.每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,但这些文.件均是到/etc/init.d下的相应文件的.链接。 乙肝
系统会按照在该目.录下的文.件名称和优先级执行对应运行级别目录下的脚本:域名
在某个运行级别的对应目录下,K开头的服务被关闭,S开头的服务被开启,K在S开始之前执行,在执行过程中按照数字来定.义优先级,数字越低优先级.越高。 乙肝
4)按照/etc/rc.d/rcX.d目录中的定义,系统会于后台启.动相.应的服务,如果要对某个运行级别中的服务进行更具体的定制,通过chkconfig命令来操作,或者通过setup/ntsys/system-config-s.ervices来进行定制。(广告)
5)在/etc/inittab文件中存在有关ke.y sequence,UPS的脚本定义,启动虚拟终端/sbin/mingetty的设置,这时呈现给用户.的就是最终的登.录界面。 婚庆
也就是说后台启动的服务完毕之后,如果系统默认.进入字符.界面,则运行mgetty进入1-6号终端控制台,如果系统默认进入图形界面,则开启gdm服务进入7号虚拟图形控制台.。服务器
至此,系统启动过程完毕。
对于/etc/rc.d/rc.sys.init文件.的说明:[成人用品]
/etc/rc.d/rc.sysint -- System Ini.tialization Tasks 执行系统初始化任.务的脚本。健康
它的主要工作有:
配置selinux,
系统时钟,
内核参数(/etc/sysctl..conf),(广告)
hostname,
启用swap分区,
根文件系统的.检查和二次挂载(读写),学习
激活RAID和LVM设备,
启用磁盘quota
检查并挂载其它文件系统
这是其基本要实现的工作内容:
#!/bin/bash
#
# /et.c/rc.d/rc.sys.init - run once at boot time投资
#
# Ta.ken in. part from Miquel van Smoorenburg's bcheckrc..
# Check SEL.inux status 健康
. .
# Because of a .chicken/egg problem, init_crypto must be run twic.e. /var may be..
# en.crypted. but /var/lib/random-seed is needed to initialize swap. 杀毒
# Only read this o.nce.( 游戏 )
# .Initialize hardware.
# Set def.ault affinity 女人
# Load other .user-defined mod.ules 鲜花
# Load mo.dules (for backward compat.ibility with VARs) 女人
#. Start the graphical boot, if necessary; /usr may.. not be mounted yet, so we电脑
# may have to do this .again after mou.nting( 游戏 )
# Configur.e kernel paramet.ers学习
# .Set the hostname..
# .Initialize ACPI bits.
# RAID setup
# Device mapper & rel.ated i.nitialization[成人用品]
# Update quotas if nec.essa.ry电影
# Remount the. root filesy.stem read-write.服务器
# Cle.an up SELinux labels 外汇
# Clear mtab
# Remove stale .backups 女人
# Enter mounted filesystems into /etc/mta.b.域名
# M.ount all other filesystems (except f.or NFS and /proc, which is already[成人用品]
# mounted). Contrar.y to standard us.age,.
#. filesystems are. NOT unmounted in single user mode..
# Check to s.ee if a full relabel is. needed投资
# Start the graphical b.oot, if neces.sary and not done yet.教育
#. Ini.tialize pseudo-random number generator服务器
# Use the hardware RNG to seed the entropy pool, i.f avai.lable电影
# Configure machi.ne if nece.ssary. 美容
# Clean out /.
# Do. we n.eed (w|u)tmpx files? We don't set them up, but the sysadmin might....(广告)
# Clean up /var. I'd use find, bu.t /usr m.ay not be mounted.服务器
# Res.et pam._console permissions服务器
# Cle.an up utmp/wtmp域名
#. Clean up various /tmp .bits 美容
# Make. ICE directory投资
# Start up .swapping. 婚庆
以下是我在生产环境中所碰到的一些和GRUB修复有.关.的案例:教育
案例一:
GRUB无法找到kernel i.mage的问题: 乙肝
产生这类型问题的原因包括:
配置文件中指定了错误的kernel image名称或者路径,在/boot分区下kernel文件被删除或.者更名,ke.r.nel image文件被破坏,Raid-1磁盘阵列更换故障盘后信息不同步等。.
对于这类型问题的解决方法:
可以设法通过救援模式或者在开机.的时候进入grub的shell,然后利用grub shell尝试手动指定和装载正确的kernel image..信息或者在救援模式下检查和重写grub.conf文件。电影
需要注意的是,如果要通过救援模式进入grub命令行.界面需要先chr.oot,即执行chroot /mnt/sysimage。在 健康
grub>提示符之后执行:
# root (hd0,0)
# setup(hd0)
# quit
不管通过什么样的方法和配置.,只要使GRUB能够正确找到kernel image是.解决问题的关键。外贸
在对grub修复的时候尤其要注意M.BR.信息在软件Raid上的恢复。( 游戏 )
Linux的b.oot分区不能建立在软件Raid-0上,但是可以建立在Raid-1阵列上。也就意味着系统的GRUB也是..同时写入到Raid-1磁盘阵列两块盘的MBR中。但是如果这个信息一旦这个信息没有正确写入或者正常完成写入,问题就会出现。 女人
这种情况多发于对Raid-.1阵.列中的坏盘进行更换的时候。.
一个典型的例子是,用户只有两块磁盘做Raid-.1,他在两块盘上分别规划了同样的磁盘分区/boot .swap以及/,对应的.设备是md0,md.1和md2。在其中的某一个磁盘出现问题的时候,用户更换一块新的磁盘.,并且按照原来的盘规划了/boot,swap以及/,同时使用了命令mdadm -A对三个md都进行了重组,重组能够顺利完成,但是一旦重启系统在出现一个GRUB的提示对话框之后引导停止。--------------彩票
从这个情况看来,很显然,md0,md1和md2内的数据.都.由原来的磁盘向.新的磁盘进行了同步,但是MBR的内容和信息没有同步过来。这就造成了系统启动的失败。--------------彩票
解决该问题的方法:
可以使用救援模式引导系统,或者使得GRUB.能够检测到文件系统——即出现GRUB>提示符,执行下面的命令,将GRU.B重装到第一块盘:学习
# root (hd0,0)
# setup(hd0)
# quit
然后执行,将GRUB.重装到第二块盘: 建材
# root (hd1,0)
# setup(hd0)
# quit
完成之后重启系统.。这种方法还可以对付在BIOS中.对启动引导管理器进行的修改。.
案例二:
Non.e System or. Disk Error和GRUB的关系: 乙肝
某个用户曾经报告一台HP的DL380服务器上原有40G和140G两块硬盘,并且按照第一块硬盘所能.够提供的磁盘空..间建立了一个软件Raid-0磁盘阵列。该用户在没有拔除这两块硬盘的情况下直接加入了两块.新的硬盘并计划对原有的Raid-0阵列进行扩容。但在插入.硬盘重启之后显示“None System or Disk Error”,在用户拔除这两块硬盘之后重启还出现同样的信息。外贸
根据描述的系统启动过程来看,这个no.ne system or d..isk error的报错,表明系统启动引导过程中并没有装在任何启动引导管理器(GRUB)信息,而之所.以没有找到这些信息是因为这些磁盘的MBR里面没有用于引导的IPL或者说白了系统所用于引导的磁盘根本就不是启动盘。看来系统并没有使用.用户设想的磁盘作为启动引导磁盘。那么也就时说.这和在磁盘的GRUB没有任何关系,我们所要做的第一能够确保系统使用正确的磁盘引导,第二就是没有对原有的GRUB进行任何错误的修改就行。.
按照我们对问题的分析,用户更.换了.硬盘所在的槽位,问题得到解决。.
产生该问题的原因是因为HP DL380服务.器在安装系统必须在阵列上进行,但是新加入的磁盘或者阵列会更改原来.默.认的启动引导顺序。尽管这和GRUB的修复没有任何关系,但是能够准确定位该问题的所在至少能够减少排错的时间以及一些不必要的麻烦。电影
案例三:
在RHEL3中HP服务器上的cciss和system.-m.ap的问题:.
众所周知在G.RUB中对设备进行命名的方法和.系统命名的方法是不同的。不管系.统中的启动引导磁盘是sd接口还.是hd接口在GRUB中都会被统一识别为hd,并且hda/sda?hd0,hdb/sdb?h.d1……依次类推。这和系统对设备的命名方式显然存在一些差异,但是这种差异通过在/boot/grub/device-map文件中进行解释和映射来实现系统对两种设备命名方法的映射。.
这是一个devic.e-map文件的内容: 女人
遗.憾的是,redhat老版本的操作系统如RHEL3的某个版本,在一些特殊的硬件上,如HP的cciss中对系统设备名和GRUB设备名的映射关系不正确而导致系统在这些硬件上无法启动。这可以认为是操作系统的一个bug,所幸该bu.g在RHEL3靠后的几.个发行版后.都得到了修复。虚拟主机
尽管碰到.这种问题的几率极低,但需要明确一点,检查设备映射是否正确也是.GRUB排错的一项内容。 杀毒
这里顺别说一下:
cciss是惠普的smart array控制器.的设备名,c0指channl 0,第一个SCSI通道,d0指逻辑盘1,d1指逻辑盘2……,p1指第一个分区,p2是第二个分区……。在这种情况下,我们可以看到很多HP的服务器在通过该设备连接硬盘的时候,经常看到.的设备是/dev/cc.iss/c.0d0p1,/dev/cciss/c0d0p2,/dev/cciss/c0d0p3等。.虚拟主机
案例四:
在GRUB中向kerne.l传递了错误的根分区信息导致系.统kernel panic:学习
在GRU.B的配置中,根分区信息的指定是必须的,但是一旦错误指定了根分区或者根分区.文件文件系统或卷标被破坏都回导致在启动引.导过程中出现kernel panic情况。.
这是在GRUB中.对/分区指定的信息: 汽车
kernel /vmlinuz-2.6.18-.8.1.1.el5 ro root=.LABEL=/ 服务器
那么一旦/卷标被删除,可以通过e2l.abel的方式重新创建.,或者将其直接更改为:域名
kernel /vmlinuz-2.6.18-8.1.1..el5 ro ro.ot=/dev/sda2.
即以直接指.定/分区名的方式来指定根分区。服务器
这个操作可以在开机发现错误之后于.GRUB命令行中直.接修改,或者进入救援模式进行操作。当前所定义的.内容如果成功,切记将其记录到/etc/grub.conf或者/boot/grub/grub.conf文件中。.
其实这是一个非常典.型的错误,出错.的时候,屏幕上显示的大概情况如下:.
Creating block .devices 建材
Creating root dev.ices 婚庆
m.krootdev:la.bel / not found--- 印刷
Mount.ing root filesystem.
Moun.t:error 2 mounting e.xt3.
Pivo.troot:pi.vot_root(/sysroot, /sysroot/initrd) failed:2--- 印刷
umou.nt /in.itrd/proc failed:2.
Freeing unused kernel. memory:.164k freed
Ker.nel panic:no init found. Try passing init = option to kerne.l.电脑
很显然,这个时候如果是因为/文件系统无法找到或者挂载成功,必须的内.核模块没有加载成功或者initrd文件被破坏都有可能出现.同样的信息(这里.所.指的模块是包括了驱动器,硬件控制器以及作用于文件系统的驱动程序,当然如果是模块造成系统启动不成功的话,可以使用mkinitrd命令对initrd文件进行重建)。.
具体的命令是:
# mkinitrd –f /boot/..initrd-.img --- 印刷
例如:
# mkinitrd –f /b.oot/initrd-2.6.9-42.ELs.mp.img 2.6.9-24.ELsmp.
在完成了init.rd镜像的重建之后可.以重新启动系统。.
如果问题确认是因为initrd镜像被破坏而导致无法识别文件系统,则通.过上面的操作已经能够正确找到root文件系统.并开启init进程。域名
案例五:
该案例实际上和上面的案例有紧密关系。上面的案例中由于GRUB无法正确加载根文件系统而导致k.ernel panic。造成这个问题的原因也是多种多样。但是即便通过上面的修复可以使.得kernel加载根文件系统并且开启init进程,那么在下一步rc.sys.i.nit脚本执行过程中任何区域出现错误也会导致系统无法启动。 汽车
因为在存储方面,sc.sysinit脚本会初始化软件raid以及l.vm设备然后读取/etc/fstab,所以这个时候如果/etc/f.stab文件配置不正确,也会造成系.统启动不成功。外贸
从出现的问题现.象上基本可以断定是/etc/fstab的问题,但是好在这个时候可以进入修复模式,对问题的修复方法也.容易很多。这是出现问题的时候的截屏: 杀毒
Coundn’t find matching filesys.tem: LABEL=./ 婚庆
*** An error occurred during th.e file system c.heck..
*** Dropping you to a shell; the syst.em wi.ll reboot.
*.** wh.en you leave the shell..
Give root password for ..maintenance.
(.or type Control-D to co.untinus): 乙肝
在这个界.面中输入root密码可以在出现的修复模式中运行命令修复.。.
另外一个会造成该现象的原因.是在读/etc/fstab文件.并挂载文件系统的时候文件系统检测失败。在这种情况下需要确保文件系统处于umount状态下运.行e2fsck。.
案例六:
对initrd文件的修复:
initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统/时,会先访问initrd文件系统。将initrd中的内容打开来看,会发现有bin、devetc、li.b、procsys、sysroot、init等.文件(包含目录)。其中包含了一些.设备的驱动模块,比如scsi ata等设备驱动模块,同时还有几个基本的可执行程序 insmod, modprobe, lvm,nash。主要目的是加载一些存储介质的驱.动模块,如上面所说的scs.i ideusb等设备驱动模块,初始化LVM,把./根文件系统以只读方式挂载。 外汇
Linux Ker.nel需要适应多种不同的硬件架构,但是将所有的硬件驱动编入Kernel又是不实际的,而且Kernel也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上Linux Kernel仅是包含了基本的硬.件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设.备驱动写入 initrd 。这样在以后启动系统时,.一部分设备驱动就放.在initrd中来加载。 健康
所以在启动过程中initrd文件会在1号进.程被开启之.前执行,如果一旦initrd文件被破坏或者非正常的更改就会导致系统无法启动。根据以前对initrd原理的解释,in.itrd中的init是使用nash解释器去执行,所以系统启动没有到nash的时候停住,可以基本上判断.是initrd这里hang住。比较可行的办法是通过mkinitrd命令重建initrd,生成一个新的用于初始化和装载模块的ramdisk镜.像。.
具体的命令是:
# m.kinit.rd –f /boot/initrd-.img 鲜花
例如:
# mkinitrd –f /boot/initrd-2.6.9-42.ELsmp.img 2.6.9-2.4.EL.smp 乙肝
或者通过强制.的方式重装一个kernel,因为kernel基本上以不变的方.式覆盖原来kernel所安装的内容,同时会在rpm安装ker.nel命令中有重建initrd的脚本:(广告)
[root@dhcp-0-195. ~]# rpm -.q --scripts kernel虚拟主机
postinst.al.l scriptlet (using /bin/sh):电脑
if [ `uname -i` == "x86_64" -o `uname .-i` == "i386" ]; .then.
if [ -f /e.tc/sysconfig/.kernel ]; then
/bin/sed -i -e 's/^DEFAULTKERNEL=kernel-smp$/DE.FAULTKERNEL=ke.rnel/' /etc/s.ysconfig/kernel || exit $?.
fi
fi
/sbin/new-kernel-pkg --package kern.el --mkinitrd --depmod --install 2..6.18-8.1.1.el5 || exit $?. 杀毒
if [ -x /.sbin/weak-modu.les ].
then
. /sbin/weak-modules --add-kernel 2.6.18-8.1.1.el5. || exit $?.
fi
preuninstall scriptlet (usi.ng /b.in/sh):教育
/sbin/new-kernel-pkg --rmi.nitrd --rmmoddep --remove 2.6.18-8.1.1.el5 ||. .exit $? 健康
if [ -x /sbin/weak-mod.ules. ]( 游戏 )
then
/sbin/weak-modules --remove-kernel 2.6.1.8-8.1.1.el.5 || exit $? 婚庆
fi
案例七:
在系统启动过程中对rc.sysinit..脚本进行定位的方法: 杀毒
在最近对一些客户问题进行处理的时候有时会发现一些因为对/etc/rc.d/rc.sysinit脚本的更改而导致系.统无法启动成功的问题。由于rc.sysinit脚本.所负责系统环境变量、存储,设备初始化、配额等多个部分的设置和初始化,所以在启动过程中出现.如果是因为rc.sy.sinit的更改而出现dead lock不容易定位是哪个地方的设置出现问题。 女人
由于.rc.sy.sinit脚本是由多个部分组成,一个比较简单的办法就是在每个部分之间加上一个标记。例如: 健康
sleep 10
echo “sleep .10”学习
这样系统在执行rc.sysinit脚本过程中的每个部分都会停10秒并显示一个提示信息“sleep 10”,这样可.以通过.显示的信息定位大概问题出在哪里。虚拟主机
案例八:
在系统启动过程中出现的初始化和启动.swap的时候系统出现的dead .lock的解决方法: 建材
在.某些情况下系统启动到enabl.e swap的时候会长时间的dead lock现象,在某些时候系统悬挂于此而始终不能打开mgetty终端提供控制台。.
swa.p交换分区是一个特殊的文件系统,该文件系统的基本作用就是可以使操作系统将一部分驻留.于内存而暂时不操作的进程转移到sw.ap分区中而腾出物理内存给新的需要执行的进程。--- 印刷
红帽官方推荐的使用交换分区的比例是2G物理内存以下,交换分区为物理内存的.1.5-2倍.;4G以上物理内存推荐交换分区与物理内存为1:1。 女人
但一般情况下可能会有多种原因造成swap文件系统的初始化失败而且由于swap分区内容在用户空间无法操作,所以很难准确获得原因。但很多时候系统在启动到swap的时候并没有真正的dead lock,而是由于之后的一些其他服务的启动影响了系统打.开终端并给用户造成.系统.启.动swap失败的假象。--------------彩票
基本上一些启动顺序.在swap之后的服务都有可能产生这种影响,但由于系统在安装之后默认加载在kernel parameter “r.hgb quite”会掩盖整个的启动过程,.所以在系统启动到GRUB的.时候通过进入GRUB菜单,手动删除“rhgb quite”会防止在启动的时候屏蔽启动过程并显示完整的启动信息。( 游戏 )
另外这个rhgb(redhat. graphical boot.)本身就有可能干扰后续的服务启动。在很多时候实际上后面的服务已经起来,但是系统会显示enable swap并停在该处。在.这个时候可以使用pin.g的方法或者ssh去探测该主机是否已经可以登录并提供服务。外贸
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u/7546/showart_1070558.html.