A-A+

浅谈linux启动流程(共7个阶段)

2016年01月04日 站长资讯 暂无评论

linux启动的第一阶段:POWER-ON

用户按下电源开关的那一瞬间,叫Power On阶段 。在这个阶段,BIOS检查电脑上一些硬件的状态及存储在CMOS中的设置。CMOS是南桥里面的一个特殊区块,用来让BIOS存储用户设置(进BIOS中看到的选项)。北桥,南桥是主板上的芯片组,AMD的cpu不使用此种架构,北桥控制CPU和内存,南桥负责PCI,USB,VGA等外围设备。

linux启动的第二阶段:BIOS加电自检

Power On阶段一开始,会进入BIOS的激活流程,BIOS是进本输入/输出系统的缩写,是在电脑没有访问磁盘前决定机器基本功能的软件,包含了控制键盘,显示屏,驱动器的代码。接着BIOS会在Flash Memory中执行,然后将自己和之前用户存储在CMOS中的资料解压到内存中。BIOS作用主要是:1>自检和初始化,检测主板硬件并通知开始执行。2>设置中断。3>加载操作系统,由BIOS转交给引导扇区,再有引导扇区跳到各分区激活相应操作系统。

linux启动的第三阶段:读取MBR

MBR(Master Boot Record,主引导记录),在硬盘的第一个扇区,上一阶段BIOS将MBR加载到内存中执行。MBR共512Byte,分成三个部分BootLoader,Partition table和Magic Number。BootLoader是MBR用来存储开机管理程序的地方(grub,lilo等)。BootLoader执行加载扇区和志向kernel的功能。Magic Number永远填入"55AA",让BootLoader中的开机管理程序确认这个地方就是MBR。

linux启动的第四阶段:加载BootLoader

当BIOS找到硬盘上的MBR后,控制权就交由BootLoader。GRUB是一个强悍的开机管理程序,支持多重开机管理。/boot/gurb目录可看到几个系统文件,主要是stage1,stage1_5,stage2这三种类型。stage1负责BIOS交给BootLoader时,载入开机管理程序,linux中是GRUB。stage1.5识别不同类型的文件系统,比如加载e2fs_stage1_5以后,就可以识别ext2格式。当stage1.5加载后,就赋予GRUB访问文件系统目录的权力,也就是说在开始找不到stage2,可以从文件系统中找到stage2的位置。stage2是GRUB最核心程序,操作系统的加载,新增参数,修改选项都由stage2负责。因此stage2不会太小,不可能放进MBR,只能放到文件系统中。而stage1.5提供识别不同文件系统的能力,真是巧妙的设计。当stage2执行时,会从现有文件系统中加载设置文件,/boot/grub/grub.conf配置文件。如下:

  1. # grub.conf generated by anaconda  
  2. #  
  3. # Note that you do not have to rerun grub after making changes to this file  
  4. # NOTICE: You have a /boot partition. This means that  
  5. # all kernel and initrd paths are relative to /boot/, eg.  
  6. # root (hd0,0)      
  7.  #内核文件所在的设备,对grub而言,所有硬盘一律为hd#,#表示第几个磁盘,后面那个表示对应磁盘分区  
  8. # kernel /vmlinuz-version ro root=/dev/sda2  
  9. # initrd /initrd-[generic-]version.img  
  10. #boot=/dev/sda  
  11. default=0      
  12. #设置默认启动的title编号,从0开始。  
  13. timeout=5    
  14.  #等待用户选择的超时时常,单位是秒  
  15. 。  
  16. splashimage=(hd0,0)/grub/splash.xpm.gz   
  17.  #启动背景图片  
  18. hiddenmenu       
  19. #隐藏菜单  
  20. title Red Hat Enterprise Linux 6 (2.6.32-504.el6.i686)    
  21. #内核标题,或操作系统名称,可自由修改  
  22. root (hd0,0)   
  23.  #内核文件所在的设备  
  24. kernel /vmlinuz-2.6.32-504.el6.i686 ro root=UUID=77085801-d743-4704-b454-46954507f798 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  
  25. initrd /initramfs-2.6.32-504.el6.i686.img    
  26. #initial ramdisk激活系统所需要加载的文件系统  

linux启动的第五阶段:内核初始化

根据/boot/grub/grub.conf配置文件中,根据内核路径,将内核解压至内存,至此,内核获得系统控制权,BootLoader退出。内核接管以后,会执行以下几个过程:

1>设备探测

2>驱动初始化

3>以只读方式挂载根文件系统(为了安全起见)

4>装在第一个进程init(PID:1)

linux启动的第六阶段:执行第一个进程/sbin/init

/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动。所有动作都依据/etc/inittab来规划。RHEL6版本这个文件和RHEL5区别很大,只能设置运行级别,其他相关配置配置文件中说明很清楚,理解RHEL5的inittab文件对理解RHEL6的启动机制有很大帮助。

