按照下面的顺序,我们来简单的说下Linux系统的启动流程,这边是针对CentOS6来说
一、POST
第一项我们也称加电自检,当我们按下开机的电源后,主板的芯片会组成首先向CPU发送一个reset指令之后待芯片组检测到电源供电稳定后便撤去reset指令,CPU就会跳转到BIOS中的启动代码位置; BIOS首先要检测关键设备(如内显、显卡等)是否正常。
二、(BIOS) boot sequence
引导次序:按主板中设置的先后次序,查找第一个有引导程序的设备。
三、MBR(Bootloader)
首先我们要了解什么是MBR,MBR(Mater Boot Record),即主引导记录。其位置是位于第一个扇区的钱512字节。而其中Bootloader是位于这512个字节中的前446个字节,在这个Bootloader中又装载了一个程序, 所以Bootloader用于提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核。
上面我们说到MBR 中有512个字节,其中Bootloader占据了446个字节,64个字节被磁盘分区所占,2个字节属于结束标志。其中在这个446个字节中安装了一个程序,我们称为grub。 在grub中又分了三个阶段,这三个阶段也是系统启动的步骤必须部分。我们以CentOS 6查看下其下的grub文件
[root@localhost ~]# ls /boot/grub/ #grub位于boot目录下
device.map grub.conf minix_stage1_5 stage2
e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5
fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5
ffs_stage1_5 menu.lst stage1 xfs_stage1_5
如上:从上图中可以看到stage1、*_stage1_5和stage2这三类文件,它们分别表示GRUB引导时的三个阶段。
1、Stage1:执行Bootloader主程序
第一阶段为执行boot loader的主程序,这个程序必须安装在启动区,即MBR中。因为MBR实在太小了,所以MBR通常安装boot loader的最小程序,并没有安装loader的相关配置文件。
2、*_stage1_5:链接stage1和stage2的一个通道
3、stage2、主程序加载配置文件
第三阶段为通过boot loader加载所有配置文件与相关的环境参数文件,当然这些配置文件都放在/boot/grub目录下。在/boot/grub目录下有个重要的文件grub.conf。其中grub.conf定义了系统启动时的很多信息,如下:
grub.conf文件内容:
default=:选择第几个title配置的内核或系统,各title从0开始编号;
timeout=#:菜单显示的超时时长;
splashimage=/path/to/some-image_file:指定菜单背景图片,此图片只能为14bits色,xpm格式,gzip压缩;
hiddenmenu:隐藏菜单;
tiltle TITLE SIRING:显示于菜单中的标题;
root:指定引导分区;
kernel:指明kernel的位置;
initrd:指明initramfs的位置。
[root@localhost ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/vg0-root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-504.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet
initrd /initramfs-2.6.32-504.el6.x86_64.img
最终bootloader加载kernel文件
四、kernel+ramdisk
如上图我的系统在默认的情况下这个界面是隐藏的,我们在grub.conf的这个文件中设置默认是隐藏的。在开机启动的时候,我们按任意键就会进入这个界面。其中这个是grub提供的功能。具体功能如下:
1、提供菜单,并提供交互式接口
e:进入编辑模式;
a:直接修改内核参数;
c:进入命令行模式。
2、选择要启动的内核或系统
允许传递引导参数给内核;
选择界面可隐藏。
如上图所示我们可以看到我们的kernel,kernel是操作系统的内核程序,所有的软硬件都是通过kernel来沟通的。在上图中的vmlinuz文件就是开机时所用的kernel。
上图中也出现initrd(initial ramdisk),是激活系统所必须加载的文件系统。
当kernel被载入到内存后,需要加载相应驱动程来识别文件系统,这时initrd就充当了临时的系统被挂载到rootfs上,其作用就是协助kernel来加载驱动程序
五、init(/sbin/init)设定默认运行级别
/sbin/init会使用/etc/init/目录中的.conf配置文件来对系统进行配置,之后调用/etc/rc.d/rc.sysinit文件对系统进行初始化。而init执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境(如网络、时区等)。
在进行系统配置的过程时,init会检测系统默认的runlevel(运行级别),并根据runlevel的信息来做相应的配置,在说明启动服务时会集中讲解runlevel,这里就只是先介绍一下CentOS的7个运行级别:
运行级别:为了系统的运行或维护等应用目的而设定;
0-6:7个级别
0:关机
1:单用户模式(root, 无须登录), single, 维护模式;
2:多用户模式,会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式,正常模式;文本界面;
4:预留级别;可同3级别;
5:多用户模式,正常模式;图形界面;
6:重启
我们系统在启动时的默认级别为3或者5,那么我们如何查看当前系统的运行级别和切换级别
[root@localhost ~]# runlevel #查看系统的级别前面指的是之前的模式,后面指的是当前所在模式
N 3
[root@localhost ~]# init 5 #切换当前系统级别5表示图形界面,这样我们的图形界面就启动了
六、使用/etc/rc.d/rc.sysint初始系统
初始化系统的内容主要有:
1、设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名;
2、打印文本欢迎信息;
3、激活SElinux和udev;
4、挂载/etc/fstab文件中定义的其它文件系统;
5、激活swap;
6、检测根文件系统,并以读写方式重新挂载;
7、设置系统时钟;
8、根据/etc/sysctl.conf设置内核参数;
9、激活LVM和RAID;
10、加载额外设备的驱动程序;
11、清理工作。
七、启动或关闭指定的服务
启动指定的级别默认为启动的服务,停止指定的级别下默认为关闭的服务。
/etc/rc.d/目录中rc0.d-rc6.d这7个目录中分别存放了不同运行级别启动或关闭时所要执行的脚本。
[root@localhost ~]# ls /etc/rc.d/ #查看系统级别
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local
[root@localhost ~]# ls /etc/rc.d/rc3.d/ #我们以运行级别3来查看其下的内容
K01smartd K75quota_nld S13cpuspeed S26acpid
K05wdaemon K84wpa_supplicant S13irqbalance S26haldaemon
K10psacct K87multipathd S13iscsi S26udev-post
K10saslauthd K87restorecond S13rpcbind S28autofs
K15htcacheclean K89rdisc S15mdmonitor S50bluetooth
K15httpd K99rngd S20kdump S55sshd
K30spice-vdagentd S01sysstat S20lldpad S80postfix
K35vncserver S02lvm2-monitor S21fcoe S82abrt-ccpp
K50dnsmasq S07iscsid S22messagebus S82abrtd
K50netconsole S08ip6tables S23NetworkManager S90crond
K60nfs S08iptables S24nfslock S95atd
K69rpcsvcgssd S10network S24rpcgssd S99firstboot
K73winbind S11auditd S25blk-availability S99local
K74ntpd S11portreserve S25cups
K75ntpdate S12rsyslog S25netfs
注:其中以S开头的文件系统在启动的时候会默认启动,以K开头的文件系统启动时默认是关闭的##的范围是从0到99,数字越小,优先级越高
最后启动的是rc.local文件,如果想要在启动时就惊喜的脚本或者命令,直接将他写入/etc/rc.d/rc.local,那么该动作就会在启动的时候自动被加载。
八、login(启动登录界面)
原文地址:http://deanzhulinux.blog.51cto.com/10652113/1692888