1.CentOS的开机启动流程
POST(加电自检)——〉BIOS(BOOT Sequence)——〉MBR(bootloader)——〉kernel(ramdisk) ——〉rootfs ——〉init
(1)POST加电自检
在ROM中定义,在其芯片上CMOS上写
而且BIOS这个程序在这个芯片上有定义
ROM+RAM构成了内存,其中ROM是规定好了的程序
(2)BIOS中有系统引导加载次序:BOOT Sequence
1)如果引导加载次序汇总无引导设备的工具,则会通过网卡发出广播,搜寻dhcp服务器,进而寻找一个文件服务器,看他能否送过一份Bootloader
2)引导加载器程序:bootloader
(3)Bootloader的功能
1)提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到内存的特定空间中,解压,展开,并把系统控制权移交给内核
2)GRUB组成:
bootloader:1st stage
disk:2nd stage
(4)kernel
自身初始化:
探测可识别到的所有硬件设备;
加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统;
运行用户空间的第一个应用程序:/sbin/init
ramdisk:
内核中的特性之一:使用缓冲和缓存来回对磁盘上的文件访问
CentOS 5 :ramdisk
CentOS 6 :ramfs
CentOS 6 上之所以不用ramdisk的原因是:ramdisk会将内存伪装成硬盘,当系统启动后再次用到ramdisk上的驱动时,它仍会再将其加载一次到内存中,但是它本身就位于内存中
,如此会浪费资源时间,在CentOS 7上升级为ramfs,这样他就表现为文件系统了,就不用再一次加载到内存了。
(5)init主程序读取配置文件/etc/inittab
1)CentOS 5:
运行级别:为了系统的运行或维护等应用目的而设定;
0-6:7个级别
0:关机
1:单用户模式(root, 无须登录), single, 维护模式;
2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式,正常模式;文本界面;
4:预留级别;可同3级别;
5:多用户模式,正常模式;图形界面;
6:重启
默认级别:
3, 5
切换级别:
init #
查看级别:
runlevel
who -r
2)配置文件:/etc/inittab
每一行定义一种action以及与之对应的process id:runlevel:action:process action: wait: 切换至此级别运行一次; respawn:此process终止,就重新启动之; initdefault:设定默认运行级别;process省略; sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;
...
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
...
l6:6:wait:/etc/rc.d/rc 6
说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务;
for srv in /etc/rc.d/rc0.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rc0.d/S*; do
$srv start
done
3)chkconfig命令
查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig --add name #!/bin/bash # # chkconfig: LLLL nn nn
删除:
chkconfig --del name
修改指定的链接类型
chkconfig [--level levels] name <on|off|reset>
--level LLLL: 指定要设置的级别;省略时表示2345;
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
tty1:2345:respawn:/usr/sbin/mingetty tty1 tty2:2345:respawn:/usr/sbin/mingetty tty2 ... tty6:2345:respawn:/usr/sbin/mingetty tty6
mingetty会调用login程序
(6)/etc/rc.d/rc.sysinit: 系统初始化脚本
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 激活swap设备;
(8) 根据/etc/sysctl.conf文件设置内核参数;
(9) 激活lvm及software raid设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
总结:/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、完成系统初始化 --> 关闭对应下需要关闭的服务,启动需要启动服务 --> 设置登录终端
2.GRUB的相关知识
(1)GRUB(bootloader)
stage 1:MBR
stage 1_5:MBR之后的扇区,让stage 1中的bootloader能识别stage2所在的分区的文件系统
stage 2:磁盘分区上主程序加载的配置文件(/boot/grub)
(2)stage2及内核等通常放置于一个基本磁盘分区;
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
(3)grub的命令行接口
help: 获取帮助列表 help KEYWORD: 详细帮助信息 find (hd#,#)/PATH/TO/SOMEFILE: root (hd#,#) kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数; 例如:init=/path/to/init, selinux=0 initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk; boot: 引导启动选定的内核;
(4)手动在grub命令行接口启动系统:
grub> root (hd#,#) grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE grub> initrd /initramfs-VERSION-RELEASE.img grub> boot
(5)配置文件:/boot/grub/grub.conf
配置项:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始; timeout=#:指定菜单项等待选项选择的时长; splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径; hiddenmenu:隐藏菜单; password [--md5] STRING: 菜单编辑认证; title TITLE:定义菜单项“标题”, 可出现多次; root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”; kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核 initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件; password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
3.系统操作过程中常见的几种问题以及解决方式
(1)如果管理员的密码忘记了,除了重装系统之外,还有什么靠谱的方法呢
很显然,在这里我们就要进入到单用户模式下,进行密码的修改。相关的操作步骤如下:
1)编辑grub菜单(选定要编辑的title,而后使用e命令) 2)在选定的kernel后附加1,s,S,single 都可以。然后回车退出 3)在kernel的所在行,键入“b”命令,进行启动 4)这样我们就启动了单用户模式,在其中执行passwd命令修改管理员密码就成功了
(2)如果我们在执行系统操作时,不小心将MBR的前446字节给破坏了,那么我们如何修复?
1)在不关机的情况下,我们修复的方法为:
安装grub
1.grub-install # grub-install --root-directory=ROOT /dev/DISK
2.在键入grub命令,在grub命令行内创建grub
# grub grub > root (hd#,#) grub > setup (hd#)
2) 如果在这种情况下,我们关机了,仅依靠我们自身的操作系统是无法实现修复的,因为我们连启动菜单都启动不了,又从何说要恢复呢!
这时只能依靠救援模式进行系统的恢复了
(3)如果我们在执行过程中,将grub的配置文件给破坏了,应该如何修复呢?
1)如果我们没有关机,可直接重新编写配置文件就可以了
2)如果我们关机了,那么应该如何来拯救我们的系统呢?
1.首先我们开机会出现一个"grub> "类似的命令行,在这个命令行下我们可以进行如下操作
help:获取帮助 help KEYWORD:获取详细帮助 find (hd0, 0) /PATH/TO/SOMEFILE: 查询指定分区下有无要找的文件 root(hd#,#):指定boot目录为根目录 kernel /PATH/TO/KERNEL_FILE ro root=/dev/DEVICE init=/PATH/TO/INIT:设定本次启动时用到的内核文件,额外还可以添加许多内核文件支持使用的cmdline参数 同时还可以指定root的位置,以及开机能启动的初始化程序 initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk boot:引导启动选定的内核