linux开机过程发生了什么
相信去面试过大厂linux的对这个问题并不陌生,知道启动过程才能够解决启动中遇到的问题。
当你按下主机电源几分钟后看到Linux的登陆界面出现,这中间你知道发生了什么事吗?
通电->BIOS->MBR->GRUB->Kernel->/sbin/init->Runlevel
下图显示了典型Linux系统启动的6个主要阶段:
1. BIOS
BIOS: Basic Input/Output System
执行系统完整性检查
从软盘,光盘,硬盘中查找boot loader(取决与你的启动顺序)
BIOS的主要功能就是搜索并加载执行MBR boot loader程序
2. MBR
MBR: Master Boot Record.
MBR位于主盘的第一快扇区,如:/dev/hda或者/dev/sda.MBR共512bytes. 1-446bytes存放主要的boot loader信息,447~510bytes存放分区表信息,最后2个bytes存放mbr验证信息。
MBR包含GRUB信息。(或者LILO信息)
MBR 的主要功能就是加载并执行GRUB boot loader.
3. GRUB
GRUB:Grand Unified Bootloader.
如果你有多个kernel p_w_picpaths安装在你的系统中,你可以通过GRUB选择那个被执行。
GRUB启动的时候会有个选择界面,几秒钟没有任何输入的话,将会加载你GRUB配置文件中指定的默认 kernel p_w_picpath 。
GRUB的配置文件:/boot/grub/grub.conf (/etc/grub.conf is a link to this).
下面是CentOS的GRUB的配置文件 grub.conf .你可以看到里面包含kernel and initrd p_w_picpath。
#boot=/dev/sda
default=0
timeout=5
splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
initrd /boot/initrd-2.6.18-194.el5PAE.img
GRUB 的主要功能就是加载并执行Kernel and initrd p_w_picpaths.
4. Kernel
挂载 grub.conf 中指定“root=” 的根目录
执行/sbin/init 程序
因为/sbin/init 是LINUX kernel执行的第一程序,理所当然/sbin/init 的PID为1. ‘ps -ef | grep init’ 命令可以验证.
initrd: Initial RAM Disk.
在kernel完全起来,root文件系统被挂载之前,initrd被kernel当做临时root文件系统。当然initrd还包含了一些编译好的驱动,这些驱动用来在启动的时候访问硬件。
5. Init
查看/etc/inittab配置文件来决定Linux的运行(run level).
LINUX的运行级别:
0 – halt (关机)
1 – Single user mode (单用户模式)
2 – Multiuser, without NFS (多用户模式,无网络)
3 – Full multiuser mode (多用户模式,有网络,无图形界面)
4 – unused (没用,用户自定义)
5 – X11 (多用户模式,有网络,有图形界面)
6 – reboot (重启)
Init从/etc/inittab配置文件中得到默认启动级别,然后加载并执行相应级别的程序.
执行 ‘grep initdefault /etc/inittab’ 命令可得到你系统的默认启动级别。
6. Runlevel programs
当LINUX系统启动完成后,你会发现许多的服务进程也启动了,例如:“starting sendmail …. OK”. 这些服务程序都放在相应LINUX系统启动级别的文件夹下面。
根据你LINUX默认启动级别,系统将会执行以下其中一个文件架下面的服务程序:
Run level 0 – /etc/rc.d/rc0.d/
Run level 1 – /etc/rc.d/rc1.d/
Run level 2 – /etc/rc.d/rc2.d/
Run level 3 – /etc/rc.d/rc3.d/
Run level 4 – /etc/rc.d/rc4.d/
Run level 5 – /etc/rc.d/rc5.d/
Run level 6 – /etc/rc.d/rc6.d/
请注意,在/etc下面的那些文件有些是连接文件。如etc/rc0.d 连接到/etc/rc.d/rc0.d。
在/etc/rc.d/rc*.d/ 文件架下面, 你会发现服务程序名是以S 或 K开头。.
以S开头的表示用于服务启动。S表示startup。
以K开头的表示用于服务关闭。 K表示kill。
在S或K的后面的数字,表示启动/关闭程序的顺序。例如:S12syslog is to start the syslog deamon, which has the sequence number of 12. S80sendmail is to start the sendmail daemon, which has the sequence number of 80. So, syslog program will be started before sendmail. S12syslog启动syslog守护进程,12是启动顺序;S80sendmail 启动sendmail守护进程,80是启动顺序,12在80的前面,所以 syslog 服务程序将在sendmail之前启动。
这就是LINUX系统在开启电源到完全启动所发生的一切。