Linux系统启动原理
#!此文章参考某godedu,用于复习查看
centos6系统
centos6系统启动过程
1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB; 如果是硬盘为第一引导。
2. 读取硬盘中 MBR 的 boot Loader 就是 grub引导
GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。
MBR的硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
MBR分区表,只能分4个主分区原因:
注:磁盘默认一个扇区大小为:512字节。MBR由以下3部分组成
- 主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。
- Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,16*4=64字节。为分区项1、分区项2、分区项3、分区项4。64字节只存4个分区表。
- MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
所以:16*4+446+2=512
3. 依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;
4. 在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得 run-level 信息;
5. init 执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境 (如网络、时区等);
6. init 执行 run-level 下各个服务并启动 (script 方式);
7. init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;
8. init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;
centos6启动相关的配置文件
[[email protected] ~]# vim /boot/grub/grub.conf default=0 设定默认启动菜单项,当系统中有多个内核时,0表示默认加载第1个,1表示第2个内核 timeout=5 菜单项等待选项时间为5s splashimage=(hd0,0)/grub/splash.xpm.gz 指明菜单背景图片路径为 hiddenmenu 隐藏菜单 title CentOS (2.6.32-358.6.1.el6.x86_64) 定义菜单项 root (hd0,0) grub查找stage2及kernel文件所在设备分区,grub的根 kernel /vmlinuz-2.6.32-358.6.1.el6.x86_64 ro root=/dev/vg_have/lv_root rd_NO_LUKS LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto rhgb quiet 启动的内核 initrd /initramfs-2.6.32-358.6.1.el6.x86_64.img 内核匹配的ramfs文件
修改系统启动级别:
[[email protected] ~]# vim /etc/inittab # Default runlevel. The runlevels used are: # 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) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: #这里决定系统启动的级别
/etc/rc.d/rc.sysinit shell脚本 作用:系统初始化: 像:主机名 和/etc/fstab 都在这里指定了,完成了包括mount分区 激活swap 加载modules等重要的工作.
启动对应级别下的服务如: init 3 级别
/etc/rc.d/rc3.d/(这里的程序/服务S开头的全部开机执行;K开头的表示开机不执行,表明了关机时顺序)
rcn.d (n为1到6) 是对应于不同的runlevel下起不同的服务. 这些目录下都是一些符号连接, 连接到/etc/rc.d/init.d下的一些文件.以S开头的表示要启动, 以K开头的不启动.
第一个字母后面的数值是一个优先级.
[[email protected] ~]# ll /etc/rc.d/rc3.d/ | grep network lrwxrwxrwx. 1 root root 17 Dec 18 2012 S10network -> ../init.d/network #表示network是第10个启动的服务。 所以init是顺序启动系统,需要一个一个服务启动成功,再执行下一步操作,启动系统比较慢。而centos7中的systemd可以并行启动多个服务,启动比较快。
[[email protected] ~]# vim /etc/init.d/network #! /bin/bash # # network Bring up/down networking # # chkconfig: 2345 10 90
看有chkconfig的那一行, 2345表示在runlevel 2 3 4 5下被启动, 10是为此服务的启动顺序, 90为关机时,关闭此服务的顺序
[[email protected] ~]# chkconfig --list | grep network network 0:off 1:off 2:on 3:on 4:on 5:on 6:off [[email protected] ~]# ll /etc/rc.d/rc3.d/ | grep network lrwxrwxrwx. 1 root root 17 Dec 18 2012 S10network -> ../init.d/network #开机顺序 [[email protected] ~]# chkconfig network off [[email protected] ~]# ll /etc/rc.d/rc3.d/ | grep network lrwxrwxrwx 1 root root 17 May 23 21:17 K90network -> ../init.d/network #只显示k90关机顺序了 [[email protected] ~]# chkconfig --list network network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
所有服务都运行成功后,设置开机自动执行某个命令: /etc/rc.local
[[email protected] ~]# vim /etc/rc.local [[email protected] ~]# ll !$ ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Dec 18 2012 /etc/rc.local -> rc.d/rc.local [[email protected] ~]# ll /etc/rc.d/rc.local -rwxr-xr-x. 1 root root 240 Feb 5 21:17 /etc/rc.d/rc.local 运行mingetty命令,打开tty1-6 [[email protected] ~]# ps -axu | grep ming Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.8/FAQ root 2346 0.0 0.0 4116 548 tty2 Ss+ 20:55 0:00 /sbin/mingetty /dev/tty2 root 2348 0.0 0.0 4116 548 tty3 Ss+ 20:55 0:00 /sbin/mingetty /dev/tty3 root 2350 0.0 0.0 4116 544 tty4 Ss+ 20:55 0:00 /sbin/mingetty /dev/tty4 root 2352 0.0 0.0 4116 544 tty5 Ss+ 20:55 0:00 /sbin/mingetty /dev/tty5 root 2354 0.0 0.0 4116 544 tty6 Ss+ 20:55 0:00 /sbin/mingetty /dev/tty6 [[email protected] ~]# runlevel #查看系统启动级别 N 5 [[email protected] ~]# init 3 [[email protected] ~]# runlevel 5 3 #由5启动级别进入3级别 [[email protected] ~]# init 5 [[email protected] ~]# runlevel 3 5 #由3启动级别进入5级别
centos7系统启动过程及相关配置文件
centos7系统启动过程
CentOS7引导顺序
- UEFi或BIOS初始化,运行POST开机自检
- 选择启动设备
- 引导装载程序, centos7是grub2
- 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
- 加载内核选项
- 加载initramfs初始化伪文件系统
- 内核初始化,centos7使用systemd代替init
- 执行initrd.target所有单元,包括挂载/etc/fstab
- 从initramfs根文件系统切换到磁盘根目录
- systemd执行默认target配置,配置文件/etc/systemd/system/default.target
- systemd执行sysinit.target初始化系统及basic.target准备操作系统
- systemd启动multi-user.target下的本机与服务器服务
- systemd执行multi-user.target下的/etc/rc.d/rc.local
- Systemd执行multi-user.target下的getty.target及登录服务
- systemd执行graphical需要的服务
centos7启动过程:
[[email protected] ~]# find /boot/ -name *img* /boot/grub2/i386-pc/core.img /boot/grub2/i386-pc/boot.img
Systemd运行原理
Systemd概述:systemd即为system daemon [?di:m?n] 守护进程,是linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。
与多数发行版使用的System V风格init相比,systemd采用了以下新技术:
(1) 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
(2) 用Cgroups代替PID来追踪进程,以此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
Systemd配置文件:
- /usr/lib/systemd/system/ #这个目录存储每个服务的启动脚本,类似于之前的/etc/init.d/
- /run/systemd/system/ #系统执行过程中所产生的服务脚本,比上面目录优先运行
- /etc/systemd/system/ #管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
注意: 对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
总结:centos5-6-7 3个系统版本启动过程:
CentOS 5: SysV init; CentOS 6: Upstart; CentOS 7: Systemd;
原文地址:https://www.cnblogs.com/Mercury-linux/p/12088078.html