天行健,君子以自强不息!

Linux 启动

上一篇 / 下一篇  2012-10-16 19:38:13 / 个人分类:Linux

摘自红联论坛

Linux开机不是简单的按电源
1、        计算机读取BIOS来加载硬件信息并完成硬件的自检,然后读取BIOS设置的第一个可开机的设备。
2、        读取并执行第一个开机设备的MBR的boot loader(grub、lilo、spfdisk等引导程序)
a)        boot loader提供的功能有3个:提供选单:使用者可以选择不同的开机项目,可以选择不同的核心启动;载入核心档案:直接指向可开机的程序区段来开始操作系统;转交其它loader:将开机管理功能转交给其它loader 负责。这里的要点是系统能够使用的引导加载程序必须能够认识文件系统。
b)        boot loader是存储在MBR中的,虽然不同的操作系统的boot loader不同,但是BIOS通过硬件的INT 13中断来读取MBR,也就是说,BIOS能检测到硬盘,就能通过INT 13中断来读取MBR了,这样boot loader也就能被执行了。
c)        boot loader的大小可能会超过466,解决方法是将引导加载程序分成两段来执行,第一阶段仅安装引导加载程序的最小主程序,此主程序必须安装在启动区,即MBR或第一个扇区,不去安装相关配置文件。第二阶段为载入引导加载程序的所有设置文件和相关的环境参数文件,一般来说,设置文件都在/boot目录,如grub.conf
注:MBR不属于任何操作系统,不能用操作系统提供的磁盘操作命令来读取它,但是可以通过命令来修改和重写。位于硬盘的0柱面,0磁头,1扇区,共分为3部分引导程序区,硬盘分区表区,扇区结束标志区,MBR总大小为512字节,其中引导程序区占466个字节,它负责检测硬盘分区表和寻找可引导分区并将其引导扇区信息加载到内存;硬盘分区表占64个字节,含4个分区项,每个分区项长16个字节,这也就是每个硬盘主分区加扩展分区的数量最多有4个的原因,与此同时,每个硬盘最多只能有一个扩展分区,这个扩展分区不能被直接使用,必须和逻辑分区结合起来使用,每个硬盘分区表里面记载了每个分区的类型、大小和分区开始、结束的位置等重要内容;扇区结束标志位为2个字节,固定为55AA,如果标志错误,系统无法启动。
3、        依据boot loader的设定加载kernel和initrd,kernel检测硬件设备并加载驱动
a)        由boot loader管理开始加载内核,首先将内核解压到内存中,利用内核功能测试和驱动各个装置,如CPU、网卡、声卡等,这是kernel自身进行的检测,不一定使用BIOS检测的硬件信息。
b)        核心是/boot/vmlinuz*文件,核心可以动态加载核心模块,比如各种驱动程序
c)        核心模块放置在/lib/modules目录,因为系统启动第一个挂载的分区为/,假设内核无法识别硬盘,需要加载硬盘的驱动程序才能识别,但是读取驱动程序又必须先挂载模块分区,这时候就需要initrd,这个文件/boot/initrd*,它可以被boot loader加载到内存中,并被虚拟成一个根目录/,完成开机过程中最重要的核心模块的加载,完成后释放虚拟系统,挂载实际的文件系统,开始后续的正常开机流程。没有initrd,也可以顺利开机,只有在特殊的磁盘接口(USB, SATA, SCSI) , 或者档案系统较为特殊(LVM, RAID) 等等在开机时无法挂载/的时候才需要它。
4、        硬件驱动完成后,kernel会去执行初始化脚本程序
a)        核心加载完成后,开始执行系统的第一个二进制脚本:/sbin/init,它的主要功能是准备软件执行的环境,包括主机名、网络环境、语系、启动各种服务等,init会去读取/etc/inittab文件并根据其设置完成以上动作。/etc/inittab 的设定也有点类似shell脚本,文件内容的设置也是逐行从上向下处理,init 的处理流程为:
1. 先取得runlevel 亦即预设执行等级的相关等级
2. 使用/etc/rc.d/rc.sysinit 进行系统初始化
3. 由于runlevel 是5 ,因此只执行l5:5:wait:/etc/rc.d/rc 5,其它行则略过
4. 设定好[ctrl]+[alt]+[del] 这组的组合键功能
5. 设定不断电系统的pf, pr 两种机制;
6. 启动mingetty 的六个终端机(tty1 ~ tty6)
7. 最终以/etc/X11/perfdm -nodaemon 启动图形接口啦!
b)        inittab文件定义了启动的运行级别,根据不同的级别开启/关闭不同的服务。
1、首先文件定义了7个run level,分别是:
0        - halt (系统直接关机)
1        - single user mode (单用户模式,用在系统出问题时的维护)
2        - Multi-user, without NFS (类似底下的runlevel 3,但无NFS 服务)
3        - Full multi-user mode (完整含有网络功能的纯文字模式)
4        - unused (系统保留功能)
5        - X11 (与runlevel 3 类似,但加载使用X Window)
6        - reboot (重新开机)
2、 根据上述init处理inittab文件的内容的流程,可以读取默认的启动级别,同时根据指定接下来执行的脚本文件等信息,文件的语法是利用冒号(:) 将设定分隔成为四个字段,每个字段的意义与说明为:[设定项目]:[run level]:[init 的动作行为]:[指令项目]
设定项目:最多四个字符,代表init 的主要工作项目,只是一个简单的代表说明
run level:该项目在哪些run level 底下进行的意思。如果是35 则代表runlevel 3 与5 都会执行
init 的动作项目:主要可以进行的动作项目意义有initdefault(代表预设的run level 设定值)、sysinit(代表系统初始化的动作项目)、ctrlaltdel(代表三个按键是否可以重新启动的设定)、wait(代表后面字段设定的指令项目必须要执行完毕才能继续底下其它的动作)、respawn(代表后面字段的指令可以无限制的再生,举例来说, tty1 的mingetty产生的可登入画面, 在你注销而结束后,系统会再开一个新的可登入画面等待下一个登入)
指令项目:亦即应该可以进行的指令,通常是一些script
3、 重要信息摘录有:
id:5:initdefault: <==预设的runlevel 设定, 此runlevel 为5
si::sysinit:/etc/rc.d/rc.sysinit <==系统的环境脚本
1:2345:respawn:/sbin/mingetty tty1 <==共有tty1~tty6个终端
x:5:respawn:/etc/X11/prefdm -nodaemon <==X window 则是这行决定
c)        rc.sysinit脚本inittab中指定rc.sysinit这个shell脚本来设置系统环境,这个脚本的主要工作有:
1、        获取网络环境与主机类型(首先读取网络设置文件/etc/sysconfig/network,获取主机名与默认网关等网络环境)
2、        测试与载入内存设备/proc及USB设备/sys
3、        决定是否启动SELinux
4、        接口设备的检测和即插即用(PnP)参数的测试
5、        用户自定义模块的加载(可在/etc/sysconfig/modules/*.modules加入自定义模块,此时会自动加载到系统中)
6、        加载核心的相关设置(系统会去主动读取/etc/sysctl.conf文件的设置)
7、        设置系统时间
8、        设置终端控制台的字形
9、        设置RAID与LVM等硬盘功能
10、        以fsck检测磁盘文件系统
11、        如果需要,进行磁盘配额quota的转换
12、        重新以可读取模式载入系统磁盘
13、        启动quota功能
14、        启动系统随机设备(产生随机数功能)
15、        清除启动过程中的临时文件
16、        将启动相关信息加载到/var/log/dmesg文件中
经过上述过程,基本的系统设置都完成了,基本上这个文件中执行的很多工作的默认设置文件都在/etc/sysconfig中。
d)        rc.n 文件:rc.sysinit执行完成后,根据inittab文件中的设置值,根据不同的默认运行级别,来启动系统所需的各项服务,只执行与运行级别对应的脚本,其他都忽略,每一个运行级别对应/etc/rc.d/rc.n目录下的文件都是以S或K开头的文件,这些文件都是连接文件,它们连接到/etc/rc.d/init.d目录下的shell脚本(/etc/rc.d/init.d和/etc/init.d其实是一样的,因为这两个目录是连接文件),其中S打头的文件是启动时需要启动的服务文件连接,K开头的文件为关机或者更改运行级别时需要关闭的服务的文件连接,S和K后面的数字是执行的顺序。
如系统变换运行等级从5到3时,系统会去比较两个运行等级对应K和S开头的文件,然后关闭那些rc5.d中启动且不存在rc3.d中的对应服务,启动那些rc3.d中需要启动且不存在与rc5.d中的服务。
runlevel命令可以显示当前的运行等级
e)        rc.local:利用此文件完成用户自定义的开机工作。根据文件inittab中设置,完成了所有的系统服务启动后,Linux会启动终端或者X桌面系统,在运行级别时2345时,都会执行/sbin/mingetty,这个脚本就是启动终端的命令,执行了6个,这就是为什么会有6个纯文本中终端的设置。同时respawn的init,表示后面的命令被终止时init会自动重新启动该项目,这也就是为什么以exit离开后,系统还是会重新显示用户登录的界面的原因。
5、        最流行grub引导程序:
a)        /boot/grub目录下文件:
-rw-r--r-- device.map <==grub 的装置对应文件
-rw-r--r-- e2fs_stage1_5 <==ext2/ext3 档案系统定义文件
-rw-r--r-- fat_stage1_5 <==FAT 档案系统定义文件
-rw-r--r-- ffs_stage1_5 <==FFS 档案系统定义文件
-rw------- grub.conf <==grub 在Red Hat 的配置文件
-rw-r--r-- iso9660_stage1_5 <==光驱档案系统定义文件
-rw-r--r-- jfs_stage1_5 <==jfs 档案系统定义文件
lrwxrwxrwx menu.lst -> ./grub.conf <==menu.lst 才是配置文件
-rw-r--r-- minix_stage1_5 <==minix 档案系统定义文件
-rw-r--r-- reiserfs_stage1_5 <==reiserfs 档案系统定义文件
-rw-r--r-- splash.xpm.gz <==开机时在grub 底下的背景图示
-rw-r--r-- stage1 <==引导程序第一阶段的相关说明
-rw-r--r-- stage2 <==引导程序第二阶段的相关说明
-rw-r--r-- ufs2_stage1_5 <==UFS的档案系统定义文件
-rw-r--r-- vstafs_stage1_5 <==vstafs 档案系统定义文件
-rw-r--r-- xfs_stage1_5 <==xfs 档案系统定义文件
menu.lst有时候也叫grub.conf,但是/boot/grub/下会有一个名叫menu.lst的符号链接指向它。它是grub引导系统的配置文件。
文件基本选项:
default 0:grub的默认启动项
timeout 5: 指定一个超时值,单位为秒,若用户在grub等待的超时时间范围内没有任何操作,则启动默认项
hidemenu: 开机时是否显示多选项菜单,若被设置则启动的时候默认不显示选项菜单,否则grub启动时自动显示选项菜单
color white/blue: 指定grub菜单的默认颜色
password --md5 $1$etSG6$LlxT8irAfAv5vYQn6tZUw1: 指定一个密码,启用grub的密码保护,这个命令需要放置在title下第一行。为安全起见,一般使用md5值,这个值可以使用grub-md5-crypt或者在grub shell中使用md5crypt生成,也可以直接使用字母或者数字。当要修改加密的启动项时,需要按p键,然后输入密码。需要注意的是为了放置点击e,进入编辑模式,然后删除密码字段,再按下b启动系统,这时可以将密码设置设置在整体上,而不是放置在某一个title下,相对应的title下增加一行lock <==多了死锁的功能
产生MD5密码命令示例如
#grub-md5-crypt
Password: <==输入密码
Retype password: <==再输入一次
$1$kvlI0/$byrbNgkt/.REKPQdfg287. <==这就是产生的md5 密码!
一个启动Linux的菜单项
title Linux*:指定此菜单项的名称,既在grub列表里的名称
root  (hd0,0): 指定启动分区,注意,编号从0开始:比如第一块硬盘的第一个分区应该是(hd0,0)。启动分区的编号可以使用fdisk -l查询,但是需要root权限
kernel /boot/vmlinuz-2.6.20-16-generic: 系统内核
root=UUID=3f784cd9-516f-4808-a601-b19356f6bdea ro quiet splash locale=zh_CN vga=0x318:
指定启动的内核的绝对路径和名称,后边跟参数,一般来说root参数就是你的根文件系统,一定要有的,可以像范例中使用 uuit表示,也可以直接使用/dev/sda2或者/dev/hda1这样的表示。其实有root和kernel两行就可以启动linux了
initrd  /boot/initrd.img-2.6.20-16-generic: 指定系统启动访问真正的根文件系统前,访问的ramdisk映象
savedefault: 如果选择了这个启动项,那么下次启动时就用此项作为默认项. 在前面设置为default saved时有效
Linux kernel常用的参数
root:根文件系统的位置。
ro:可读写,当启动分区是JFS等格式时需要使用此参数使得系统可以在启动是存放日志
quiet:安静模式,不显示核心检测的信息。
splash:显示徽标。
locale:指定locale
vga:指定终端的显示模式。要调整tty1 ~ tty6 终端机的分辨率呢参考下面表格(此为十进制数值):彩度\分辨率bit
640x480         800x600         1024x768         1280x1024
256         769                 771                 773                 775 8 bit
32768         784                 787                 790                 793 15 bit
65536         785                 788                 791                 794 16 bit
16.8M         786                 789                 792                 795 32 bit
b)        启动项的操作
对于多个启动项,可以选择启动项后,点击e进入编辑状态,完成后可以是点击b按键进行引导。万一/boot/grub/menu.lst 设定错误,或者是因为安装的缘故,或者是因为核心档案的缘故,导致无法顺利开机时,记得啊,可以在grub 的选单部分, 使用grub shell 的方式去查询(find) 或者是直接指定核心档案,就能够开机。
c)        救援模式:
当系统连单用户模式都无法进入时或出现GRUB命令行也不能解决的引导问题,我们就需要使用Linux救援模式来进行故障排除了。步骤如下:
1、将Linux安装光盘放入光驱,F2进入BIOS设置为光盘引导,F10保存退出,当Linux安装画面出现后,在“boot:”提示符后输入“linux rescue”回车进入救援模式。(F5键查看模式详细信息)
2、系统会检测硬件,引导光盘上的Linux环境,提示选择救援模式下使用的语言,选择英文,中文为乱码;键盘设置用默认的“us”就好;网络设置暂不用。
3、接下来系统将试图查找根分区。默认在救援模式,硬盘的根分区将挂载到光盘Linux环境的/mnt/sysimage目录下,默认选项“continue”表示挂载权限为读写; “Read-only”为只读,如果出现检测失败可以选择“skip”跳过。此处,因为要对系统进行修复,所以需要有读写权限,一般选择默认选项 “continue”。进入下一步后,系统提示执行“chroot /mnt/sysimage”命令,可以将根目录挂载到我们硬盘系统的根目录中去。
4、修改引导配置文件vim /boot/grub/grub.conf,输入grub命令可以修复引导程序
grub> root (hd0,0) 和title下的root一致
grub>setup (hd0) 真正的修复
grub>quit 退出
案例一:双系统启动修复
当我们安装双系统环境,先安装Linux再安装Windows;或者已经安装好双系统环境的Windows损坏,在重新安装Windows后,保存 GRUB的MBR(Master Boot Record,主引导记录)会被Windows系统的自举程序NTLDR所覆盖,造成Linux系统无法引导。
1、如果要恢复双系统引导,首先用上述方法进入救援模式,执行chroot命令如下:
sh-3.1# chroot /mnt/sysimage
2、将根目录切换到硬盘系统的根目录中,然后执行grub-install命令重新安装GRUB:
sh-3.1# grub-install /dev/hda
“/dev/hda”为硬盘名称,如使用SCSI硬盘或Linux安装在第二块IDE硬盘,此项设置要做相应调整。
3、然后依次执行exit命令,退出chroot模式及救援模式(执行两次exit命令):
sh-3.1# exit
sh-3.1# exit
系统重启后,将恢复GRUB引导的双系统启动。
案例二:系统配置文件丢失修复
如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。
1、有备份文件的恢复办法
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
sh-3.1# chroot /mnt/sysimage
sh-3.1# cp /etc/inittab.bak /etc/inittab
2、没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包(即便文件丢失,因为存在RPM数据库,一样可以查找到结果):
sh-3.1# chroot /mnt/sysimage
sh-3.1# rpm -qf /etc/inittab
initscripts-8.45.3-1
退出chroot模式:
sh-3.1# exit
挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下):
sh-3.1# mount /dev/hdc /mnt/source
Fedora系统的RPM包存放在光盘Fedora/RPMS目录下,其他Linux存放位置大同小异,这里不一一列举;另外,因为要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
sh-3.1# rpm -ivh --replacepkgs --root /mnt/sysimage /mnt/source/Fedora/RPMS/ initscripts-8.45.3-1.i386.rpm
其中的rpm命令选项“--replacepkgs”表示覆盖安装,执行完成后,即已经恢复了此文件。如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
sh-3.1# rpm2cpio /mnt/source/Fedora/RPMS/initscripts-8.45.3-1.i386.rpm
| cpio -idv ./etc/inittab
sh-3.1# cp etc/inittab /mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的绝对路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可。
d)        inittab配置文件错误(/etc/inittab)
这个文件设定错误导致的无法开机!根据开机流程,我们知道runlevel 0~6 都会读取/etc/inittab文件, 因此你使用单用户模式也是要读取/etc/inittab 来进行开机的。这时是无法进入单人维护模式的,那就需要告诉核心不要执行init ,改使用bash,从而略过init,操作同样在开机进入grub 后,同样在grub edit 的情况下这样做:
grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet init=/bin/bash
因为我们指定了核心呼叫的第一支程序(init) 变成/bin/bash,因此/sbin/init 就不会被执行。又根据开机流程的说明,我们知道此时虽然可以利用root 取得bash 来工作,但此时(1)除了根目录外,其它的目录都没有被挂载; (2)根目录被挂载成为只读状态。因此我们还需要进行一些动作才行!如下所示:

仅下达两个指令,『mount -o remount,rw / 』用途是将根目录重新挂载成为可写, 至于『mount -a 』则是参考/etc/fstab 的内容重新挂载档案系统!此时你又可以开机进行救援的工作了! 只是救援完毕后,你得要使用『reboot 』重新开机一次
e)如果grub.conf文件损坏,不能正常启动系统,启动时进入grub提示状态:
注意:以下grub环境可以使用Tab键补全哟!
grub>
3.  设置grub的根设备为linux内核所在分区,因为我的/boot分区安装在第一块硬盘的第一个分区,所以设置为(hd0,0),注意这里是不区分IDC硬盘与SCSI硬盘的!
grub> root (hd0,0)
4.  设置内核参数,加载内核文件,因为我是安装的独立的/boot分区,如果/boot分区是放在/分区下面,则内核文件要指定为/boot/vmlinuz-verstion!
grub>kernel /vmlinuz-2.6.18-53.el5PAE ro root=/dev/VolGroup00/LogVol00 rhgb quiet
5.  加载内核镜像文件
grub> initrd /initrd-2.6.18-53.el5PAE.img
6.  引导系统
grub>boot
7.  进入系统后,修复或者创建新的/boot/grub/grub.conf文件,确保系统下次能够正常启动;
8.如果你有光盘,还有另外一种修复方法,即进入linux rescue模式去修复grub.conf文件。
a) 光盘引导,进入linux rescue模式
boot: linux rescue
b) 根目录切换
sh-3.1#chroot /mnt/sysimage
c) 现在就可以修复或者重建grub.conf文件啦
sh-3.1# vi /boot/grub/grub.conf


TAG:

 

评分:0

我来说两句

Open Toolbar