一、Linux内核的组成


Linux系统的组成部分:内核+根文件系统


内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能(selinux)


IPC(Inter-Process Communication进程间通信):就是指多个进程之间相互通信,交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。另外,Linux也支持POSIX IPC。


运行中的系统环境可分为两层:内核空间、用户空间;


内核空间:内核代码(系统调用)


用户空间:应用程序(进程或线程)


内核设计流派:


单内核设计:把所有的功能集成于同一个程序;(Linux)


微内核设计:每种功能都使用一个单独的子系统实现;(Windows solarls)


Linux内核特点:


(1)支持模块化:.KO(kernel object)


(2)支持模块运动时动态装载或卸载


组成部分:


核心文件:/boot/Vmliuz-VERSION-release


ramdirk:


CentOS5:/boot/initrd-VERSION-release.img


CentOS6,7:/boot/initramfs-VERSION-release.img


二、CentOS系统启动流程


总体启动顺序:

POST(加点自检)-->Boot Sequence(BIOS:基本输入输出系统)-->BootLoader(MBR:主引导记录)

-->Kernel(ramdisk)-->rootfs(根文件系统)-->switchchroot-->/sbin/init/(运行init前先读取/etc/inittab /etc/init/*.conf)-->设定运行级别-->系统初始化脚本-->关闭启动相应服务-->启动终端


各流程细化说明:


1、POST加电自检


主要是检测硬件设别是否能正常的运行,然而实现自检功能主要是由镶嵌在主板芯片(CMOS)上的BIOS(basic input output system)程序,检测没问题之后进行硬件设备的初始化。


2、Boot Sequence(启动管理程序):选择启动顺序加载MBR


Boot Sequence是一个程序它依赖于某个硬盘硬件。准确的说是第一个硬盘扇区的MBR,从而按次序查找各引导设备。


3、MBR引导,bootloader引导加载器,启动程序


MBR(Master Boot Record):此记录在0磁道1扇区,总共为512字节,前446字节为bootloder,后64字节为分区表信息,主分区加上扩展分区不能大于四个,最后2个字节为校验信息,为55AA。

这个界面就是大名鼎鼎的Grub了(学名叫统一资源引导器);

wKioL1fRgRDDpYSgAAAYx2-sGwE720.png

其对应的目录是boot目录下grub文件

Grub(GRand Unified Bootloader)是统一资源引导器,也就是引导加载器;它的工作是提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到RAM中的特定空间中,然后解压、展开,而后把系统控制权移交给内核。


4、kernel内核实现


kernel自身初始化,实现功能,借助ramdisk探测可识别的程序,以只读方式挂载根文件系统,运行应用程序:/sbin/init

initramfs-2.6.32-642.el6.x86_64.img

5、/sbin/init/管理用户空间服务进程

读inittab文件由它来设定运行级别,进行初始化脚本,关闭或启动相应的程序,启动终端。


自此整个系统启动结束


boot下的grub目录下的相关文件说明:

wKioL1fRgfLR1PG-AABVVyB_wVE281.png

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成


device.map:存放的是内核文件的根分区


menu.lis:为菜单列表,里面为可选择的菜单列表,存放于stage2中。


stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到第二段。 但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的menu.lst,就需要借助于中间层stage1_5,有它来协助stage1段来访问stage2阶段。stage1_5通常位于stage1字段后的63个扇区由于stage2在内存中存放可以使用的文件系统不确定,所以这就是有多个stage1_5 的原因。


Grub Legacy:分三阶段

stage1:存放在MBR上,磁盘里


stage1_5:存放在磁盘MBR之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;

注意:能看到启动菜单实际就已经过了1.5阶段了,进入2阶段

stage2:磁盘分区(/boot/grub/stage2)删除系统无法启动

根据stage2阶段文件定义内容找grub.conf文件然后根据这个文件里定义的内容找boot下的内vmlinuz...与驱动模块initramfs...,至此由bootloader到grub然后由grub加载内核文件与模块系统引导启动

详细说明:引导加载程序先读取MBR上的gurb第一阶段,由于MBR很小只有512字节采用grub这种方式引导程序,随后读取扇区中的stage1.5阶段,读取1.5阶段以后从而就能驱动第二阶段stage2所在的磁盘分区,stage2是存放在磁盘分区上的还包括了内核文件及ramdisk等都在这个分区上存放的;这就是为什么通过Bootloader之grub就能够加载内核文件的原因。


注意:当前硬件平台,主板BIOS必须能识别硬盘,然后BIOS才能加载硬盘中的Bootloader,磁盘中的Bootloader自身加载完以后,就能够识别当前主机上的硬盘设备了。


补充:硬盘设备能识别,并不代表硬盘上的文件系统能识别,因为文件系统是额外附加的一层软件组织的文件结构,所以要能够对接一种文件系统,必须要用到文件系统驱动;对应的应用程序必须能识别和理解这样的文件系统才可以,这种程序就称为文件系统驱动;grub的1.5阶段就是给gurb提供了文件系统驱动的,从而就能够访问对应的第二阶段和内核所在的分区了,这通常是一个基本磁盘分区;所以grub第二阶段以及内核和ramdisk文件通常都会放在一个基本磁盘分区上;因为grub驱动不了逻辑卷这种高级接口。


stage2一般是挂载至/boot/grub/目录下;grub也有自己的配置文件:/boot/grub/grub.conf且通常有个符号链接文件:/etc/grub.conf;


stage2的功用:


(1)提供菜单或交互式接口;


(2)能加载用户选择的内核或操作系统;


(3)为菜单通过了保护机制。


/boot/grub/grub.conf配置文件详解:

[root@centos6 grub]# ll /etc/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/sda2

# initrd /initrd-[generic-]version.img

boot=/dev/sda

default=0 #设定默认启动菜单项,默认为0开始

timeout=5 #指定菜单等待选择的时长

splashimage=(hd0,0)/grub/splash.xpm.gz #指定菜单的背景图片的路径,为xpm格式,采用gzip压缩

hiddenmenu #是否影藏菜单

password [--md5] $1$JO0kw$z.qtBMH.KL4A6qZ7dK4N30 #菜单编辑认证

title CentOS 6 (2.6.32-642.el6.x86_64) #定义菜单项

root (hd0,0) #本次grub查找stage2及其kernel文件所在设备分区,指定grub的根

kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=240533cf-b37f-4460-974f-702bab867da5 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #需要启动的内核

initrd /initramfs-2.6.32-642.el6.x86_64.img #内核匹配的ramfs文件

password [--md5] STRING #启动内核选定的内核或操作系统是进行的认证

进入单用户模式:


1)重启按esc键选定grub菜单,然后输入e进入可选菜单

2)光标移动到kernel ...那一行,再敲入“e”进入命令行编辑


3)在选定的kernel那一行后面输入 1 ,s 或者 single


3)然后输入b键重启进入单用户模式

wKiom1fRiCjjzMMIAAAX_3fBdBU011.png

6、根切换

在挂载根文件系统时为了避免内核中有bug或操作过程中有bug导致根文件系统被损坏,先只读挂载根文件系统,加载完成后才读写挂载,完成整个挂载根文件系统后,直接去找/sbin/init程序,即开始运行用户空间的第一个程序。


用户空间启动流程init


7、/sbin/init程序


init程序主要依赖于配置文件:/etc/inittab,大体分为:设定默认启动级别 --> 设定系统初始化脚本 --> 启动对应级别的服务 --> 打印各终端登录界面(如果级别为3处理提供文本登录界面,如果级别为5还提供图形登录界面)


8、设置默认运行级别


(1)运行级别:为了系统的运行或维护等目的而设定的机制


0-6:共7个级别;


0:关机,shutdown


1:单用户模式(single user),root用户,无须认证,维护模式;


2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式;


3:多用户模式(multi user),完全功能模式,文本界面;


4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用;


5:多用户模式(multi user),完全功能模式,图形界面;


6:重启,reboot

wKioL1fRiOeR0Ut0AABxmwDW4X0372.png

读取配置文件:/etc/inittab


(2)配置文件:

/etc/inittab定义了很多功能,每一行定义一种操作(action)以及与之对应的process(仅适用于CentOS 5),一行就定义了init要执行的任务,甚至是一堆任务,每一行的语法格式为: id:runlevels:action:process


id为一个任务的标识符;


runlevels:在哪些运行级别下启动此任务;例:3,2345,也可为空表示所有级别;


action:在什么条件下启动此任务;


wait:等待切换至此任务所在的级别时执行一次(刚刚切换进来时);


respawn:一旦此任务终止时,就自动重启;(如:登录终端执行logout登出后会再次启动)


initdefault:设定默认允许级别;此时process省略为空;


sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;(CentOS 5,6都用到此脚本,CentOS 7是靠systemd完成的),在CentOS 6中仅保留此配置文件中设定启动运行级别的功能。


process:具体任务;通常为应用程序,或脚本,或二进制的程序,取决于自定义。

wKioL1fRibvDHTXlAABNVU-LcIU537.png

9、系统初始化脚本


系统初始化脚本:/etc/rc.d/rc.sysinit


(1)设置主机名;


(2)设置欢迎信息;


(3)激活udev和selinux;


(4)挂载/etc/fstab文件中定义的所有文件系统;


(5)检测根文件系统,并以读写方式重新挂载根文件系统;(重新挂载是指根文件检测完之后)


(6)设置系统时钟;


(7)根据/etc/sysctl.conf文件来设置内核参数;


(8)激活lvm即软raid设备;


(9)激活swap设备;


(10)加载额外设备的驱动程序;(内核加载驱动只加载根文件系统的)


(11)清理操作;


注意:在init配置文件:/etc/inittab中,有一行内容是定义/etc/rc.d/rc.sysinit,此脚本文件是负责完成系统初始化的脚本文件。


10、关闭/启动对应级别下的服务


脚本文件/etc/rc.d/rc作用为当级别切换时启动或停止服务;此脚本接受传递的参数给脚本中$runlevel变量,然后,读取/etc/rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,这些文件就是为什么开机启动后,有些服务会自动启动,有些服务没有启动的原因。


K*:要停止的服务,K##*,优先级,数字越小,越优先关闭,依赖的服务先关闭,然后再关闭被依赖的。


S*:要启动的服务,S##*,优先级,数字越小,越是优先启动,被依赖的服务先启动,而依赖的服务后启动。


/etc/rc.d/init.d目录还有个链接目录为/etc/init.d目录,这两目录下文件相同。


如上诉定义将会启动3级别下的以S打头的进程:

图示:

wKiom1fRihzAf55CAABVLgiGfU8589.png

11、启动终端(图形终端)


操作系统启动完成


三、系统启动流程总结


内核级别:


1.POST做开机启动时候的硬件检测功能


2.BootSequence(BIOS)启动加载主引导分区MBR中的引导加载器程序BootLoader


在LInux现行的BootLoader是三段划分(打破446字节限制)的GRUB程序,


第1段写在BootLoader中


第1.5段在其后扇区用于文件系统的引导


第2段在boot/grub中提供内部接口和调用系统内核kernel


3.Kernel识别硬件、加载驱动、只读挂载根文件系统、同时交付给用户空间第一个程序/sbin/init


此处特别要注意,系统发行商为了适应多种硬件接口驱动调用,会在第一次安装系统时候,自动识别硬件接口,并调用唯一驱动程序来生成ramdisk文件,以内存当磁盘做虚根,驱动接口后会切换到真实的根文件系统上


CentOS 5系列是initrd,当磁盘映像文件会造成二次缓存缓冲


CentOS 6/7系列改进为initramfs,以文件系统形式可以不二次占用缓存和缓冲


用户空间级别


4./sbin/init接管后更具其配置文件来初始化


5.根据/sbin/init中的配置会设置默认运行级别,以及一些在/etc/init.d/设置的开机服务


6./etc/rc.d/rc.sysinit运行系统初始化脚本,完成系统初始化


7.关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务


8.设置登录终端

done !!!

Centos6系统启动详解......的更多相关文章

  1. three.js模拟实现太阳系行星体系功能

    这篇文章主要介绍了three.js模拟实现太阳系行星体系功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 为什么,将nil作为参数从Objc C发送到swift类初始化器,用新对象替换nil参数

    除非属性本身被声明为nonnull:

  4. ios – 在Swift中对MKCircle进行子类化

    我想通过添加另一个String属性来继承MKCircle,我们称之为“代码”.这个属性不是可选的和常量的,所以我必须从初始化器设置它,对吧?有没有办法定义一个单一的便利初始化器,在这种情况下需要3个参数?本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. ios – AVAudioPlayer不再使用Swift 2.0/Xcode 7 beta

    对于我的iPhone应用程序中的vartestAudio声明,我在这里收到错误“调用可以抛出,但错误不能从属性初始化程序中抛出”当我转到Xcode7测试版时,就发生了这种情况.如何在Swift2.0中使用此音频剪辑?

  6. ios – 斯威夫特.在初始化所有存储的属性之前在方法调用中使用’self’

    解决方法在初始化所有非可选实例变量之前,您无法在self上调用方法.有几种方法可以解决这个问题.>将属性更改为选项或隐式解包选项(不建议)>使buildCircle()方法静态或只是一个在文件中运行并为所有圆圈调用addSubview()在所有属性初始化并且您调用之后super.init()等等.你必须避免在自己之前打电话给自己class已初始化.

  7. ios – Objective-C警告未找到超类“-init”的指定的初始化程序的方法覆盖

    我在一个应用程序中清理警告,我收到了两次这个警告对于这行代码和这一行我相当新的Objective-C和谷歌这个警告,只是不明白的解决方案我的问题是如何摆脱这些警告?

  8. ios – UICollectionView不能使用UISearchController?

    在WWDC2014年的“AInsideInsidePresentationControllers”中,演示者展示了如何在UITableView中设置UISearchController.他们通过设置searchController的searchBar框架,然后将其设置为tableView的tableHeaderView来实现.不幸的是,UICollectionView没有相当于tableHeade

  9. ios7 – 如何使用默认的IOS映像

    嗨,我是IOS开发的新手.我知道如何在IOS应用程序中使用图像.但是我不知道如何使用默认图像,如开发者站点中提到的共享或书签图标.我想用它们我必须下载这些图像集或那些可用在xcode?

  10. ios – 在词典上引用成员’subscript’

    我正在尝试为类创建一个可用的初始化程序.我的类将使用来自网络请求的输入进行初始化.网络不可靠,我想创建一个初始化器,检查所有属性上的存在,否则它将失败.我试图在这里使用守卫,所以请随时指出方法中的任何明显的错误:守卫self.jobId行无法编译,错误:对成员’下标’的模糊引用关于如何纠正这个错误的任何想法?

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部