rhel6之五:开机流程分析、进程、故障排错

chengdu

贡献于2013-07-08

字数:9857 关键词: RedHat

一:RHEL6的开机流程分析: 开机――是件很简单的事情,只要按下电源开关,然后系统就会自然启动,很多人认为没有什么需要学习的。其实不然,如果系统没有什么问题,可以正常登陆的时候,当然开机很简单。但更多的时候,我们需要知道当机子不能正常开机的如何解决,这才是我们学习的目的。 那么我们就来分析一下Linux的开机流程系统开机的过程可以汇整成下面的流程: 1.加载BIOS的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备; 2.读取并执行第一个开机设备内MBR的boot Loader(grub等程序); 3.依据boot loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序; 4.内核启动init 5.系统初始化:(根据/etc/init/rcS.conf文件中的记录 “exec /etc/rc.d/rc.sysinit”执行rc.sysinit系统初始化脚本) 6.init找到/etc/inittab文件,确定默认的运行级别(X) (根据/etc/init/rcS.conf文件中的记录“exec telinit $runlevel”) 7.触发相应的runlevel事件(根据/etc/init/rc.conf文件中的记录“exec /etc/rc.d/rc $RUNLEVEL)” 8.开始运行/etc/rc.d/rc,传入参数X 9./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本 10./etc/rcX.d/中的脚本按事先设定的优先级依次启动 11.最后执行/etc/rc.d/rc.local 12.加载终端或X-Window接口 BIOS:开机自检与MBR 要启动系统首先就得去加载BIOS(Basic Input Output System),并通过BIOS程序去加载CMOS的信息,并且由CMOS内的设定值取得主机的各项硬件配置信息(如开机设备的搜寻顺序、硬盘的大小与类型、 系统时间、各周边总线的是否启动Plug and Play (PnP, 即插即用设备)、等等)。在取得这些信息后,BIOS还会进行开机自检(Power-on Self Test, POST)。 然后开始执行硬件检测的初始化,并设定PnP设备,之后再定义出可开机的设备顺序, 接下来就会开始进行开机设备的数据读取了(MBR相关的任务开始)。 我们还需要一个开机管理程序来处理内核文件的加载问题,这个开机管理程序就被称为Boot Loader。这个Boot Loader程序安装在开机设备的第一个扇区(sector)内,也就是MBR (Master Boot Record,主要启动记录区,第一个扇区的512字节)。 Boot Loader最主要功能是加载内核到主存储器中去执行,由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader。 由boot loader的管理而开始读取内核文件后,接下来,Linux 就会将内核解压缩到主存储器当中, 并且利用内核的功能,开始测试与驱动各个周边设备,包括储存设备、CPU、网卡、声卡等等。 此时 Linux 内核会以自己的功能重新检测一次硬件,内核会被放置到 /boot 里面,并且取名为 /boot/vmlinuz init及配置文件 /etc/inittab 与 runlevel 在内核加载完毕、进行完硬件检测与驱动程序加载后,此时主机硬件已经准备就绪了,这时候内核会启动第一个程序,那就是 /sbin/init;/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。 而所有的动作都会通过 init的配置文件/etc/inittab来规划,而inittab 内还有一个很重要的设定内容,那就是默认的 runlevel (开机运行级别)。 Linux就是通过设定runlevel来规定系统使用不同的服务来启动,让Linux的使用环境不同。这个inittab文件里面的支持级别(RHEL6系统里面的,和以前的其它版本有很大的差别) 现在我们来看一看/etc/inittab文件中内容: #vim /etc/inittab 部分内容解释如下: 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 (重新启动) 0, 4, 6 不是关机、重新启动就是系统保留的,所以不能将预设的run level设定为这三个值。 RHEL6系统上的这个文件和以前的版本有很大的差别,目前这个文件只能设置运行级别,其它的相关配置文件,在此文件中已经做了说明如: System initialization is started by /etc/init/rcS.conf Individual runlevels are started by /etc/init/rc.conf Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,with configuration in /etc/sysconfig/init. 更多的内容,可以到/etc/init/目录中查看;红帽已经使用新的Upstart启动服务来替换以前的init。在RHEL6的版本中,我们可以把/etc/init/这个目录里面的内容,看成是以前/etc/inittab这个文件里的拆分。 下面是RHEL6上面Upstart大致的一个启动过程: 1.内核启动init 2.系统初始化:(根据/etc/init/rcS.conf文件中的记录 “exec /etc/rc.d/rc.sysinit”执行rc.sysinit系统初始化脚本) 3.init找到/etc/inittab文件,确定默认的运行级别(X) (根据/etc/init/rcS.conf文件中的记录“exec telinit $runlevel”) 4.触发相应的runlevel事件(根据/etc/init/rc.conf文件中的记录“exec /etc/rc.d/rc $RUNLEVEL)” 5.开始运行/etc/rc.d/rc,传入参数X 6./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本 7./etc/rcX.d/中的脚本按事先设定的优先级依次启动 8.最后执行/etc/rc.d/rc.local 9.加载终端或X-Window接口 /etc/rc.sysinit 这个文件干了哪些工作? #vim /etc/rc.sysinit 1、获得网络环境 2、挂载设备 3、开机启动画面Plymouth(取替了过往的 RHGB) 4、判断是否启用SELinux 5、显示于开机过程中的欢迎画面 6、初始化硬件 7、用户自定义模块的加载 8、配置内核的参数 9、设置主机名 10、同步存储器 11、设备映射器及相关的初始化 12、初始化软件磁盘阵列(RAID) 13、初始化 LVM 的文件系统功能 14、检验磁盘文件系统(fsck) 15、磁盘配额(quota) 16、重新以可读写模式挂载系统磁盘 17、更新quota(非必要) 18、启动系统虚拟随机数生成器 19、配置机器(非必要) 20、清除开机过程当中的临时文件 21、创建ICE目录 22、启动交换分区(swap) 23、将开机信息写入/var/log/dmesg文件中 这个文件里面的许多预设配置文件在/etc/sysconfig/这个目录当中,要了解更多的系统启动信息,可以到/var/log/dmesg文件中查看,也可以用dmesg命令来查看。 系统服务的启动: 经过 /etc/rc.sysinit 的系统模块与相关硬件信息的初始化后,RHEL6系统应该已经能顺利工作了。但还需要启动一些为我们提供服务的服务。这个时候,依据在/etc/inittab里面run level的设定值,就可以来决定启动的服务项目了。可以打开/etc/rc这个文件来研究 以运行级别3来说明 #ls /etc/rc3.d/ 在这个目录下的文件主要具有2个特点: 1、全部以Sxx或Kxx(xx为数字)开头 2、全部是链接文件,链接到/etc/init.d/ 现在来说明一下这些的目的 S表示启动服务, K表示停止服务,后面的数字是启动的先后顺序 用户自定义开机启动脚本 上面讲到的都是一些系统服务,Linux系统可以安装其它的软件来提供服务,若要自己安装的服务也要在开机启动,就可以用 /etc/rc.local 来完成。这就是我们要讲的用户自定义开机启动脚本。我们只要把想启动的脚本写到这个文件中,开机就能启动了,注意一点,写在这里面的脚本要使用绝对路径。 加载终端或X-Window接口 在完成了系统所有服务的启动后,接下来Linux就会启动终端或者是X Window来等待使用者登陆了! 在/etc/init/start-ttys.conf中我们可以看到有6个纯文本终端(tty[1-6]) 运行级别的切换 如果我们切换run level只需要停止与启动一些服务就OK了,那么要如何来实现,其它很简单,用init n(数字)来切换。 比如说,我们要把运行级别5换成3,我们就用init 3来实现,切换的时候系统都做了哪些事呢? 先对比 /etc/rc3.d/ 及 /etc/rc5.d 内的 K 与 S 开头的文件; 对比/etc/rc3.d/ 内有多余的 K 开头文件则予以关闭; 对比/etc/rc3.d/ 内有多余的 S 开头文件则予以启动; 两个 run level 都存在的服务就不会被关闭; 二、进程与计划任务管理: 在linux系统中,每个程序启动后可以创建一个或多个进程,例如提供Web服务的httpd程序,当有大量用户同时访问web页面时,httpd程序可能会创建多个进程来提供服务。 查看进程: ps 命令: 用途:查看静态的进程统计信息 格式:ps aux 或 ps -elf ps命令结合“aux”选项使用时,将显示系统中所有的进程信息 ps命令结合“-elf”选项使用时,将以长格式显示系统中所有的进程信息,包含更丰富的内容(其中PPID列表示进程的父进程的PID号)。 #ps aux USER:启动该进程的用户账号的名称 PID:进程号,在当前系统中是唯一的 TTY:表明该进程在哪个终端上运行,?表示未知或不需要终端。 STAT:进程的当前的状态如:S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程),对于僵死进程应该予以手动终止 START:启动进程的时间 TIME:该进程占用的CPU时间 COMMAND:启动该进程的命令的名称 %CPU:CPU占用百分比 %MEM:内存占用百分比 VSZ:占用虚拟内存(swap)的大小 RSS:占用物理内存的大小 top命令: 用途:以动态刷新的方式显示进程的状态信息,默认情况下3秒钟刷新一次,在top命令显示的全屏界面中,可以按P键根据CPU占用情况对进程列表进行排序,M根据内存占用情况进行排序,N键根据启动时间进行排序,按h可以获得top的帮助,q键正常 退出top 在top中,还可以结束进程的进行,按k键后在列表上方将出现“PID to kill:”的提示信息,在后边输入指定进程的PID号并回车确认后可结束指定进程的运行。 pgrep命令: 用途:根据特定条件查询进程PID信息 常用命令选项: -l:列出进程的名称;-U:根据进程所属的用户名进行查找;-t:根据进程所在的终端进行查找 Pstree命令: 用途:以树型结构显示各进程间的关系 常用命令选项: -p:列出进程的PID号;-u:列出进程对应的用户名;-a:列出进程对应的完整命令 nice和renice影响调度优先级 进程的“谦让度”是以数字形式给内核的暗示,通过它来表明一个进程在同其他进程竞争CPU时应该如何对侍这个进程,谦让度值越高,优先级越低,谦让度值越低或负值表示优先级越高。“谦让度”的值范围是-20至+19 如今很少通过手工设置进程的优先级。 进程的“谦让度”值可以在创建进程时用nice命令来设置,并可以在执行时使用renice命令进行调整。Nice带一个命令行作为参数,而renice带PID或用户名作为参数可以用ps lax的输出包括父进程ID、谦让度(NI)字段等信息 用nice设置一个将要执行程序的进程的谦让度并查看,如下图: #nice –n 10 cat /dev/zero > /dev/null 用renice命令改变httpd进程的谦让度 #renice –n -5 4920 (4920是cat命令的PID号) 再用ps命令查看: 进程的不同启动方式 前台启动:用户输入命令,直接执行程序 后台启动:在命令行尾加入“&”符号 进程的前后台调度 Ctrl+Z 组合键:将当前进程挂起,即调入后台并停止执行 bg命令:将后台挂起的进程激活 jobs命令:查看处于后台的任务列表 fg命令:将处于后台的进程恢复到前台运行,需指定任务序号 终止进程的运行 Ctrl+C组合键:中断正在执行的命令 Kill:用于终止指定PID号的进程 Killall:用于终止指定名称的所有进程 -9 选项用于强制终止 pkill命令:根据特定条件终止相应的进程 常用命令选项:-U:根据进程所属的用户名终止相应进程;-t:根据进程所在的终端终止相应进程 计划任务管理 at命令: 在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务 服务脚本名称:/etc/init.d/atd 设置格式:at [HH:MM] [yyyy-mm-dd] 如:# at 23:45 at> shutdown -h now at> (按ctrl+d提交任务) 如:#at now +2 hours 两个小时后执行 at>shutdown –h now at> (按ctrl+d提交任务) atq命令:查询当前设置的at任务列表 atrm命令:删除指定任务编号的at任务 格式:atrm 编号 crontab命令:按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务 1、/etc/crontab:系统任务配置文件,维护linux系统所需的任务,一般在系统及程序安装时自动设置,不需要人为地修改 2、/var/spool/cron:用户cron任务配置存放目录,由用户自行设置(使用crontab –e命令)的cron任务将保存在目录“/var/spool/cron”中,文件名与对应的用户账号同名。 系统默认的设置,位于目录:/etc/cron.*/ 管理cron计划任务: 编辑计划任务:crontab -e [-u 用户名] 查看计划任务:crontab -l [-u 用户名] 删除计划任务:crontab -r [-u 用户名] root用户可以管理指定用户的计划任务,普通用户只能管理自己的计划任务 字段 说明 分钟 取值为从0到59之间的任意整数 小时 取值为从0到23之间的任意整数 日期 取值为从1到31之间的任意整数 月份 取值为从1到12之间的任意整数 星期 取值为从0到7之间的任意整数,0或7代表星期日 命令 要执行的命令或程序脚本 时间数值的特殊表示方法 * 表示该范围内的任意时间 , 表示间隔的多个不连续时间点 - 表示一个连续的时间范围 / 指定间隔的时间频率 应用示例 0 17 * * 1-5 周一到周五每天17:00 30 8 * * 1,3,5 每周一、三、五的8点30分 0 8-18/2 * * * 8点到18点之间每隔2小时 0 * */3 * * 每隔3天 三、 故障排错: 1、修恢MBR故障: 故障原因:病毒、木马等造成的破坏;不正确的分区操作、磁盘读写误操作 故障现象:找不到引导程序,启动中断;无法加载操作系统,开机后黑屏 解决思路:应提前作好备份文件;以RHEL6安装光盘引导进入急救模式;从备份文件中恢复 应用示例: 备份MBR扇区数据: 添加一块硬盘或U盘、创建好分区并挂载到一个指定的目录上(如:/data目录) 备份MBR: 模拟MBR被破坏的故障:dd if=/dev/zero of=/dev/sda bs=512 count=1 重启系统后,故障现象如下: 解决方法: RHEL6光盘引导,进入急救模式:将RHEL6系统盘放入光驱,并设置光驱启动,选择下图打勾项以急救模式引导,这里我们选择 Rescue installed system ,RHEL6里有所改动,rhel5是需要输入linux rescue的 其他过程图略,如果是通过网络ftp传输挂载安装文件的,那么这里必须要启动网卡,光驱一类的外接设备则无需开启,这里我是无需开启的,我选择”NO”。 在rescue界面中选择”continue”按钮 这里选择 shell Start shell,这样就进入了急救模式 创建一个挂载点,挂载/dev/sdb1,并用mbr的备份恢复MBR信息,如图所示: 重启系统,一切就正常了。 2、 修复grup引导故障: 故障原因:MBR中的GRUB引导程序遭到破坏;grub.conf文件丢失、引导配置有误 故障现象:系统引导停滞,显示“grub>”提示符 解决思路:进入急救模式,从备份中恢复 grub.conf ;向MBR扇区中重建grub程序 应用示例: 最好先将grub.conf文件备份,以防止grub.conf损坏:如下图所示: 模拟破坏grup.conf文件,如删除grup.conf;重启系统,报错如下图: 解决方法: RHEL6光盘引导,进入急救模式:将RHEL6系统盘放入光驱,并设置光驱启动,选择下图打勾项以急救模式引导。过程略,与MBR修复启动过程类似 进入急救模式命令符后,如果分区表并未被破坏,则急救模式将会找到硬盘中根分区并将其挂载到光盘目录结构中的”/mnt/sysimage”目录中。 执行#chroot / mnt/sysimage命令将目录结构切换到待修复的linux系统中,然后重建grub.conf文件或使用备份恢复grub.conf文件,如下图所示: 重启系统,一切都正常了。 如果是MBR中的引导程序出现损坏,可能在重建了grub.conf文件后仍无法成功启动系统,这时候可以在急救模式的shell环境中重新安装grub 向MBR扇区中重建GRUB程序 sh-3.1# chroot /mnt/sysimage sh-3.1# cd /boot/grub/ sh-3.1# cp grub.conf.bak grub.conf (用备份恢复grub.conf文件) sh-3.1# grub-install /dev/sda 3、 破坏/boot启动目录: /boot目录中存放着与内核有关的引导文件(包括Grub,和kernel文件),若/boot目录被破坏系统将无法加载内核 模拟破坏/boot分区:#rm –fr /boot/* (最好先将grub.conf文件备份) 解决方法: 以急救模式引导系统,过程略。进入急救模式的shell命令符下 执行#chroot / mnt/sysimage命令将目录结构切换到待修复的linux系统中 可以看到/boot上什么也没有 那么,现在需要挂载光盘,来进行恢复;这里需要注意的是在rescue 模式下/dev/sr0 为光盘所在分区媒介,挂载目录至 /media (这里这个目录可自定义); 区别于rhel5 的rescue 光盘存放分区 ;进入光盘的Package目录,如下图所示: 安装内核的rpm包,如下图所示: 安装好后再查看 /boot/ 分区信息,但这里我们未发现 grub目录,这需要再安装grub引导目录,如下图所示: 安装完grub后,查看/boot/grub目录 但还没有grup.conf文件,要么手动创建,若有备份可以直接用备份恢复 强制安装redhat-logos-60.0.14-1.e16.noarch.rpm包,否则rhel6启动时会报找不到rhel6的启动界面 按以上解决方法做完后,/boot启动目录的破坏就解决了,重启系统。第一次修复好系统后默认selinux会对系统进行相关参数的检测,所以修复后第一次启动系统是相当慢的,默认检测完后系统会重新启动,直至到用户登录界面,输入用户名密码登陆即可。 4、修复/etc/fstab文件: /etc/fstab 这个文件,是系统安装时生成的文件,记录系统的磁盘和分区挂载信息,这里需要记住其文件格式才可以恢复,其他的文件包括内核都可以使用安装软件包来实现修复,所以这里该文件在安装好系统后最好做个备份,在破坏时也最好不要rm直接删除,可以通过修改其文件格式和文件名让该文件失效 在rhel5里是指定LABEL来认系统挂载目录,rhel6中改用指定UUID(硬盘的ID号),可防止内核升级后硬盘挂载出错 若fstab文件被删除或误修改,会出现如下错误: 故障现象:启动中提示 “... /etc/fstab: No such file or directory”;系统停滞,无法完成初始化或 解决方法: 以急救模式引导系统,过程略。进入急救模式的shell命令符下;因为fstab文件丢失,系统不知道/ 挂载在什么地方 #chroot /mnt/sysimage 执行fdisk /dev/sda 查看分区情况,如下图所示: 可以看出/dev/sda1是启动分区,/dev/sda2应当就是根分区了 若根分区应用了lvm机制,解决方法如下: 在急救模式的shell环境中扫描逻辑组,激活逻辑卷以便找到根分区设备,然后手动挂载根分区,并重建fstab文件即可,如下图: #vi /part/etc/fstab文件,修改其错误 若根分区就是基本linux分区,没有应用lvm,解决方法:使用fdisk –l /dev/sda查看分区情况,确定根设备分区,然后手动挂载根分区到一个自定义的目录上,重建或修改fstab文件即可 重启系统,第一次修复好系统后默认selinux会对系统进行相关参数的检测,所以修复后第一次启动系统是相当慢的,默认检测完后系统会重新启动,直至到用户登录界面,输入用户名密码登陆即可。 5、修复/etc/inittab文件 模拟故障:删除/etc/inittab文件和/etc/rc.d/rc.sysinit文件: #rm –fr /etc/inittab #rm –fr /etc/rc.d/* 解决方法:以急救模式引导系统,过程略。进入急救模式的shell命令符下 #chroot /mnt/sysimage切换到侍修复的文件系统 Inittab的相关文件是由initscripts-xxxx.rpm软件包提供,如下图所示: 这里 rpm -qf 查询系统文件对应的安装包,rpm –ql initscripts 查询安装包对应生成哪些系统文件,查询后会发现initscripts-xxxx.rpm 生成很多系统关键文件,所以这里不能直接安装该包,需要对该包copy 出来,解压后,然后copy 需要的系统文件即可! 这里copy initscipts-9.03.17-1.el6.i686.rpm 至 /file 目录下,用rpm2cipo 指令通过管道cpio -imd解压该rpm包,解压后,会发现,这个文件内容都是/ 目录下关键的目录文件 6、root用户密码忘记: 解决方法1:以单用户模式登录,重新启动主机,在出现grub时按向上或向下按键,并定位要启动的系统,按e键进入编辑模式 定位到以ketnet开头的一行并安e键,在行尾添加数字1或字母s,就可进入单用模式。 进入单用户模式后,如果RHEL6的selinux开启的话会禁止passwd命令的运行,所以进入单用户模式后在执行passwd更改密码之前必须执行setenforce 0命令禁用selinux功能;然后执行passwd更改密码。最后再启用selinu能功setenforce 1 解决方法2:以急救模式引导系统,进入急救模式的shell下更改root的密码 7、 rpm数据库损坏 故障原因:非正常关机、误删除运行中的程序文件;RPM数据文件被误写或删除 故障现象:不能正常查询rpm包信息;无法安装、升级或卸载软件包等 解决思路:重建RPM数据库rpm --rebuilddb 或 rpm --initdb 模拟故障: 解决方法:

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档