- 论坛徽章:
- 0
|
System Initialization And Service
01/25/09
by:yifengzhang21c
学习linux维护,有必要了解linux的开机流程,这对排除启动故障有很大的帮助,也是RHCE/RHCT考试Troubleshooting部分必考科目.
基本概括下redhat linux的启动流程:
一.BIOS (basic input output system)Initialization,这部分主要做以下三件事:
外设监测(peripheral detected).做POST(power on self test)动作,该动作主要用于进行自我检测.
设置开机设备,如我们通常在BIOS中设置boot选项,那么系统是打算先从cdrom还是floop还是disk启动.
读取开机设备的first sector.一旦读取成功,则BIOS任务完成,接下来任务转交boot loader.
二.Bootloder Components,这主要就是介绍grub(the GRand Unified Bootloader)
那么bootloader通常可以被安装在MBR(Master Boot Record)或者分区的boot sector.
![]()
MBR大小为446+64+2=512bytes,其中446bytes用来安装IPL(inital program loader),64bytes用来记录分区表信息,每个分区表信息占用16bytes,64/16=4.所以一块硬盘最多可以划分4个主分区,超过4个分区时,将会把第四个主分区转变为扩展分区.(关于分区的详细信息,将在文件系统管理和系统安装部分详细讨论.)
在redhat下IPL使用的是grub.这个时候boot loader将进行两部分工作.
运行存储在MBR或者boot sector下的grub程序.
通过grub,选择要加载的引导分区.
这部分就是我们通常看到的,开机后的grub画面
![]()
让我们选择是加载redhat还是windows 2003 SP1的kernel.下面是当我们选择启动RHEL和WIN2k3的流程.
![]()
这个为grub加载RHEL的流程
下面这个为grub加载win2k3的流程
![]()
接下来,介绍grub引导装载程序的配置文件/boot/grub/grub.conf.
[root@server ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VG0/root
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-53.el5)
root (hd0,0)
# kernel /vmlinuz-2.6.18-53.el5 ro root=/dev/VG0/root rhgb quiet
kernel /vmlinuz-2.6.18-53.el5 ro root=/dev/VG0/root quiet
initrd /initrd-2.6.18-53.el5.img
这里以#号开头的都被当做注释部分.
default指令定义从哪个title启动,如果你有多个title,那么第一个title
为0,第二个为1,依次类推.当设为0,表示默认以第一个title为启动对象.
timeout=5指令,当开机进入grub引导画面时,5s内没有选择,则自动启动default预设的系统.
splashimage指令定义grub的开机画面.如果你看腻了RHEL的背景,那换换你老婆的照片也不错哦!这样以后当她埋怨你时间都用在电脑上,而不抽时间陪她的时候你就可以告诉她,其实你的电脑里都是她,从来都是形影不离哈哈.我说笑.
hiddenmenu指令,如果有设定过,则必须在开机时键入任意一个键后才出现开机
选单.(即会隐藏开机选单)
title指令为选单标题名称,如RHEL或者win2k3.
root (hd0,0)即指hda0
kernel /vmlinuz-2.6.18-53.el5 ro root=/dev/VG0/root rhgb quiet
这里的
kernel指定kenerl image的位置
ro代表readonly,就是说将kernel以只读的形式载入
rhgb代表redhat graphical boot,引导画面以图形方式进入
quiet代表不显示错误信息
grub的另一个优点是安全,它可以在开机时设置密码,这样就可以防止别人以single mode登录,绕过root password进入系统,对系统造成威胁.
实现方法:
在/boot/grub/grub.conf文件中添加password指令,
格式:password 密码
e.g.
password Pamela
保存退出,那么再进入grub界面,想要进行edit操作,就需要提供password了.
尽管grub.conf文件的权限为600,但是为了安全起见,还是对password字段进行加密好,我们使用grub-md5-crypt进行MD5加密.
在command-line typing
[root@server ~]# grub-md5-crypt
Password:
Retype password:
$1$WhR4L$bhJWrpyOed/BB.IEQzV5H0
经过两次密码确认后,生成了一个字符序列.这个字符序列以$1$开头,表示有设定该密码,后面字段为加密序列.
下面再举个例子,我把我的grub引导画面设置为图片Pamela.过程如下:
[root@server tmp]# ls
Pamela.jpg
[root@server tmp]# convert Pamela.jpg -resize 640x480 -colors 14 Pamela.xpm
[root@server tmp]# ls
Pamela.jpg Pamela.xpm
[root@server tmp]# gzip Pamela.xpm
[root@server tmp]# ls
Pamela.jpg Pamela.xpm.gz
[root@server tmp]# cp Pamela.xpm.gz /boot/grub/
[root@server tmp]# vi /boot/grub/grub.conf
修改splashimage=(hd0,0)/grub/Pamela.xpm.gz保存退出,重启即可.
(还要补充一点:我在测试过程中,持续花屏,估计是colors14渲染问题,谁解决的回个帖子啊,谢谢.)
如果由于某种原因你的MBR损坏,那么你有必要手动安装grub,可以使用命令:
/sbin/grub-install boot-device
来进行安装.
如果这种方式安装不了,那么也可以使用这种方式:
#grub
#root (hd0,0)
#setup (hd0)
#quit
这两种方法都可以作为恢复MBR中的grub损坏问题的.
典型例子,当你装过双系统后,重新安装windows的时候,windows将会重写MBR中的信息,这个时候将导致windows可以正常启动,原有linux无法正常启动,可以通过上面的方式,使用RHEL disk1进入linux rescue mode修复.
三.Kernel Initialization
kernel启动时的只能主要包括:
设备检测
设备驱动初始化
挂载根文件系统为只读模式
加载init进程
详细关于kernel的介绍,将作为单独学习.
四.Init Initialization
这个过程中主要会涉及以下几个文件:
/etc/inittab
/etc/rc.d/rc.sysinit
/etc/rc.d/rc
/etc/rc.d/rc?.d
/etc/rc.d/rc.local
X Display Manager if appropriate
通过命令pstree可以发现,init是所有进程的父进程(init is the parent of all processes).因为它是第一个启动的进程,所以它的pid为1.如:
[root@server ~]# pstree
init─┬─acpid
├─anacron
├─atd
├─auditd─┬─python
│ └─{auditd}
├─automount───4*[{automount}]
├─avahi-daemon───avahi-daemon
├─crond
├─cupsd
├─dbus-daemon───{dbus-daemon}
├─events/0
init的配置文件,为/etc/inittab,它包括了以下内容:
系统启动级别
系统初始化脚本
运行级对应的脚本目录
组合键的设定
UPS断电与恢复脚本
常用tty虚拟终端
下面看看/etc/inittab文件内容,/etc/inittab同样是以#号开头的行为注释行.那么我通过如下命令过滤掉所有以#号开头的行,就是init实际要执行的语句.
[root@server ~]# awk '$0 !~ /^#/' /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
参数id:3:initdefault:代表run level为3的是默认启动级别.如果要以图形方式登录,将3修改为5即可.注释中列出了linux运行级的描述,内容如下:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
千万不要将默认的run level设定为0或者是6.不然,就舒服了.
参数si::sysinit:/etc/rc.d/rc.sysinit指定了系统的启动脚本,也就是说/etc/rc.d/rc.sysinit脚本控制着linux系统的启动行为,包括了N多系统启动时的定义.该脚本是使用bash写的,有兴趣的朋友可以看下.
参数l3:3:wait:/etc/rc.d/rc 3将根据上面的id:3:initdefault:所设置的值来读取对应的目录.如果值设置为3,那么/etc/rc.d/rc这个script将3作为参数读取,并启动/etc/rc.d/rc3.d下需要启动的脚本.
那么如何判断/etc/rc.d/rc3.d下的脚本在run level3时是否需要启动呢?我们来看下这个目录下的scripts.
[root@server rc3.d]# ls
K02avahi-dnsconfd K89rdisc S22messagebus
K02dhcdbd K91capi S25bluetooth
K02NetworkManager K99readahead_later S25netfs
K02NetworkManagerDispatcher S00microcode_ctl S25pcscd
K05conman S02lvm2-monitor S26apmd
K05saslauthd S03sysstat S26hidd
K10psacct S04readahead_early S28autofs
那么这里面的文件中,包括K和S打头的文件.所谓K就是指kill,S就是指start.那么start就是在系统启动时需要运行的脚本.kill的就是不需要运行的脚本.通常执行顺序为,先关闭不需要启动的脚本,即以K开头的脚本,再启动S开头的脚本.
同理,如果run level为5,那么开机的时候将运行/etc/rc.d/rc5.d/下的scripts.
参数ca::ctrlaltdel:/sbin/shutdown -t3 -r now用来设定快捷键.该指令表示当同时按住ctrl+alt+del时将运行/sbin/shutdown -t3 -r now的指令.也就是重启系统.如果你不喜欢它的设置,那就#掉它吧~~linux最大的优点就是可以自定义很多东西,只要你想.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
这两条指令是针对UPS power的,就是不断电系统.那么当断电情况来临,UPS会持续供电短暂时间,直到UPS电量殆尽,这个时候UPS会发送信号给linux主机,linux主机将根据这个设定执行应急动作.由于电压不稳造成的断电,系统将执行shutdown -c来取关机.
指令1:2345:respawn:/sbin/mingetty tty1是用于设置终端.通过指令/sbin/mingetty启动tty1~6虚拟控制台.
指令x:5:respawn:/etc/X11/prefdm -nodaemon表示,如果run level为5,就是初始化X windows的环境.
在command-line中改变当前运行级的命令为init new_runlevel
查看当前运行级的命令为/sbin/runlevel
![]()
这个图说明了整个运行过程.
/etc/rc.d/rc.sysinit文件是开机的启动脚本,主要包括如下内容.
激活udev和selinux
设置/etc/sysctl.conf下的kernel选项
设置系统时钟
加载键盘
启用swap分区
设置主机名称
检查并重新挂载文件系统
激活RAID和LVM设备
启用磁盘配额
检查和挂载文件系统
清理临时文件
等
/etc/rc.d/rc文件用于判断run level属于哪个级别.并启动和停用相应目录下的脚本,如启动级为5,则执行/etc/rc.d/rc5.d/*全部文件.
/etc/rc.d/init.d存放着所有system V的启动脚本,/etc/rc.d/rc?.d/下的脚本其实都是/etc/rc.d/init.d/下脚本的链接.
/etc/rc.d/rc.local在系统启动后要执行的脚本,那么你打算在开机时执行的额外任务,都可以写到这个文件里.这是system V初始化的最后一步.
控制服务的几个常用命令:
system-config-services图形界面的配置工具,超级友好.
ntsysv命令行的图形配置工具,界面友好些
chkconfig命令行工具,这个功能强大些,我喜欢
service命令行工具,但是建议不要使用,因为别的版本linux不一定支持,我只知道suse和redhat都支持这个命令.最好使用绝对路径的方式来访问,如/etc/rc.d/init.d/servicename start/stop.......
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/27173/showart_471051.html |
|