POST(加电自检)-->bootsequence(引导次序,BIOS)-->Boot Loader(MBR)-->Kernel+ramdisk(临时根,initrd,initramfs)-->mount rootfs(根切换)-->/sbin/init(配置文件,CentOS 5:/etc/inittab, CentOS6 /etc/init/*.conf)
设置默认运行级别-->指定系统初始化脚本-->初始化额外的硬件设备并加载驱动程序-->启动(关闭)服务(/etc/rc.d/rc#.d,/etc/rc.d/init.d/)-->/etc/rc.d/rc.local-->设置CtrlAltDel组合的功能-->启动终端(mingetty),并在终端附加登录程序(login)-->如果级别为5,则要启动X server;
一、POST加电自检:
当我们打开计算机电源,计算机首先会读取BIOS信息,BIOS中记录了CPU、内存、设备启动序列、硬盘等信息;然后对系统启动关键硬件设备进行检测,如果出现严重故障则停机;如果是一般故障,会发出报警提示,等待故障清楚;如果没有故障,加电自检完成。
BIOS(Basic Input Output System)是保存于主板CMOS芯片中的程序代码;
CMOS(ComplementaryMetal Oxide Semiconductor):是主板上的ROM芯片;
二、获取引导次序,读取MBR:
加电自检完成之后:CPU会读取BIOS信息中的设备启动序列,按照次序引导,按次序找引导设备,第一个有引导程序(MBR)的设备即为启动PC server所用到的设备;
可作为启动设备:光驱,便携式移动设备,硬盘,网卡(系统引导,PXE)
PXE实现系统引导:DHCP,tftp(kernel+ramdisk)
MBR(主引导记录,Master BootRecord):
MBR位于磁盘的0磁道0扇区,占用512个字节:
446bytes:Boot Loader,主程序; 64bytes:PartitionTable,硬盘分区表,每16bytes标记一个分区,一共4分区;3个主分区,1个扩展分区,扩展分区还可以划分为若干个逻辑分区; 2bytes:MBR有效性标记;
三、Boot Loader:
操作系统内核运行之前的一段小程序,选择要启动的内核(在当前磁盘的某或某些分区上);
1、Boot Loader比较常见的有GRUB和LILO:
LILO:LInux Loader 0-1023范围内的柱面构成的分区的内核文件,通常应用与嵌入式计算机; GRUB:GRand Unified Bootloader CentOS 5&6:Grub 0.97 CentOS7:Grub2 1.96
2、GRUB:GRand Unified Bootloader
1)、grub程序由两段组成:
stage1:位于MBR中(0柱面 0磁道 1扇区); stage1_5:位于MBR随后的扇区; stagr2:读取grub.conf配置文件,并实现引导功能的扩展;
grub目录和配置文件位置:
2)、grub的功能:
1、提供菜单,并提供交互式接口; e:进入编辑模式; a:直接修改内核参数; c:进入grub命令行模式; 2、允许用户选择要启动的内核或系统; 允许传递引导参数给内核; 选择界面可隐藏; 3、为编辑功能提供保护机制; 启用内核文件:选择运行制定的内核需要先输入密码; 传递参数:使用e命令需要先输入密码;
在菜单选择倒计时界面按任意键进入grub菜单:
按e键进入编辑菜单可以看到kernel和initrd:
3)、grub命令行接口:
>root(DEVICE):指定哪个分区为接下来要启动的系统或内核文件所在的分区; 所有硬盘都识别为hd; 不同的硬盘基于数字标识:如hd0,hd1等; 同一个硬盘上的不同分区,也使用数字标识,如hd0,0 hd1,5; >find(DEVICE)/path/to/file:查找文件 >kernel:指定要运行的内核文件; >initrd:为要运行的内核指定其可用的ramdisk文件; >boot:启动此前配置好的内核或系统;
按c键进入grub命令行接口:
4)、配置文件grub.conf:
文件位置:/boot/grub/grub.conf
参数:
default=:选择第几个title配置的内核或系统,各title从0开始编号; timeout=#:菜单显示的超时时长; splashimage=/path/to/some_image_file:指定菜单的背景图片;此图片只能为14bits色,xpm格式,gzip压缩; hiddenmenu:隐藏菜单 titleTILTE STRING:显示于菜单中的标题; root:指定引导分区; kernel:指定kernel位置; initrd:指定initramfs位置;
在grub菜单按a键可在内核加载前编辑内核参数:
常用参数:
single:单用户模式启动;
5)、grub保护机制:
1、生成密码: #grub-md5-crypt 2、保护编辑功能,则需要title之外的添加: #password--md5 密码串 3、保护使用某内核,则需要内核对应的title之下添加: #password--md5 密码串
6)、安装grub的方式:
使用grub-install命令: #grub-install [--root-directory=/path/to/somewhere] DEVICE --root-directory=/path/to/somewhere /path/to/somewhere:内核及initrd文件所在的分区的挂载点的父目录,且此挂载点必须叫boot; 例如:/dev/sdb1:/mnt/boot #grub-install --root-directory=/mnt /dev/sdb
四、kernel+ramdisk:
根据grub设定的内核映像所在路径,系统读取内核文件,并进行解压缩操作;系统将解压缩后的内核放在内存中,完成内核自身初始化;探测所能识别的硬件设备,并加载驱动程序,完成核心环境建立;
要读取内核文件必须访问根文件系统要加载根文件系统所在的设备,而此时根文件系统没有挂载,要挂载根文件系统需要根文件系统所在设备的驱动程序。为解决这个问题,grub在加载内核同时,也把ramdisk加载到内存中并运行;
展开ramdisk镜像文件:
ramdisk在内存中表现为一个虚拟根文件系统initfs,里面有如同Linux根目录下的bin、sbin、dev、etc、lib、proc、usr、var、tmp等目录;initfs将内核与真实根建立联系,内核通过initfs加载驱动程序,然后进行根切换,挂载真实根目录;至此内核加载完成;
1、kernel:
内核的功能:进程管理、文件系统、硬件驱动(在内核模式下运行)、内存管理、安全功能(SELinux)、网络子系统;
1)、内核设计流派:
单内核体系结构: linux:支持模块化,模块可以动态装卸载 linux内核:核心+外围模块 核心:/boot/vmlinux-VERSION-release 模块:/lib/modules/VERSION-release .ko:kernel object ramdisk:/boot/initramfs-VERSION-release.img 在内核启动过程中装载根文件系统时有用;模块间有可能存在依赖关系; 微内核体系结构: windows、solaris
2)、内核的某些功能:
编译进内核本体 [*] 编译成内核模块 [M] 不选择使用 [ ]
3)、内核模块管理:
#lsmod:显示内核已装载模块 动态装卸载模块: #modprobe -rMOD_NAME:卸载; #modprobe MOD_NAME:装载; #insmod/path/to/module_file:装载; #rmmod MOD_NAME:卸载; 查看某模块的详细信息: #modinfo MOD_NAME 检查并生成模块间依赖关系的命令: #depmod
2、ramdisk:
CentOS 5:SysV,init;/etc/inittab--> /etc/rc.d/rc.sysinit; CentOS 6:upstart,init;/etc/init/*.conf(/etc/inittab) --> /etc/rc.d/rc.sysinit #chkconfig CentOS 7:systemd, init;/usr/lib/systemd/system/;借鉴MAC OS X; #systemctl
五、/sbin/init:
内核加载完成之后,第一个运行的程序就是/sbin/init,该文件会先读取/etc/init/rcS.conf文件:
设定系统运行级别:
0-6:7个运行级别: 0:关机; 1:single usermode,single,s,S,不启动网络功能,不启动用户认证,单用户模式(维护模式); 2:multi usermode,不支持NFS功能; 3:完全多用户模式,文本接口,不启动图形界面; 4:未使用;预留级别; 5:完全多用户模式,图形接口; 6:重启; #init:切换运行级别;
六、/etc/rc.d/rc.sysinit:系统初始化脚本
查看/etc/rc.d/rc.sysinit文件部分内容:
初始化设置流程:
设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名; 打印文本欢迎信息: 激活SELinux和udev; 挂载/etc/fstab文件中定义的其他文件系统; 激活swap; 检测根文件系统,并以读写方式重新挂载; 设置系统时钟; 根据/etc/sysctl.conf设置内核参数; 激活LVM和RAID设备; 加载额外设备的驱动程序; 清理操作;
七、启动内核模块:
依据/etc/modprobe.d/*.conf文件装载内核模块:
八、执行指定运行级别的脚本程序:
/etc/rc.d/rc#.d/:启动指定的默认级别的默认为启动的服务,停止指定的级别下默认为关闭的服务;
查看/etc/rc.d/rc3.d/目录:
1、目录中为链接文件指向服务脚本:
S##:默认启动的服务; K##:默认停止的服务; ##:01-99,数字越小,越优先启动或关闭; 先启动的后关闭(自动解决依赖关系);
2、chkconfig:创建或改变连接文件;
#chkconfig --add SRV_SCRIPT:创建; #chkconfig --del SRV_SCRIPT:删除; #chkconfig SRV_SCRIPT {on|off}:开机自动{启动|关闭}; 默认为2345级别; --level###### 脚本如果期望能够被chkconfig命令使用,要在脚本中添加如下行: #chkconfig:- 85 15 -:当此脚本由chkconfig控制时,默认哪些级别就是开启的; 85:启动优先级; 15:关闭优先级;
九、/etc/rc.d/rc.local:
是一个脚本,通常为系统启动完成的最后运行一个脚本;
定义一些组合键的功能:通常是Ctrl+Alt+Delete;
初始化字符终端;
如果有需要,启动图形终端;
十、/bin/logon:
登陆程序:显示登陆提示符,等待用户输入username和passwd;
本文出自 “小马的学习记录” 博客,请务必保留此出处http://masachencer.blog.51cto.com/8683770/1672797