Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

Linux系统启动过程及其修复过程简析

$
0
0
linux组成

Linux: kernel+rootfs

kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

rootfs:程序和glibc

库:函数集合, function, 调用接口(头文件负责描述)

过程调用:procedure,无返回值

函数调用:function

程序:二进制执行文件

内核设计流派:

单内核(monolithic kernel):Linux

把所有功能集成于同一个程序

微内核(micro kernel):windows, Solaris

每种功能使用一个单独子系统实现

内核

Linux内核特点:

支持模块化:.ko(内核对象)

如:文件系统,硬件驱动,网络协议等

支持内核模块的动态装载和卸载

组成部分:

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

ramdisk:辅助的伪根系统

CentOS 5: /boot/initrd-VERSION-release.img

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

模块文件:/lib/modules/VERSION-release

示例:Linux的核心文件


Linux系统启动过程及其修复过程简析
CentOS 6的启动流程

1.加载BIOS的硬件信息,获取第一个启动设备

2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息

3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

4.核心执行init程序,并获取默认的运行信息

5.init程序执行/etc/rc.d/rc.sysinit文件

6.启动核心的外挂模块

7.init执行运行的各个批处理文件(scripts)

8.init执行/etc/rc.d/rc.local

9.执行/bin/login程序,等待用户登录

10.登录之后开始以Shell控制主机

Linux启动流程
Linux系统启动过程及其修复过程简析

1、POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存RAM、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。

ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。

RAM:CMOS互补金属氧化物半导体,保存各项参数的设定按次序查找引导设备,第一个有引导程序的设备为本次启动设备

2、MBR:

其中Bootloader占据446字节,分区表占据64字节,magic num占据2字节。MBR将加载Bootloader去开始后边的工作。

3、bootloader: 引导加载器,引导程序

Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核

LILO:Linux Loader

Bootloader(内核加载器)位于第0磁道第0扇区的446字节是最前边的446字节!Bootloader的工作机制:bootloader可以访问文件系统,而内核则作为文件而存在。所以bootloader可以访问内核文件,深入的说bootloader访问内核文件时,是将内核文件Vmlinz所在的整个分区当作根去访问的,如访问/Vmlinz而根"/"本身的存在位置是由内核文件自己决定。(因为每个文件必须要有一个自己的起始路径)现代我们常用的内核加载器是grub(Grand Unified Bootloader)以此grub来加载内核。加载内核之前grub所做的工作

4、GRUB : 就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核

primary boot loader : 1st stage,1.5 stage

secondary boot loader :2nd stage,分区文件

/boot/grub文件夹里面有各种启动的文件备份


Linux系统启动过程及其修复过程简析

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

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

grub.conf:就是菜单列表。里面设置了可以选择的内核菜单,存放于stage2中。

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

示例:grub.conf文件


Linux系统启动过程及其修复过程简析
5、kernel:

自身初始化:

探测可识别到的所有硬件设备

加载硬件驱动程序(可能借助于ramdisk加载驱动)

以只读方式挂载根文件系统

运行用户空间的第一个应用程序:/sbin/init

系统启动流程

init 程序的类型 :

SysV: init, CentOS 5之前

配置文件:/etc/inittab

Upstart: init,CentOS6

