Linux的启动流程
CentOs6的启动流程
解析:
CentOs6启动流程:
1、POST:加电自检,硬件环境(.加载BIOS的硬件信息,获取第一个启动设备)
2、grub 1 前446个字节(读取第一个启动设备MBR的引导加载程序(grub)的启动信息)
3、grub 1.5 加载/boot 分区文件系统(加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备)
4、grub 2 /boot/grub/grub.conf定义了内核文件(核心执行init程序,并获取默认的运行信息)
5、vmlinuz 加载/ /boot/initramfs.xxx(版本号).img(init程序执行/etc/rc.d/rc.sysinit文件)
6、/sbin/init /etc/inittab id:3:(.启动核心的外挂模块)
7、rc.sysinit(init执行运行的各个批处理文件(scripts))
8、/etc/rc3.d/S,Kxxx --> /etc/init.d/xxx(init执行/etc/rc.d/rc.local )
chkconfig --level N service on off
9、/etc/rc/locl(执行/bin/login程序,等待用户登录)
10、login(登录之后开始以Shell控制主机)
1、POST
Power-On-Self-Test:加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统等硬件情况的检测。
BIOS:Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
CMOS:保存主板的设置时间等参数,依靠主板上的CMOS纽扣电池。
2、BootLoader
引导加载器,Windows使用的bootLoader是ntloader,只可以引导Windows系统;Linux使用的bootloader早期有LILO(LInux LOader),现在6系列用的GRUB0.97版,7系列使用的是GRUB2。
3、GRUB
grub总共分为三个阶段:
查看磁盘分区 :hexdump -C -n 512 /dev/sda
- 第1阶段:存放在mbr前446个字节
- 第1.5阶段:1.5阶段存放在1-27扇区;由于grub1阶段需要去读取grub2阶段的程序和配置文件,但是grub2阶段的程序存放在磁盘的/boot分区中,想要读取分区中的文件就必须要有驱动文件系统的驱动模块,1.5阶段就是来做这件事的。
- 第2阶段:存放在磁盘可的/boot分区上(/boot/grub/),启动时选择内核版本界面,还有配置文件都是由第2阶段负责。
功用:
- 提供启动菜单、并提供交互式接口
- 加载用户选择的内核或操作系统
- 为菜单提供了保护机制
grub的配置文件(/boot/grub/grub.cfg)
default=0 #默认title timeout=5 #grub菜单选择超时时间 splashimage=(hd0,0)/grub/splash.xpm.gz #grub菜单背景图片 hiddenmenu #隐藏grub选择菜单 password --md5 | ----encrypted 口令 #加密方式和口令,为grub加密防止进如单用户模式修改密码,口令使用下面的命令生成
# grub-md5-crypt 生成MD5的密码 # grub-crypt 生成sha12的密码
title Red Hat Enterprise Linux 6 (2.6.32-642.el6.x86_64) root (hd0,0) #指定的是/boot所在磁盘的分区"hd0,0"表示第一块磁盘的第一个分区 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #向内核传递的cmdline参数 initrd /initramfs-2.6.32-642.el6.x86_64.img #指定initramfs文件的所在路径,注意:(这里的"/"相对的是/boot分区)
如果grub损坏我们可以用下面命令修复
grub-install --root-directory=DIR /dev/DISK --root-directory=DIR:根目录
如果grub配置丢失了怎么办:
在开机的时候会进入grub的命令行接口,但是无法找到内核和ramdisk,所以我们手动指定参数和路径就可以启动系统了。
help: 获取帮助列表 help KEYWORD: 详细帮助信息 find (hd#,#)/PATH/TO/SOMEFILE: root (hd#,#) kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数 initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk boot: 引导启动选定的内核
分别指定root(指的是/boot分区),kernel指定内核,initrd指定ramdisk文件,然后boot就可以启动系统了,进入系统后重新编辑/boot/grub.cfg文件来修复问题
4、kernel自身初始化
- 探测可识别到的所有硬件设备
- 加载硬件驱动程序(借助于ramdisk加载驱动)
- 以只读方式挂载根文件系统
- 运行用户空间的第一个应用程序:/sbin/init
5、ramdisk
在grub第2阶段的时候只能识别到/boot分区,这个时候内核开始初始化,探测完硬件后开始需要去找根,但是这时还没有驱动程序,所以这个时候需要借助ramdisk来驱动硬件。在CentOS5系列中文件名为/boot/inird,6和7已经改成initramfs。
initramfs中也提供了一个根文件系统,其中包括了硬件必须的驱动,到了这步内核借助这个虚根文件系统来挂载真正的根文件系统。
initramfs文件是在安装系统时按当前的环境来生成的。
如果这个文件损坏了我们也可以使用工具来修复:
# mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 为当前正在使用的内核重新制作ramdisk文件
6、init初始化
init程序启动系统的第一个进程init,它负责创建系统启动后的所有服务进程
init程序的类型:
- CentOS5.x:SysV
- CentOS6.x:Upstart
- CentOS7.x:Systemd
初始化的相关文件:
- /etc/inittab:定义系统默认的启动级别
id:3:initdefault:
- /etc/init/control-alt-delete.conf:设定按Ctrl + Alt + Del 是否会重启
start on control-alt-delete exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
- /etc/init/tty.conf
- /etc/init/start-ttys.conf
- /etc/init/rc.conf
- /etc/init/prefdm.conf
7、系统级别(CentOS6.x)
- 0:关机
- 1:单用户模式(root自动登录), single, 维护模式
- 2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
- 3:多用户模式,正常模式;文本界面
- 4:预留级别;可同3级别
- 5:多用户模式,正常模式;图形界面
- 6:重启
init #:切换至#级别
runlevel:查看当前的运行级别和上一运行级别
示例:进入单用户模式
1)在启动过程中看到Booting 。。。的倒计时字样按下esc键
2)按a键修改启动参数,在quiet后加1(单用户模式)
3)按回车键启动,进入单用户模式,可以直接修改root的密码,或者可以修改一些其他服务配置文件错误导致的系统无法进入正常模式的操作。
8、系统初始化脚本(/etc/rc.d/rc.sysinit)
- 设置主机名
- 设置欢迎信息
- 激活udev和selinux
- 挂载/etc/fstab文件中定义的文件系统
- 检测根文件系统,并以读写方式重新挂载根文件系统
- 设置系统时钟
- 激活swap设备
- 根据/etc/sysctl.conf文件设置内核参数
- 激活lvm及software raid设备
- 加载额外设备的驱动程序
- 清理操作
init程序的类型:
SysV: init, CentOS 5之前
配置文件:/etc/inittab
Upstart: init,CentOS 6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system /etc/systemd/system
默认级别: 3, 5
切换级别:init #
查看级别:runlevel ; who -r
chkconfig命令
查看服务在所有级别的启动或关闭设定情形: chkconfig [--list] [name]
添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d) chkconfig --add name
#!/bin/bash
#LLLL 表示初始在哪个级别下启动,-表示都不启动
# chkconfig: LLLL nn nn
删除: chkconfig --del name
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个 服务脚本,而是指向了/etc/rc.d/rc.local脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行 的命令,可直接放置于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定运行级别脚本后运行
可以根据情况,进行自定义修改
grub安装
(1) grub-install
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件 到 DIR/boot目录下
grub-install --root-directory=DIR /dev/DISK
(2) grub grub> root (hd#,#) grub> setup (hd#)
cat /proc/cmdline 内核参数
grub识别硬盘设备
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#:分区编号,用数字表示;从0开始编号
(hd0,0) 第一块硬盘,第一个分区