RHEL5的inittab文件

  1. #  
  2. # inittab This file describes how the INIT process should set up  
  3. # the system in a certain run-level.  
  4. #  
  5. # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>  
  6. # Modified for RHS Linux by Marc Ewing and Donnie Barnes  
  7. #  
  8. # Default runlevel. The runlevels used by RHS are:  
  9. # 0 - halt (Do NOT set initdefault to this)  
  10. # 1 - Single user mode  
  11. # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)  
  12. # 3 - Full multiuser mode  
  13. # 4 - unused  
  14. # 5 - X11  
  15. # 6 - reboot (Do NOT set initdefault to this)  
  16. #   
  17. #id:runlevels:action:process #id:标识符;runlevel:在哪个级别执行;action:在什么情况下执行;process:要运行的程序  
  18. id:3:initdefault:  #默认运行级别3  
  19. # System initialization.  
  20. si::sysinit:/etc/rc.d/rc.sysinit   
  21. #表示所有级别,系统初始化执行/etc/rc.d/rc.sysinit  
  22. l0:0:wait:/etc/rc.d/rc 0   
  23. l1:1:wait:/etc/rc.d/rc 1   
  24. #运行指定级别对应目录下的脚本  
  25. l2:2:wait:/etc/rc.d/rc 2  
  26. l3:3:wait:/etc/rc.d/rc 3  
  27. l4:4:wait:/etc/rc.d/rc 4  
  28. l5:5:wait:/etc/rc.d/rc 5  
  29. l6:6:wait:/etc/rc.d/rc 6  
  30. # Trap CTRL-ALT-DELETE  
  31. ca::ctrlaltdel:/sbin/shutdown -t3 -r now  #Ctrl+alt+del组合键的功能  
  32. # When our UPS tells us power has failed, assume we have a few minutes  
  33. # of power left. Schedule a shutdown for 2 minutes from now.  
  34. # This does, of course, assume you have powerd installed and your  
  35. # UPS connected and working correctly.   
  36. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"  
  37.  #定义ups电源故障时的操作  
  38. # Run gettys in standard runlevels  
  39. 1:2345:respawn:/sbin/mingetty tty1     
  40. #启动虚拟终端  
  41. 2:2345:respawn:/sbin/mingetty tty2  
  42. 3:2345:respawn:/sbin/mingetty tty3  
  43. 4:2345:respawn:/sbin/mingetty tty4  
  44. 5:2345:respawn:/sbin/mingetty tty5  
  45. 6:2345:respawn:/sbin/mingetty tty6  
  46.     
  47. # Run xdm in runlevel 5  
  48. x:5:respawn:/etc/X11/prefdm -nodaemon   
  49. #启动图形终端  

/etc/rc.d/rc.sysinit是系统初始化脚本,完成以下任务:

1>激活udev和selinux

2>根据/etc/sysctl.conf文件,设定内核参数

3>设定时钟

4>装载键盘映射

5>启动交换分区

6>设置主机名

7>根文件系统检测,并以读写方式重新挂载

8>激活RAID和LVM设备

9>启动磁盘配额

10>根据/etc/fstab,检查并挂载其他文件系统

11>清除过期的锁和PID文件

l3:3:wait:/etc/rc.d/rc 3 #进入级别3,执行/etc/rc.d/rc,/etc/rc.d/rc3.d文件夹中,K开头的服务将被关闭,S开头的将被开启,数据越小越优先被选定,最后执行rc.local,rc.local可以放入用户想要开机执行的的任务。

RHEL6的inittab文件

  1. # inittab is only used by upstart for the default runlevel.  
  2. #  
  3. # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.  
  4. #  
  5. #  
  6.  System initialization is started by /etc/init/rcS.conf  
  7. #  
  8. # Individual runlevels are started by /etc/init/rc.conf  
  9. #  
  10. # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf  
  11. #  
  12. # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,  
  13. # with configuration in /etc/sysconfig/init.  
  14. #  
  15. # For information on how to write upstart event handlers, or how  
  16. # upstart works, see init(5), init(8), and initctl(8).  
  17. #  
  18. # Default runlevel. The runlevels used are:  
  19. # 0 - halt (Do NOT set initdefault to this) #关机  
  20. # 1 - Single user mode #单用  
  21. # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) #多用户,没有NFS  
  22. # 3 - Full multiuser mode #多用户,命令行  
  23. # 4 - unused #保留级别  
  24. # 5 - X11 #图形  
  25. # 6 - reboot (Do NOT set initdefault to this) #重启  
  26. #   
  27. id:3:initdefault:  

RHEL6的inittab文件只设置了默认运行级别。

linux启动的第七阶段:登录

启动虚拟终端以后便进入用户登录界面了,可以使用用户名和密码登录Linux系统了,如果忘记了账号、密码的话,可以参与路由器网的相关文章,里面会告诉你解决方案。

标签:

给我留言