通过系统调用来运行内核代码的内核空间;存储于文件系统中的应用程序被发起为进程或线程后的应用程序的代码所占有的用户空间。(占用的空间是指发起的进程或线程使用的CPU和内存资源空间)
Linux发行版系统centos系统,第五版和第六版的启动流程如下:
首先先启动内核,毕竟一切应用程序都是基于内核来执行的;内核启动完成后就应该启动用户空间。
内核启动流程:POST(BIOS) --> BootSequence(BIOS) --> Bootloader(GRUB) --> vmlinuz(initrd|initramfs) --> rootfs(ro) --> /sbin/init
用户空间启动流程:/sbin/init --> /etc/inittab(/etc/init/*.conf) --> 设置默认的运行级别 --> /etc/rc.d/rc.sysinit,完成系统初始化 --> /etc/rc.d/rc,关闭或启动相应的运行级别下的各系统服务 --> Ctrl+Alt+Delete组合热键功能 --> UPS备用电源失效或恢复之后的操作 -->/etc/rc.d/rc.local脚本 --> 生成登录界面,打印登录提示符
详细的启动流程:
第一步(加电自检):POST:保证硬件可以正常工作,实现自检功能是CMOS上的BIOS(Basic Input Output System,基本输入输出系统)程序;BIOS会检测CPU、Memory以及I/O设备,之后对硬件设备进行初始化。
第二步(MBR引导,顺序启动阶段BootSequence):
BIOS程序中有各个设备的启动顺序
这个过程的目的是找出到底从何种设备(光驱,硬盘,可移动设备(U盘),网络接口)上加载操作系统内核;按照给定的顺序查找设备,首次被找出带有引导程序(Bootloader)的设备即为本次启动要用到的设备;
(Bootloader:引导程序,引导加载器;在centOS6及之前的发行版本中主要是Legacy GRUB引导程序;)
legacy grub:
第一步:stage1,主要指存储于MBR前446Byte的内容,用于加载第1.5步;
第1.5步:stage1_5,主要储存于MBR之后的若干扇区之中;让stage1中的bootloader程序能够识别stage2所在分区的文件系统;
第二步:stage2,主要存储于磁盘设备中的启动分区之上,必须与内核核心文件放在同一个基本磁盘分区之中用于加载内核文件;
stage2提供的功能:
1.加载操作系统内核核心文件;
2.提供了一个菜单以及一个交互式接口;
3.为用户提供菜单的编辑方法;
4.以口令的方式验证用户身份,保证单用户模式和菜单编辑工作的安全使用;
{legacy grub的配置文件:
/boot/grub/grub.conf
default=0
//设定默认的菜单启动项,对于整个配置文件中的所有的title段进行依次编号,第一个title段编号为0,第二个为1,以此类推;
timeout=5
//用户在系统引导过程中实施操作的最大延迟时间;一旦在这段时间内没有任何操作,意味着grub会自动引导启动默认内核启动项;
splashimage=(hd0,0)/grub/splash.xpm.gz
//grub的背景图片文件的存放路径;
hiddenmenu
//隐藏grub的启动菜单;
password --md5 CRYPTED_PASSWORD
//为了保护菜单而设置的安全口令,也可以限制用户随意进入单用户模式;
title CentOS 6 (2.6.32-573.el6.x86_64)
//定义菜单项中的各个"标题",可以定义多个;但至少要保留一项;
password --md5 CRYPTED_PASSWORD
想要引导此内核启动,需要输入口令;
root (hd0,0)
指定grub的根设备,通常是安装grub的stage2的分区;
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
指定要启动的内核核心文件及传递给内核运行的内核参数;
initrd /initramfs-2.6.32-573.el6.x86_64.img
内核所对应的ramdisk(ramfs)文件;}
第三步(内核引导阶段):
内核在得到系统控制权之后,首先进行自身初始化,作用是:
1.首先探测可识别到的所有硬件设备:
bootloader将系统控制权移交给内核,内核首先要检查一下有哪些是Legacy GRUB所留下的,如果自己可以用留下,反之删除;
2.加载硬件驱动程序:
加载根文件系统所在设备的驱动程序(可能借助于ramdisk加载驱动) ;且在内存中释放kernel使用的file system;
3.以只读方式挂载根文件系统:
如果有借助于ramdisk这个临时文件系统,则在这一步之后会执行根切换;没有则不执行根切换;
4.最后运行用户空间的第一个应用程序:/sbin/init.
以上流程是内核空间的启动流程;下面是用户空间的启动流程:
第四步(init初始化阶段,用户空间启动阶段):
流程:/etc/inittab(/etc/init/*.conf) --> 设置默认的运行级别 --> /etc/rc.d/rc.sysinit,完成系统初始化 --> /etc/rc.d/rc,关闭或启动相应的运行级别下的各系统服务 --> Ctrl+Alt+Delete组合热键功能 --> UPS备用电源失效或恢复之后的操作 -->/etc/rc.d/rc.local脚本 --> 生成登录界面,打印登录提示符
对于CentOS 5来说,初始化程序init是SysV init,其配置文件为:/etc/inittab;
对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab(几乎被废弃),/etc/init/*.conf;
Init程序:
运行级别(Run-level):为了系统的运行和维护等目的而设置的管理机制;所有的管理类操作都必须依靠shell脚本来实现;
七个运行级别(0-6)
0 - halt (Do NOT set initdefault to this) //关机
1 - Single user mode //单用户模式,无需密码认证,维护和调试;
2 - Multiuser, without NFS (The same as 3, if you do not have networking) //多用户模式,不会启动NFS,维护模式;
3 - Full multiuser mode //完全的多用户模式;仅使用CLI;
4 - unused //预留级别,目前无特殊使用目的;但其设置习惯上与运行级别3保持相同;
5 - X11 //完全的多用户模式,默认激活GUI和CLI,默认使用GUI;
6 - reboot (Do NOT set initdefault to this) //重启;
其中0和6不能设置为默认;
init 的切换命令和配置解析
(1)init #:一般模式级别为3,5,#为级别编号;
(2)runlevel:查看当前运行级别与最近一次切换前的级别;
(5)who -r:类似与runlevel
修改运行级别:
实时修改:init [0-6]
永久修改:修改init的配置文件:/etc/inittab id:#:initdefault:
执行/etc/inittab文件下所有脚本的作用:
在整个系统初始化的过程中决定执行哪些操作:
启动或关闭哪些后台服务;
如何进行系统初始化;
在验证用户身份无误之后,如何为用户提供登录提示界面;
当备用电源失效或重新生效后,如何指挥系统操作;
定义了"Ctrl+Alt+Delete"组合键被同时按下时,系统将采取的行为;
之后执行/etc/rc.d/rc.sysinit下所有脚本的作用:
1.设置主机名;
2.设置启动时的欢迎信息;
3.激活udev和SELINUX;
4.挂载/etc/fstab文件中定义的所有有效的文件系统;
5.激活swap设备;
6.检测rootfs,并以重新以读写的方式挂载rootfs;
7.设置系统时间;
8.根据/etc/sysctl.conf设置内核参数;
9.激活lvm和软件RAID等高级逻辑设备;
10.加载额外的设备驱动程序;
11.完成初始化之后的清理工作;
再然后执行/etc/rc.d/rc脚本:
1.根据特定的运行级别启动或关闭对应目录中的系统服务进程;
K*:要停止的系统服务进程;*表示关闭次序,数字越大越先运行,数字越小的服务,通常为依赖比人的服务;
S*:要启动的系统服务进程;*表示启动次序,数字越小越先运行,数字越小的服务,通常为被别人依赖的服务;
2.rc脚本可以接受一个运行级别的数字标识作为参数;
3.有rc脚本关联的/etc/rc.d/rc#.d中的文件其实是链接文件,其链接的目标路径为:/etc/rc.d/init.d目录中的各服务管理脚本;
管理此类系统服务的链接文件:
chkconfig命令:更新和查询系统服务的运行级信息;
查看系统服务在各运行级别下的启动与关闭的情况:
chkconfig --list
根据脚本文件中设置的chkconfig: runlevel Slevel Klevel设置系统服务在各个运行级别下的默认启动或关闭的状态:
chkconfig --del SERV_NAME
chkconfig --add SERV_NAME
实时调整各个服务在各个运行级别的运行状态:
chkconfig --level runlevel SERV_NAME on|off
最后执行/etc/rc.d/rc.local脚本:
是在init程序引导用户空间进程的过程中,所执行的最后一个脚本;因此不便于或不需要写在系统服务相关的脚本中的内容,但又期望可以开机运行的功能,可以直接写在此脚本中;
最终会打印登录提示符:/sbin/mingetty $TTY
mingetty程序会调用login程序,打开虚拟终端;除了mingetty之外,诸如getty等之类的程序也可以完成此类生成虚拟控制台的功能;
如果默认的运行级别为5,则需要/etc/X11/prefdm脚本打开图形用户界面终端;
至此,CentOS 5/6启动过程完成。
基于Intel X86架构平台的CentOS 5/6启动过程
原文地址:http://blog.51cto.com/chenliangdeeper/2089916