Linux开机过程理解
一. Power on
二. BIOS加电自检:
1. 检测所有周边硬件
2. 寻找启动的磁盘(cd-rom,floppy,IDE HDD,usb device等)
三. 启动加载器
1. 首先寻找启动扇区里的主要启动记录(MBR),执行里面446字节的操作系统
2. 主要启动扇区里面没有操作系统,则寻找磁盘中标记为启动分区的第一个扇区中的操作系统。
3. 补充:由于不管是启动记录扇区还是启动分区的第一个扇区,存储操作系统的空间只有446字节,目前任何操作系统都不能放在这么小的空间内,如果不能在上述扇区中存储操作系统内核,将导致BIOS无法继续启动,为了解决这个问题,设计出制作一个小程序将它存储到启动扇区的446字节内,当BIOS试图启动启动扇区里面的操作系统的时候,执行这个小程序来加载存储到其他位置的操作系统,它就是boot loader
四. 启动内核(BIOS已经顺利启动加载器。启动存储在其他位置的操作系统)
1. 若启动的是rhel,启动加载器的同时会传递内核启动参数给内核(run level,磁盘顺序,静态驱动的参数等)然后Linux内核会向BIOS查询所有硬件并接受管理这些硬件
2. 驱动硬件设备。由于还没有挂载任何文件系统,无法使用内核模块上的动态驱动程序,只能使用静态驱动程序来驱动必要的硬件
3. 以只读方式来挂载根文件系统。内核来挂载根文件系统,根文件系统是存储根目录数据的文件系统,它包含以下目录:
/etc 存储重要的配置文件
/bin 存储常用开机执行文件
/sbin 系统执行文件
/lib 存储/bin /sbin的执行文件所需要的动态库和内核模块
/dev 设备文件
ro root=LABEL=/ //方式 挂载LABEL是/的分区作为根分区
挂载根文件系统目标:
1. 安装适当的内核模块以驱动硬件设备和某些功能
2. 启动存储于根文件系统中的init服务,以便让Init服务接受后续的启动工作
3. 启动init服务.依次在/sbin /etc/init /bin 中寻找是否有init ,找到的话执行init服务,若这三个里面没有的话就执行/bin/sh ,并提示:“Kernel panic – not syncing:Attempted to kill init!”
五. 执行init服务,初始化系统环境
Linux启动过程分为内核启动阶段和init服务阶段是为了让内核更精简和启动过程更有弹性
1. 初始化系统环境。启动init服务同时,init服务会读取/etc/inittab文件,根据其设置来初始化系统环境。/etc/inittab文件定义了init服务在启动linux系统时依次启动的几个脚本
1./etc/rc.d/rc.sysinit
执行rc.sysinit时,会依次执行以下几项工作
1.启动udev和selinux两子系统,其中udev子系统负责管理设备文件。
2.设置内核参数(执行sysctl -p,从/etc/sysctl.conf中设置内核参数)
3.设置系统时间.rc.sysinit会将硬件时间改成linux的系统时间
4.启动置换内存空间.swapon –a -e
5.设置主机名
6.检查并挂载所有文件系统,确保文件系统的完整性,并把根文件系统属性修改为可读写状态。
7.初始化硬件设备(/etc/modprobe.conf模块,ISA PnP设备,USB设备)
8.启用软件磁盘阵列和lvm磁盘设备
9.卸载/initrd/ 初始化内存磁盘init ram disk 主要是用来加载必要的驱动程序
10.初始化串行端口设备 init服务会管理所有串行端口设备/etc/rc.serial来控制
11.清除过期锁定IPC文件。过期锁定文件是系统服务被非法停止或者断电等原因导致服务终止的时候系统自动产生的文件.这个文件存在的时候用户将无法重启相应的服务.所以rc.sysinit在开机的时候会自动删除过期锁定文件保障开机启动服务的的正常运行.
12.重新设置磁盘参数 rc.sysinit最后一项工作,它根据/etc/sysconfig/harddisk DEVICE配置文件重新设置该DEVICE的硬盘参数
2./etc/rc.d/rc
建立runlevel的环境
3./etc/rc.d/rc.local
启动过程中自动执行一些任务,前提是local服务必须得被先执行
4.建立用户接口
1.建立虚拟控制台: /bin/login
2.建立图形使用接口登陆程序