Linux学习:CentOS 6启动过程

 

转载:https://blog.csdn.net/Woodrow1994/article/details/79412343

我们平时使用Linux系统,点击电源键,电脑开机到我们输入账号密码直接使用操作系统,其中经过了一列的步骤,那我们在输入账号密码之前,我们的计算机都进行了什么样的操作呢,接下来我们来了解一下Linux的启动操作流程。

Linux内核组成

Linux内核特点:

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

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

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

组成部分:

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

ramdisk:辅助的伪根系统

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

CentOS 6,7: /boot/initramfs-VERSION-release.img

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

Centos6启动大致流程

1.post加电自检

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

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

在加电自检完成后,计算机就会找到引导记录,由引导记录继续开机的进一步操作。

2.Boot Sequence

在计算机真正启动之前,我们的计算机会先确定开机启动项是什么,这个一般在BIOSboot里面设定的,不同的版本的BIOS设定方式不一样,但是效果都是一样的。一般我们的电脑就是硬盘启动。当计算机这一步执行后,就会找到硬盘中的读取硬盘,先找到的就是0扇区,即前446字节。

3.MBR引导

MBR(Master Boot Record)MBR记录一般是在磁盘0磁道0扇区,共512个字节。前446个字节是BootLoder,后 4*16 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。在加电自检后,就会开始这一部分的内容,从这里开始才是真正的开机引导。

计算机不知道我们的系统在哪里,所以需要程序进行引导,这个引导的程序就叫boot loader,不同操作系统的boot loader是不同的,windows使用的boot loader程序是ntloader,只能对windows进行引导不能对其他系统进行引导,而Linuxboot loaderGRUB,可以对其他操作系统进行引导(包括windows),而MBR446就属于grub一部分。

4.Grub启动

前面说到,MBR446字节的东西就是grub的一部分也就是说,我们的计算机启动磁盘后会找到grub,我们看看grub文件夹中的内容。

grub程序主要是由device.mapmenu.lststage1,stage2,以及一系列的stage1_5组成。

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

menu.lis:是grub.conf的链接文件,但是这个名字我觉得更与它的功能接近,就是菜单列表。它设置了可以选择的内核菜单。存放于stage2中。

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

initramfs 是以 gzip 压缩的cpio格式的文件。内核启动时将他作为一个临时的根文件系统。 grub stage2 initrd加载到内存里,然后将其中的内容释放到内存中,内核便去执行init脚本,这时内核将控制权交给了init文件处理。 init它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

制作initramfs文件

有时候我们如果误删除或者其他原因导致initramfs这个文件丢失,我们可以通过命令将其找回,示范如下:

  • (1) mkinitrd命令

为当前正在使用的内核重新制作ramdisk文件

mkinitrd /boot/initramfs-$(uname-r).img $(uname-r)

  • (2) dracut命令

为当前正在使用的内核重新制作ramdisk文件

dracut /boot/initramfs-$(uname-r).img $(uname-r)

  • 推荐使用mkinitrd,具有更好的兼容性

grub.conf的参数

default默认启动的内核title, 0 表示是第一个

timeout默认等待时间

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

hiddenmenu隐藏菜单

title标题名,用户可自定义

root(hd0,0)指定 grub 的根位置

