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