Linux启动原理

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引导顺序

  1. UEFi或BIOS初始化,运行POST开机自检
  2. 选择启动设备
  3. 引导装载程序, centos7是grub2
  4. 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
  5. 加载内核选项
  6. 加载initramfs初始化伪文件系统
  7. 内核初始化,centos7使用systemd代替init
  8. 执行initrd.target所有单元,包括挂载/etc/fstab
  9. 从initramfs根文件系统切换到磁盘根目录
  10. systemd执行默认target配置,配置文件/etc/systemd/system/default.target
  11. systemd执行sysinit.target初始化系统及basic.target准备操作系统
  12. systemd启动multi-user.target下的本机与服务器服务
  13. systemd执行multi-user.target下的/etc/rc.d/rc.local
  14. Systemd执行multi-user.target下的getty.target及登录服务
  15. 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

时间: 2024-10-11 04:33:45

Linux启动原理的相关文章

Linux启动原理介绍及设置开机启动脚本方法

转自本人个人博客:http://www.xgezhang.com/linux_init_shell.html 之前总是对Linux的整个启动脉络不了解,把这个问题看得很神秘,昨天稍微研究了一下,其实还是很简单的. Linux启动时,所有的启动脚本都放在/etc/init.d/ 下面,而这些脚本又有映射到各个/etc/rcX.d,这个X代表0-6,分别对应不同的系统级别: 0代表关机(halt) 1级别是单用户模式(single) 2级别是多用户级别,这个是默认级 3,4,5未定义,可以提供给用户

1-10-RHEL6.3-linux启动原理及各种故障案例分析(Red Hat Enterprise Linux Server6.3)@树袋飘零

本节内容: 一.Linux启动过程 二.常见的启动故障排除 三.救援模式 1.系统瘫痪了救援模式下拷贝数据 2.grub重新安装 3.系统无法启动--磁盘资源耗尽 4.文件删除空间不释放的问题(拓展) 一:linux启动过程详解 加载BIOS的硬件信息.因为BIOS中包含了硬件的各种信息(硬盘信息.CPU.内存.时钟.设备启动顺序)等等,根据设置的开机启动项 FIRST 引导启动,如果FIRST引导为hardware的话,接着进入下一步 读取硬盘中MBR也就是Master Boot Recode

1-20 RHEL7的启动原理和服务控制

大纲: RHEL7启动原理 RHEL7服务启动配置 网络概述 发布内网服务器 ############################################################ RHEL7启动原理: BIOS自检--->MBR--->GRUB--->加载内核--->systemd的init进程--->login systemd的初始化进程 作用:加载所需的服务和用户空间工具,挂载文件系统/etc/fstab systemd是linux内核启动的第一个进程

linux基础-第十四单元 Linux网络原理及基础设置

第十四单元 Linux网络原理及基础设置 三种网卡模式图 使用ifconfig命令来维护网络 ifconfig命令的功能 ifconfig命令的用法举例 使用ifup和ifdown命令启动和停止网卡 ifup命令的功能 ifdown命令的功能 ifup命令的用法举例 ifdown命令的用法举例 网络配置文件 网卡对应的网络配置文件 什么是网络配置 ip命令 ping命令 setup命令 课后作业 [本节内容]1. 使用ifconfig命令来维护网络(详见linux系统管理P422)1) 掌握if

深入剖析Linux IO原理和几种零拷贝机制的实现

深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈      公众号[零壹技术栈] 前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间.它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载.实现零拷贝

Linux启动过程笔记

Linux启动过程 1.启动流程(BIOS->MBR:Boot Code->引导GRUB->加载内核->执行init->runlevel) 2./boot/grub/下有多个文件   其中stage1为MBR镜像(512字节) stage2为引导程序 3./boot/grub/grub.conf为引导的配置文件 default=0#默认加载下边哪个系统 timeout=3#引导等待时间 splashimage=(hd0,1)/boot/grub/splash.xpm.gz#引

FS_V210开发平台下Linux启动logo的修改

作者:朱老师,华清远见嵌入式学院讲师. 一.开发平台 主机:ubuntu 12.04 系统: 目标机:FS210 平台: 内核版本:Linux-3.0.8 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc: 二.步骤 运行Ubuntu 12.04系统,打开命令行终端. $ cd ~              $ cd driver              $mkdir logo              $ cd logo 将"fs210光盘:实验资料\4. Lin

Spring Boot启动原理解析

Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面纱,让它不在神秘. 正文 我们开发任何一个Spring Boot项目,都会用到如下的启动类 从上面代码可以看出,Annotation定义(@Sp

iOS程序启动原理是什么

当刚开始学习ios开发的时候,我们学会做的第一件事就是创建一个新的项目.每次我都会好奇,为什么我们选择创建一个Single View Application项目的时候,什么代码都不用敲就可以在模拟器上运行程序了.要解答这个问题需要明白一点程序的启动原理,看完之后你就会明白. 首先,建立一个Single View Application项目以方便我们的研究.可以明确的是,不论是C语言还是Objiective-C语言程序,程序运行的入口都是main函数.所以我们从main函数开始入手. 创建新项目