(hd#,#)

hd#: 磁盘编号,用数字表示;从0开始编号

#: 分区编号,用数字表示; 0开始编号

(hd0,0) 第一块硬盘,第一个分区

kernel指定 kernel 文件的位置,还要指出 root(系统启动后) 的位置,挂载方式 ro,这项很关键。加载后会启动 init 进程。

initrd 在内核启动过程中装载根文件系统时有用

password [--md5|--encrypted ] STRING: 启动选定的内核或操作系统时进行认证

cat /proc/cmdline 内核参数

内核参数文档:

/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

 

grub的功能

提供启动菜单、并提供交互式接口

  • a:内核参数
  • e: 编辑模式,用于编辑菜单
  • c: 命令模式,交互式接口

e: 编辑模式,用于编辑菜单

  • b:重新启动
  • e:编辑参数
  • 使用命令行交互式
  • o:在后面插入新行
  • O:在之前插入新行
  • d:返回上级菜单

c: 命令模式,交互式接口

在此模式下,我们可以交互式的修改内核参数

grub的命令行接口

help: 获取帮助列表

help KEYWORD: 详细帮助信息find (hd#,#)/PATH/TO/SOMEFILE

root (hd#,#)

我们可以手动在grub命令行接口启动系统

grub> root (hd#,#)

grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

grub> initrd /initramfs-VERSION-RELEASE.img

grub> boot

加载用户选择的内核或操作系统

  • 允许传递参数给内核
  • 可隐藏启动菜单
  • 其中的一个应用就是我们可以以此进入单用户模式,修改root密码。

为菜单提供了保护机制

[root@CT691 ~]#grub-md5-crypt

Password:

Retype password:

$1$s7uSV/$ktCJ6EIbW6ykjEGbN54cH1

我们将产生的密码加到grub.conf中去:

然后重新启动一下模式,我们看一下效果:

加入 grub.conf 文件的位置不同,加密效果也不一样。

  • 加入到 title 之前的话,会加密整个菜单。
  • 加入到 title 指内的话,会加密对应的操作系统的入口。

进入救援模式(光盘启动),然后直接删除root密码(/etc/passwd下的),空口令直接登录

安装grub

grub-install命令

安装grub stage1stage1_5/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下

grub-install --root-directory=DIR /dev/DISK

我们来一个简单的实验:

第一步删除/boot

第二步安装内核

rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force

第三步安装grub

第四步配置grub.conf

[root@CT691 grub]#vim grub.conf

default=0

timeout=10

title centOS 6(duzhaoqi 6.9)

root (hd0,0)

kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=51be13b4-c669-480a-82bb-efb9337f9c38

initrd /initramfs-2.6.32-696.el6.x86_64.img

第五步重启

grub交互式

grub> root (hd#,#)

grub> setup (hd#)

5.启动 init 进程

init 进程是系统启动的第一个进程。其他进程都是有此进程控制fork出来的,也就是说,init是其他进程的祖先PID=1。当然,PID=0进程我们称为空闲进程是属于内核的。

init作用:

  1. 初始运行级别(RUN LEVEL)
  1. 系统初始化脚本
  1. 对应运行级别的脚本目录
  1. 捕获某个关键字顺序
  1. 定义UPS电源终端/恢复脚本
  1. 在虚拟控制台生成getty
  1. 在运行级别x初始化X

切换级别:init #

查看级别:runlevel; who -r

centOS5 centOS6上都有init程序,但是已经不是一个东西了,我们来查看一下:

init进程启动以后,接下来的工作是读取配置和启动服务

1. 读取配置文件/etc/inittab /etc/init/*.conf

因为在CentOS6inittab文件中就留下了一行启动级别,其他东西放到了/etc/init/*.conf,所以我们以CentOS5inittab为例讲解内容都是一样的。

#

# inittab This file describes how the INIT process should set up

# the system in a certain run-level.

#

# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>

# Modified for RHS Linux by Marc Ewing and Donnie Barnes

#

# Default runlevel. The runlevels used by RHS 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:5:initdefault:

# System initialization.

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

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

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

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

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

# Trap CTRL-ALT-DELETE

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

# When our UPS tells us power has failed, assume we have a few minutes

# of power left. Schedule a shutdown for 2 minutes from now.

# This does, of course, assume you have powerd installed and your

# UPS connected and working correctly.

pf::powerfail:/sbin/shutdown -f -h +2"Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

 

# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5

x:5:respawn:/etc/X11/prefdm -nodaemon

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

id:runlevel:action:process

  1. action:
  1. wait: 切换至此级别运行一次
  1. respawn:此process终止,就重新启动之
  1. initdefault:设定默认运行级别;process省略
  1. sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit

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

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

  • (1) 设置主机名
  • (2) 设置欢迎信息
  • (3) 激活udevselinux
  • (4) 挂载/etc/fstab文件中定义的文件系统
  • (5) 检测根文件系统,并以读写方式重新挂载根文件系统
  • (6) 设置系统时钟
  • (7) 激活swap设备
  • (8) 根据/etc/sysctl.conf文件设置内核参数
  • (9) 激活lvmsoftware raid设备
  • (10) 加载额外设备的驱动程序
  • (11) 清理操作

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

前面的10就是一格标识,没有啥作用,在上面一行中,我们有七种启动级别,启动不同的启动级别,就会调用不同的脚本,这个就会调用/etc/rc0.d/中的脚本,启动相对用的进程或服务

1:2345:respawn:/sbin/mingetty tty1

这就是我们的终端设置,我们可以看到,一共有六个终端,当然,我们也可以手动添加。

6.登录

当配置文件读取完成后,就会给我们显示一个登录窗口,我们就可以通过这个登录窗口登陆上操作系统,进行我们所需要的操作。

 

 

猜你喜欢

转载自blog.csdn.net/byrgzs/article/details/83539638
今日推荐