RHCE课程-RH131Linux管理笔记二-Linux系统启动流程

  1. 云栖社区>
  2. 博客>
  3. 正文

RHCE课程-RH131Linux管理笔记二-Linux系统启动流程

技术小美 2017-11-16 15:48:00 浏览1231
展开阅读全文
这节课程是相当重要的。也是RHCE考试上午的考的主要内容,系统排错。只要你看懂了系统的启动流程,排错就基本没有多大问题了。
计算机启动,上电自检检查BIOS就不说了,所有系统都那样。
下面就是LINUX的启动流程: 
1、硬件读取引导扇区 
2、加载LILO或者Grub(一般我们使用的是GRUB,这个是重点) 
3、加载内核(以只读方式挂载) 
4、挂载根文件系统 
5、启动init,一切进程的“祖父” 
6、读取/etc/inittab文件 
7、读取rc.sysinit文件 
8、运行rcX.d下的文件(文件都是init.d下的符号链接) 
其中有一个xinetd的超级进程,调用/etc/xinetd.conf配置文件,从配置文件中知道读/etc/xinetd.d文件,结束后调用Miggetty 
9、读取/etc/rc.d/rc.local 文件
具体步骤在启动的时候大家都能看见滴哈~~~ 
BIOS初始化 
检查外围设备 
检查启动设备 
读区MBR
启动引导工具引导并运行核心,分为两个独立的阶段: 
第一阶段:存放在启动扇区 
第二阶段;/boot目录下的文件
第一阶段即BIOS从启动扇区中读入IPL(初始化程序引导工具)这一过程。因为MBR的空间太小,所以启动引导工具往往还需要从其他地方进一步读入数据,即所谓第二阶段。这通常是一个可以做选择的交互界面。
在Linux中常用的启动引导工具:grub和lilo
在某些时候,WINDOWS支持多系统就需要安装GRUB哈
GRUB:Grand Unified Bootloader 
被广泛地用于替代lilo 
支持在启动时使用命令行模式 
支持md5加密保护 
可以从ext2/ext3、ReiseFS、JFS、FAT、minix及FFS文件系统上启动 
其配置文件为/boot/grub/grub.conf,更改grub.conf即可立时生效 
如果硬盘上的MBR被更动过,可以用/sbin/grub-install /dev/hda来重安装grub
现在我们打开/boot/grub/grub.conf查看一下哈:vim /boot/grub/grub.conf
image
这就是grub.conf的精华
image
我们分析一下这个文件哈: 
# 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/sda2 
#          initrd /initrd-version.img 
#boot=/dev/sda 
default=0    
#default=0表示默认启动第一个系统,如果系统有两个系统是用什么做为分隔符的呢?title就是系统的分隔符,第一个title后面就是第一个系统,用0表示。 
timeout=5 
#timout=5,就是默认在启动选择界面停留的时间,单位是秒。等待5秒自动进入默认操作系统 
splashimage=(hd0,0)/grub/splash.xpm.gz 
#splashimage是grub启动背景画面,如果是自己写grub.conf文件,这个可以不用写。 
hiddenmenu 
title Red Hat Enterprise Linux Server (2.6.18-53.el5) 
#title后面就是系统在启动时候显示的名字 
        root (hd0,0) 
#root 启动文件所在位置 
        kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet 
#kernel 内核所在位置和名字 
        initrd /initrd-2.6.18-53.el5.img 
