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

linux基础(十一)--系统初始化的简谈

2011-05-11 16:41 393 查看
我们在深入学习linux之前呢首先要了解其的引导加载过程,这样我们就可以在判断一些在系统初始化过程的出现问题的来源,并及时做出处理。
这个过程大概分为【开机】——【BIOS】(CMOS)——【grub或者其他引导程序】——【kernel boot】(initrd文件)——【init『init回调用rc.sysinit和rc等』】——【tty】——【shell】——【登录】
首先主机有一个加电自检的过程,一般来讲这个过程是我们没有办法干预的,要是这个环节出了问题那就是硬件的问题了BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等 通常来讲,Linux 都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。
由于MBR最先被读取一般都是存放在硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,存放了预启动信息、分区表信息。系统找到BIOS所指定的硬盘的MBR后,就开始家在引导了。当 MBR 被加载到 RAM 中之后,BIOS 就会将控制权交给 MBR。就是Boot Loader那就是lilo或者grub了。

2、启动GRUB/LILO
Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。
Boot Loader一般用到的有Grub和Lilo。
GRUB和LILO都是引导加载程序,它们会引导操作系统。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(即MBR: master boot record)。在单一的 MBR 中只能存储一个操作系统的引导记录
GRUB 与 LILO 的比较
所有引导加载程序都以类似的方式工作,满足共同的目的。不过,LILO 和 GRUB 之间有很多不同之处:
● LILO 没有交互式命令界面,而 GRUB 拥有。
● LILO 不支持网络引导,而 GRUB 支持。
● LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件,必须将 LILO 第一阶段引导加载程序重写到 MBR。相对于 GRUB,这是一个更为危险的选择,因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB,如果配置文件配置错误,则只是默认转到 GRUB 命令行界面。
我们以Grub为例来讲解。系统读取内存中的grub配置信息(一般为menu.lst),并依照此配置信息来启动不同的操作系统。 grub的引导分为两个阶段:第一阶段的引导主要是为引导第二阶段做铺垫,准确来说还有个1.5阶段作用是为了grub识别文件系统类别的grub的存放位置:/boot/grub/grub.conf在配置文件中,可以修改启动项和一些信息 其中default:定义默认启动 项,timeout:定义默认的超时时间,splashimage:用于定义背景图片,hiddenmenu:用于隐藏启动项,title:用于定义启动项及其参数的


当grub引导完成以后就开始加载内核 当内核映像被加载到内存后,内核阶段就开始了。 内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或bzImage(较大的压缩映像,大于512KB),它是自动解压缩的。
在内核 的加载过程中还需要个inintrd这个驱动加载程序,一般这个程序就像一个小linux程序主要是是为了引导真正的linux内核做铺垫的加载额外的驱动程序
然后开始执行init进程(/sbin/init)
init进程是所有进程的起点,内核在完成内核引导后,即在本线程(进程)空间内加载init程序,它的进程号为1。init进程是所有进程的发起者和控制者。因为在任何基于Unix的系统(比如Linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之而垮掉了。
init进程有两个作用:
● 扮演终结父进程的角色:所有的孤儿进程都会被init进程接管。快速执行一下ps -af 命令,可以列出许多父进程ID(Parent Process ID,PPID)为1的进程来。
● 进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理,这个作用由/etc/inittab文件定义的。 内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
通过/etc/inittab文件进行初始化
etc/inittab主要定义一下内容:包括1,默认运行级别2,执行系统初始化脚本,完成系统初始化3执行指定运行级别下的每一个启动脚本 4,捕获键盘序列(设定特别快捷键ctrl+alt+del功能)5设定电源故障时执行的脚本
6,设定要启动的虚拟控制台/dev/tty1-6 7 当运行级别为5时做图形初始化的脚本。
iniLinux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
对于RedHat来说,按以下顺序执行:
a、执行/etc/rc.d/rc.sysinit(由init执行的第一个脚本)
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc、把root文件系统输入到mtab、使用系统为装入模块做准备、查找模块的相关文件、检查文件系统,以进行必要的修复、加载所有其他文件系统、清除几个/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin、删除UUCP的lock文件、删除过时的子系统文件、删除过时的pid文件、设置系统时钟、打开交换、初始化串行端口、装入模块等等。可以到/etc/rc.d中查看一下rc.sysinit文件。
b、执行/etc/rc.d/rcX.d[KS]
首先终止K开头的服务(用来关闭一个服务),然后启动S开头的服务(用来启动一个服务);对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法上rcX.d, 其中X就是代表运行级别的数字。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接。链接的名称在K与S后有一个数字,表示执行顺序,数字小的先执行如K01tog-pegasus 、 S00microcode_ctl。对以K开头的脚本执行时系统会传递stop参数,而S开头的脚本系统会传递start参数。
c、执行/etc/rc.d/rc.local
Redhat中运行模式2,3,5都把/etc/rc.d/rc.local作为初始化脚本中的最后一个文件,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登陆之前执行的命令。
你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
6、执行/bin/login
login程序会提示使用者需输入帐号与密码,接着编码并确认密码的正确性,若二者相合,则为使用者进行初始化环境,并将控制权交给shell,即用户登录。

linux的启动过程有个大概的认识后我们就该考虑下当出现故障时找原因了:当我们的grub损坏时我们就应该修复下使用grub命令,相当于我们windows中使用gost基本相似,grub>boot (hd0,0) 指定boot的MBR引导分区grub>find / 连键入两个tab键这时会显示目录下文件信息grub>kernel /vmlinuz-version 用于指定内核grub>initrd /initrd-version.img 指定initrd引导的grub>boot 重新引导
或者使用命令直接修复
grub -install --root-directory=内核挂载点 /dev/hda内核的挂载点也是有讲究的:当我们的boot和跟目录是单独分区的话就不用写全路径,当没有单独分区时就需要写上全路径的
上面我们提到过linux也是有运行级别的,其中1级别是单用户模式我们在在忘记linux的密码时就可以进去该模式进行修改了方法:在开机运行时们进去内核启动项里输入e开始编辑选择对应的内核输入S然后按enter键确认输入b引导这时我们就可以不用输入密码登陆了,这时有人就会想这样虽然方面了但是那岂不是任何可以接触到我主机的人都可以进去该级别下修改root密码了这也太不安全了吧,不用担心我们也有安全机制的,可以给grub加密码让用户输入e修改时必须输入p后完成密码方可进去修改那岂不是很好的吗?
使用grub-md5-crypy命令使用的MD5加码后的密码 编辑/boot/grub/grub.conf
同时passwd放置的位置不同所起的作用也不同

放在title上面:password --md5
给grub加密码
放在title下面:password --md5
给内核加密码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息