linux的启动流程


①按下电源键,计算机硬件会读取BIOS来加载硬件信息(如:CPU与接口设备的通信频率,磁盘的大小与类型,系统时间,周边总线,磁盘的I/O等)并进行BIOS的自我检测,

②依据BIOS的设置取得第一个可启动的设备,读取并执行第一个启动设备MBR主引导记录(MBR共512个字节,包括446个字节的Boot Loader,64个字节的分区表,2个字节的55AA校验位)内的Boot Loader(常用的如:grub。grub的引导过程:分为两个阶段,由stage1和stage2两个文件来控制;stage1存在与MBR里,文件比较小只有446个字节,主要作用是引导主程序stage2;stage2主要是加载所有的配置文件,包括grub.conf等.  这里存在一个问题:与内核相关的文件都在/boot目录里,/boot目录是第一个磁盘的第一个分区(sda1,由df -h可以查看),但是grub是如何识别第一块磁盘的第一个分区的呢?其实grub有自己的对于磁盘特有的grub设备号(hd0,0):表示第一块磁盘的第一个分区

③根据grub.conf文件里面的配置,Boot Loader指定使用哪个内核文件来启动,加载内核文件(如:vmlinuz-2.6.32-431.el6.i686)到内存中解压并执行,加载内核后,内核会检测所有的硬件信息(如:磁盘,cpu,网卡,声卡等等)并加载硬件驱动程序(此时操作系统就在PC机上跑起来了)(注意:在加载硬件驱动程序时有一个问题,所有的硬件驱动程序都在/lib/modules/这个目录下,此时并没有挂载根目录,所以无法读取/lib/modules/目录下的内容,就无法加载硬件驱动程序,怎么办呢?这时就要用到虚拟文件系统文件(initramfs-2.6.32-431.el6.i686.img),bootloader将其加载到内存并解压,将其解压为一个仿真的根目录,并提供可执行的程序,内核会借助此程序去加载最需要的模块(驱动程序),然后释放的这个虚拟文件系统,挂载真正的根目录

④加载硬件驱动程序后,内核会调用第一个进程init进程(之后便是init这个进程在工作了)

⑤init进程读取/etc/inittab这个文件,获取系统的启动级别run level(7个级别:0关机,1单用户,2,3字符界面,4,5图形界面,6重启)

⑥执行/etc/rc.d/rc.sysinit这个脚本进行系统环境的初始化(如:主机类型,网络环境,selinux,系统时间等等)

⑦读取/etc/fstab文件,进行相应的挂载

⑧启动网络(network)(注:网络启动后服务才能启动

⑨启动系统服务,假设系统的启动级别为3(字符界面),由/etc/rc.d/rc 3取得/etc/rc3.d/目录下所有的脚本,以K开头的stop掉,以S开头的start起来(注意:这个目录下的文件都是以Kxx或Sxx开头的文件,xx表示一个数字,这个数字的意义只是代表这个文件被执行的顺序,数字越大越晚被执行,如/etc/rc.d/rc.local对应的文件为 S99local,表示这个文件是第99个被执行的并start起来,也就是最后一个被执行的文件)

⑩最后执行/etc/rc.d/rc.local文件(我们可以把一些服务的开机自动启动命令写到这个文件里。注意:我们可以把一个脚本文件的绝对路径(仅仅是绝对路径的文件名)写到这个文件里,读取/etc/rc.d/rc.local文件时这个脚本就会被执行,如:在/etc/rc.d/rc.local文件里    添加一行/usr/local/bin/bash.sh,然后bash.sh脚本就会被执行




附加:

bootloader的作用:

①提供一个菜单:用户可以选择不同的内核来启动

②加载内核

③将启动装载功能转交给其他的bootloader


双系统的安装:必须先安装windows再安装linux,原因是:

  windows的bootloader不具有将启动装载功能转交给其他的bootloader的功能,而linux有此功能,因此我们在先安装windows再安装linux后,会先读取到linux的bootloader,linux的bootloader将启动装载功能转交给windows的bootloader,然后再执行后续步骤


grub设备号:

  (hd0,0):必须有括号;以hd开头;表示第一块磁盘的第一个分区,对应sda1




各位亲们看后务必给个赞哦!习大大看了后都给点了赞!









你可能感兴趣的:(linux,启动程序)