#initrd内核镜象的名字
grub.conf的范例: 
timeout=10      #等待10秒自动进入默认操作系统 
splashimage=(hd0,0)/grub/splash.xpm.gz #grub启动背景画面 
default=0       #默认进入第一个标题 
title Red Hat Linux (2.4.20-18)   #Red Hat Linux标题 
root (hd0,0)      #根文件系统位置 
kernel  /vmlinuz-2.4.20-18 ro root=LABEL=/ #核心位置与核心加载参数 
initrd  /initrd-2.4.20-18.img   #启动initrd ram盘  
title windows      #另一个操作系统的标题 
rootnoverify (hd0,1)    #操作系统存放在hd0,1上,不要在grub里mount 
chainloader +1     #从hd0,1的第一个扇面启动
大家记一下自己的系统哈,下面我们做个实验,特别是系统版本不一样的更要记住。
把后面三行删掉后保存退出。
image
OK后我们重新启动系统。
image
我们重启后系统停在这里了哈~~~
image
出现刚才的图是正常的,因为我们修改了grub.conf 文件,GRUB找不到启动文件了,所以我们就要手动敲进去
第一步:运行root (hd0,0) (这是/boot所在的分区)
image
第二步:执行kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet (用来指定linux内核)
image
第三步:执行initrd /initrd-2.6.18-53.el5.img(用来指定initrd文件)
image
第四步:执行boot
image
看见红色的REDHAT就证明你的内核加载成功了
image
这就是在启动rc.d的服务了
image
启动正常
image
image
下面我们来点狠的哈,这次我们就要把grub.conf删除掉~~~然后我们重新启动我们的系统哈。
image
image
好了,和刚才一样的,小问题,大家自己动手吧 ,主要想强迫你们记忆下grub.conf的内容
注意:运行root或者find /vmlinuz-2.6.18-53el5(可以使用TAB补全),可以搜索vmlinuz所在分区,也就是/boot所在分区
image
第一步:运行root (hd0,0) (这是/boot所在的分区,其中括号内的信息,就是上面命令的回显.)
image
第二步:执行kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet (用来指定linux内核)
image
第三步:执行initrd /initrd-2.6.18-53.el5.img(用来指定initrd文件)
image
第四步:执行boot
image
同样,看见红色的REDHAT就证明你的内核加载成功了
image
image
OK了哈
image
通过刚才2次小试牛刀,这次我们来点更狠的哈~我们要来点狂暴滴动作哈~~~o(∩_∩)o
来狠滴哈,我们把/boot分区里的文件全部删除了掉哦,一个也不剩哈~~(不删boot分区哦,只删除里面文件)rm -rf /boot/*
image
image
又跑这来了哈~~~
image
好吧,现在我们把RHEL5的ISO镜像放进去,然后设置从光驱启动,我们要进救援模式了。
第一步:将RHEL5安装放入光驱并设置从光驱启动系统
image
第二步:输入linux rescue 或按F5进入救援模式
image
如果上一步是按的F5,那我们在这一步输入linux rescue
image
image
image
image
第三步:这里选择语言哈
image
这里选择美式键盘
image
这里我们不启用网络接口哈~~
image
第四步:这步注意,要让系统帮你自动挂载以前的系统,也就是硬盘里的系统
image
image
image
好了,现在就正式进入救援模式了。
image
下面我们使用#chroot切换到硬盘的系统
具体命令# chroot /mnt/sysimage/
image
然后我们去boot查看缺少了什么文件哈:#cd /boot &&  ls
image
查看故障原因,我们发现/boot目录下一个文件也没有了哈.......
由于boot下面主要是内核和GRUB,所以我们安装这两个东西哈
安装就要先挂载cd ,mount 就是挂载,这个以后会讲
mkdir /mnt/cd
image
mount /dev/hdc /mnt/cd
image
然后就是安装kernel,在安装内核时会自动生成initrd  
cd /mnt/cd/Server/ 
rpm -Uvh --force kernel-2.6.18-53.el5.i686.rpm
image
安装好内核后,我们去/boot目录看看
image
内核和initrd已经有了,然后我们需要安装GRUB
image
然而刚安装的GRUB是没有配置文件的,我们可以自己写一个哈,如果你boot分区的grub目录里的grub.conf配置文件丢失或者错误,回出现什么情况呢?系统启动会进入GRUB模式。但是这个不严重,我们只需要给系统提供系统启动的参数就能正常进入系统。
image
我们发现/boot/grub/目录下确实没有grub.conf哈~~
image
那我们就自己写一个哈~ 
cd /boot/grub/ 
touch grub.conf 
vim grub.conf
image
OK,grub.conf写完后,就保存退出,然后就可以启动系统了
image
用exit退出,连续两次
image
image
启动后就进入这个界面了,这就是因为没有我们刚才说的那个环境图片那个文件的原因。
注意哈:kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet 
rhgb表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到 
quiet表示在启动过程中只有重要信息显示,类似硬件自检的消息不回显示
image
看见这步了,基本就是成功了
image
image
image
OK了,我们去看看grub.conf的配置文件是不是刚才我写的是这样的吧
image
其实BOOT分区删了都可以恢复,只是复杂一点点
能够搞定的前提是,df命令里还有/dev/sda1是boot分区的记录,不然就比较危险了
我们先分区,然后安装内核和GRUB,就可以搞定了。
image
image
image
现在就参照上面的安装内核和GRUB就可以解决问题了。
关于boot分区排错全解析,救援模式,内核安装。
################################################################
还有一个superlogin模式,大家没见过,我们来看下这个模式什么样子
大家编辑/etc/fstab,然后记住这个文件。很重要滴哦~~
image
在LINUX系统中,大部分系统配置信息都以各种文件的形式保存在/etc目录中。而/etc/fstab就是专门用来配置本地文件系统。我们在 LINUX中常常用mount命令把一硬盘分区或者一张光盘挂装到文件系统中。/etc/fstab就是在开机引导的时候自动挂载LINUX的文件系统。事实上通过修改这个配置文件我们可以挂载所有的凡是LINUX所支持的文件系统。
在LINUX中/etc/fstab的数据项如下所示:
/dev/device mountpoint type rules 0 order
fstab文件是开机后系统在第4步读取滴~
image 第一列:设备或者卷标名称 
image  第二列:mountpoint挂载点,如果你要挂载一个新设备,你就要好好想想了,因为这个新设备将作为文件系统永久的一部分,需要根据FSSTND(文件系统标准),以及它的作用,用户需求来决定。比如你想把它做为一个共享资源,放在/home下面就是一个不错选择。
image  第三列:文件系统,LINUX支持N多种文件类型,如果你想知道具体点滴话可以在LINUX下用fdisk查看。
image  第四列:挂载参数
rules是指挂载时的规则。下面列举几个常用的: 
auto:开机自动挂载 
default:按照大多数永久文件系统的缺省值设置挂载定义 
noauto:开机不自动挂载 
nouser:只有超级用户可以挂载 
ro:按只读权限挂载 
rw:按可读可写权限挂载 
user:任何用户都可以挂载 
noexec:不允许可执行文件执行,但千万不要把根分区挂载为noexec,那就无法使用系统了,连mount命令都无法使用了,这时只有重新做系统了! 
nodev:不允许挂载设备文件 
nosuid,nosgid:不允许有suid和sgid属性
请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是noauto.如果你的LINUX没法显示中文,先装一个中文字库(例如GB2312),然后在这里加一个codepage=GB2312。记得两个规则之间用逗号分开。
image 第五列:dump检查时候,备不备份
0 是指dump(系统备份工具)。这一项为0,就表示从不备份。如果上次用dump备份,将显示备份至今的天数。
image 第六列:开机是否检查;0为不检查;1为第一个检查;2为1检查了才检查2
order 指fsck(启动时fsck检查的顺序)。为0就表示不检查,(/)分区永远都是1,其它的分区只能从2开始,当数字相同就同时检查(但不能有两1)。如果我要把第二块IDE硬盘上的windows C 区挂到文件系统中,那么数据项是:/dev/hdb1 /c vfat defaults 0 0 (/c 是事先建立的文件夹,作为c盘的挂载点。)当你修改了/etc/fstab后,一定要重新引导系统才会有效。
对于已经挂载好的设备,现在要改变挂载参数,这时可以不用卸载该设备,而可以使用下面的命令(没有挂载的设备,remount 这个参数无效) 
#mount /mnt/D/ -o remount,ro (改defaults为ro)
OK,大家把/etc/fstab这个文件记住哈,现在我们把/根分区那行删除掉,然后保存退出,重新启动系统哈~~
效果如下:
image
image
重新启动系统的时候,大家注意他的启动顺序,看仔细了
能看见红色Red Hat就证明内核加载成功,加载内核是启动系统的第三步。
image
第4步,加载文件系统,这个时候读取的就是fstab文件了,由于我们的fstab文件出问题了,所以这步就没成功,卡在上面那里了,我们输入自己root的密码
image
如上图哈,输入正确后,就会出现命令提示符我们就可以操作了,我们先去看下fstab文件哈:vim /etc/fstab
image
明显的红色,就是有问题的,后面挂载点是根。
image
当我们要编辑LABEL=为LABEL=/时,系统提示/etc/fstab是只读文件,开始挂载的时候估计是为了安全,所以是只读的。我们需要以读写方式重新挂载。
image
image
在此之前,我们用e2label看看哪个分区的卷标是根,显示/dev/sda2是我们的/根分区哈。
image
我们以读写方式重新挂载:mount -o remount,rw /
image
image
然后修改fstab,把这里改成设备/dev/sda2,不用卷标了,保存退出。
image
最后用exit退出系统,重新启动,看我们能不能正常进入系统哈~
image
image
又到这里了哈~
image
OK,开始启动服务了,已经走到第8步了
image
OK,系统正常哈~
image
image
这样就完成这个错误的修复了,这个主要让我们有个了解,知道是怎么回事,有这个东西,使用时间长了,我们就会遇见这些问题
#################################################################
内核模型
单片型内核 
单片型内核将各种硬件支持、网络协议与文件系统管理都编译入一个单一的文件中。
模块型内核: 
模块型内核则允许计算机在使用到某一项功能的时候自动加载,防止了核心臃肿,是大部分情况下的标准构建。
默认核心存放路径:/boot
核心版本命名规则:主版本号、次版本号、补丁级数 Red Hat附加参数:发布号
显示当前系统的内核信息#uname -r
image
核心RPM包 
kernel-<version>.<arch>.rpm
预编译核心及模块 
kernel-source-<version>.<arch>.rpm
核心源代码,需要人工编译出核心并安装 
kernel-<version>.src.rpm 
[url]www.kernel.org[/url]上发布的原始核心源代码包,需要build出arch包再使用
vmlinuz 
是可引导的、压缩的内核。“vm”代表 “Virtual Memory“, Linux支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。
vmlinuz的建立有两种方式:      
(1) 编译内核时通过“make zImage”创建,zImage适用于小内核的情况,它的存在是为了向后的兼容性。    
(2) 内核编译时通过命令make bzImage创建 (单独编译内核映像,不编译驱动模块,生成内核映像bzImage)
Initrd 
initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。 
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。#mkinitrd   initrd-版本号.img   版本号
核心启动流程: 
检测硬件设备 
设备驱动初始化 
将根分区以只读方式挂载 
载入初始进程(一般是init)
init从/etc/inittab中读取数据并初始化 
init运行级别: 
系统启动脚本 
执行运行级别对应目录下的脚本 
设置热键 
定义UPS设备脚本 
在虚拟控制台上循环开启getty进程 
定义runlevel 5时的X显示管理器
init定义了0~6这7个运行级别,运行级别可以被指定于: 
系统启动时作为核心加载参数被指定 
未被指定的情况下,系统启动时从/etc/inittab中读取 
在系统运行中,root用户键入init [0-6]来指定。 
用户可以用/sbin/runlevel来查看当前的运行级别
系统的运行级别默认情况下为: 
•0:关机 
•1/S/emergency:单用户模式,通常用于维护系统 
•2:多用户模式但无网络 
•3:多用户模式(字符界面) 
•4:用户定义,未定义情况下与3相同 
•5:X11(包括网络) 
•6:系统重启
/etc/rc.d/rc.sysinit是系统启动用的脚本,从/etc/sysctl.conf中读取核心参数: 
设置系统时钟 
载入keymap 
激活swap分区 
设置主机名 
检查根文件系统并挂载 
加载Raid设备 
激活磁盘限额 
检查并挂载其他文件系统 
清除失效锁及PID文件
每一个运行级别都对应一个目录/etc/rc.d/rcX.d目录内存放的,即当前运行级别需要开启的服务脚本对应/etc/rc.d/init.d/目录下的链接,链接文件开头是S,表示启动;开头是K,则表示关闭。切换运行级别,即运行这个目录里所有的脚本,用户可以通过ntsysv调整当前运行级别的开关服务,或用chkconfig,调整某一运行级别下的开关服务。
/etc/rc.d/rc.local在运行级别目录下被最后一个调用,一般系统用户将针对此台计算机的开机定制设置写入其中,而非/etc/rc.d/rc.sysinit。
下期我们讲系统服务哈~~~








本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/119409,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小美
+ 关注