配置文件:/etc/inittab , /etc/init/*.conf

Systemd:systemd, CentOS 7

配置文件:/usr/lib/systemd/system ,/etc/systemd/system

ramdisk:

内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问

ramdisk > ramfs提高速度

CentOS 5: initrd, 工具程序:mkinitrd

CentOS 6: initramfs,工具程序:mkinitrd, dracut

系统初始化:

POST > BootSequence(BIOS) > Bootloader(MBR) > kernel(ramdisk) > rootfs(只读) > init(systemd)

/sbin/initCentOS 6之前

运行级别:为系统运行或维护等目的而设定;0-6:7个级别

0:关机

1:单用户模式(root自动登录), single, 维护模式

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

3:多用户模式,正常模式;文本界面

4:预留级别;可同3级别

5:多用户模式,正常模式;图形界面

6:重启

默认级别:3(多用户CLI模式), 5(图形化模式)

切换级别:init#

查看级别:runlevel; who -r


Linux系统启动过程及其修复过程简析

init读取其初始化文件:/etc/inittab

初始运行级别(RUN LEVEL)

系统初始化脚本

对应运行级别的脚本目录

捕获某个关键字顺序

定义UPS电源终端/恢复脚本

在虚拟控制台生成getty

在运行级别5初始化X

CentOS 5的inittab文件

配置文件:/etc/inittab

每一行定义一种action以及与之对应的process

id:runlevel:action:process

action:

wait: 切换至此级别运行一次

respawn:此process终止,就重新启动之

initdefault:设定默认运行级别;process省略

sysinit:设定系统初始化方式,此处一般为指定

/etc/rc.d/rc.sysinit

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc0

l1:1:wait:/etc/rc.d/rc1…

l6:6:wait:/etc/rc.d/rc6

CentOS 6 /etc/inittab和相关文件

/etc/inittab

设置系统默认的运行级别

id:3:initdefault:

/etc/init/control-alt-delete.conf

/etc/init/tty.conf

/etc/init/start-ttys.conf

/etc/init/rc.conf

/etc/init/prefdm.conf

示例:CentOS6的/etc/inittab文件。如果需要设置为图形化启动,把3改成5即可


Linux系统启动过程及其修复过程简析

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

(1) 设置主机名

(2) 设置欢迎信息

(3) 激活udev和selinux

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

(5) 检测根文件系统,并以读写方式重新挂载根文件系统

(6) 设置系统时钟

(7) 激活swap设备

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

(9) 激活lvm及software raid设备

(10) 加载额外设备的驱动程序

(11) 清理操作


Linux系统启动过程及其修复过程简析

说明:rcN > 意味着开机读取/etc/rc.d/rcN.d/

K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

启动服务的脚本:

for srvin /etc/rc.d/rcN.d/K*; do

$srv stop

done

for srvin /etc/rc.d/rcN.d/S*; do

$srv start

done

示例:属于init3开机级别的服务进程文件


Linux系统启动过程及其修复过程简析

chkconfig命令 ―查看服务在所有级别的启动或关闭设定情形:

chkconfig [ list] [name]

添加:

SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)

chkconfig add name

#!/bin/bash

#LLLL 表示初始在哪个级别下启动,-表示都不启动

# chkconfig: LLLL nnnn

删除:

chkconfig del name

修改指定的链接类型

chkconfig [ level levels] name <on|off|reset>

level LLLL: 指定要设置的级别;省略时表示2345

ntsysv命令:图形化的chkconfig命令

示例:制作一个模拟服务进程,并启动它。

#chkconfig:2345表示能被这几个级别的init程序运行,88表示启动优先级,22表示关闭优先级


Linux系统启动过程及其修复过程简析

把脚本复制到/etc/init.d/目录下面


Linux系统启动过程及其修复过程简析
添加脚本到服务里面,可以看见脚本默认的启动级别了,这个是根据脚本里面来定义的
Linux系统启动过程及其修复过程简析

可以关闭某些运行的级别


Linux系统启动过程及其修复过程简析

可以查看到/etc/rc.d/rcN.d/文件夹下面的各种K和S打头的testservice文件


Linux系统启动过程及其修复过程简析

可以用chkconfig level N SERVICE on | off 修改服务的开机默认开启状态

可以看见,其实/etc/rc.d/rcN.d/下面的K和S打头的文件就是一个软链接而已~


Linux系统启动过程及其修复过程简析

至于为什么这些只是一个软链接的文件,大家可以参考/etc/rc.d/rc的脚本里面可以看到

例如这里定义K开头的服务,这里只是rc脚本的一部分。


Linux系统启动过程及其修复过程简析
测试此服务开启,关闭
Linux系统启动过程及其修复过程简析
守护进程:xinetd管理的服务(很多的服务依赖于此服务)

service 命令:手动管理服务

service 服务start|stop|restart

service status-all

瞬态(Transient)服务被xinetd进程所管理

进入的请求首先被xinetd代理

配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>

与libwrap.so文件链接

用chkconfig控制的服务:

chkconfigtftpon


Linux系统启动过程及其修复过程简析

Viewing all articles
Browse latest Browse all 11063

Trending Articles