linux+proc+原理,51CTO博客-专业IT技术博客创作平台-技术成就梦想

*****************************》start《**********************************

Linux的启动过程大致可以分为5各部分

1、BOIS加电自检

2、加载主引导程序(MBR)

3、加载次引导程序(GRUB)

4、加载linux内核镜像

5、加载init进程

Linux启动的总揽图:

c951a393c01380612745b50840bc96cc.png

这5个部分具体是怎么协同工作的呢??

一、首先,计算机启动后进行各种硬件设备,然后按照CMOS设置的启动顺序搜索处于活动状态并可以引导的设备。

76047de5562a3ba545a94df0c60a3d3a.png

一般主要以硬盘做引导,硬盘中得主引导记录(master boot record)中保存有引导加载程序。

MBR是一个512字节的扇区,位于硬盘的第一个扇区中。

可以用命令dd查看:

[root@Bruse ~]# dd if=/dev/sda of=mbr.dmp bs=512 count=1

1+0 records in

1+0 records out

512 bytes (512 B) copied, 0.000104006 seconds, 4.9 MB/s

[root@Bruse ~]# od -xa mbr.dmp

0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e

k   H dle dle so   P   < nul   0   8 nul nul so   X so   @

0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006

{   > nul   |   ? nul ack   9 nul stx   s   $   j   ! ack nul

0000040 be00 07be 0438 0b75 c683 8110 fefe 7507

nul   >   > bel   8 eot   u vt etx   F dle soh   ~   ~ bel   u

0000060 ebf3 b416 b002 bb01 7c00 80b2 748a 0203

s   k syn   4 stx   0 soh   ; nul   |   2 nul nl   t etx stx

0000100 0080 8000 d441 0000 0800 90fa f690 80c2

nul nul nul nul   A   T nul nul nul bs   z dle dle   v   B nul

0000120 0275 80b2 59ea 007c 3100 8ec0 8ed8 bcd0

… …

其中dd命令可以读取MBR的内容,然后将读取到的内容写入mbr.dmp文件中。然后以ASCII和十六进制显示文件的内容。

BIOS会把MBR中的引导加载程序加载到内存中去,然后把控制权交给引导加载程序继续启动。

二、加载引导程序

Redhat默认的引导程序是GRUB,其引导过程可以分为2各阶段:1、保存在MBR中的主引导加载程序的加载(MBR是一个512字节的映像,其中包括机器的二进制代码和一个小分区表。MBR的任务就是查找并加载保存在硬盘分区上的次引导加载程序。它是通过分区表来查找活动分区,然后将活动分区的次引导加载程序从设备读入到内存中并运行),2、次引导加载程序(也叫内核加载程序),这个阶段只要是加载linux的内核。一旦内核加载成功就会出现下面的界面:

fbaa706bbfcc8857822333d037b29c66.png

这个界面中可以用上下左右的方向键选择你想启动的系统或者内核。不选择的话,默认过5秒会进入到grub.conf中设置的系统,GRUB确定启动的系统后,他就会定位相应的内核映像所在的/boot/目录。

内核映像文件的格式:/boot/vmlinuz-。例如centOS5.5的内核映像文件就是:/boot/vmlinuz-2.6.18-194.el5

接着GRUB会把内核的映像加载到内存中去。内核映像不是一个可以执行的内核,而是一个压缩的内核映像。GRUB会把这个内核的映像解压,加载到内存中并执行,至此GRUB的任务完成了。

接着我们看一下GRUB的配置:

GRUB的配置是通过/boot/grub/grub.conf来完成的,我们看看grub.conf

#vim /boot/grub/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/VolGroup00/LogVol00

#initrd /initrd-version.img

#boot=/dev/sda//位置

default=0

//启动默认的操作系统,0是title中设置的第一个操作系统,即CentOS

timeout=5//timeout设置超时时间,超过5秒后自动启动default设置的系统

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz// splashp_w_picpath设置GRUB的背景图片

hiddenmenu// hiddenmenu可以隐藏启动菜单,超时后进入默认的系统

title CentOS (2.6.18-194.el5)//定义GRUB菜单中的第一个操作系统

root (hd0,0)

kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet

initrd /initrd-2.6.18-194.el5.img

title other//定义GRUB中的第二个操作系统

rootnoverify (hd0,5)

chainoader +1

* GRUB中计数是以0开始的,0表示第一个。所以配置文件中的(hd0,0)表示的就是第一块硬盘的第一个主分区

三、内核映像

GRUB把内核映像加入到内存中后,并把控制权交给linux内核后,Linux内核获取控制权后,会按照下面的步骤继续引导操作系统

1、内核映像先检测系统中的硬件设备,包括CPU、内存、硬盘,并对这些设备进行初始化。

2、内核映像对自身解压,同时加载设备驱动。

3、初始化文件系统相关的虚拟设备,如LVM\RAID等

4、装载/文件系统,把根文件系统挂载到根目录下

5、完成引导后,linux内核会在其进程空间加载init进程,并把控制权交给init进程

内核映像引导过程:

9d3fd907726072a166bcdda23dbe0a2b.png

四、init进程加载

(1)什么是init进程

Init进程是linux系统中进程的起点,内核完成引导后便会加载init进程,进程号永远是1.init进程启动后,首先会初始化操作系统,并启动特定的运行级别(Runlevel)下的自动运行程序。Init进程对应的执行文件是/sbin/init.init进程是系统中进程的发起者和控制着,其他的进程都是由init进程衍生出来的。

(2)init进程的作用

Init进程一般有两个作用:1、作为所有进程的父进程的参考对象。2、运行不同级别的程序

由于init进程永远不会被终止,所以,系统会在必要的时候把他作为父进程进行参考。

除过init进程以外所有进程都有父进程。当某个进程在他衍生出来的所有子进程结束之前就被终止了,就会出现以init进程作为父进程。

[root@Bruse ~]# ps -ef | more

UIDPID PPID C STIME TTY          TIME CMD

root1     0 0 23:18 ?        00:00:01 init [5]          //init进程

root2     1 0 23:18 ?        00:00:00 [migration/0] // init作为父进程的进程

root3     1 0 23:18 ?        00:00:00 [ksoftirqd/0]

root4     1 0 23:18 ?        00:00:00 [watchdog/0]

root5     1 0 23:18 ?        00:00:00 [events/0]

root6     1 0 23:18 ?        00:00:00 [khelper]

root7     1 0 23:18 ?        00:00:00 [kthread]

root10     7 0 23:18 ?        00:00:00 [kblockd/0]

root11     7 0 23:18 ?        00:00:00 [kacpid]

root175     7 0 23:18 ?        00:00:00 [cqueue/0]

这些进程中PPID=1的进程有的是由init进程派生出来的,有的是由于原父进程被终止了。

运行不同级别的程序:init的另一个作用就是初始化操作系统,进入特定的运行级别运行相应的程序,对各个程序进行管理。

(3)init进程的引导过程

Init进程取得控制权后,首先会执行/etc/rc.d/rc.sysinit脚本,根据脚本中的代码配置环境变量、网络、启用swap、检查并挂载文件系统、执行其他初始化所必须得步骤。

#cat /etc/rc.d/rc.sysinit | more

#!/bin/bash

#

# /etc/rc.d/rc.sysinit - run once at boot time

#

# Taken in part from Miquel van Smoorenburg's bcheckrc.

#

HOSTNAME=`/bin/hostname`//设置主机名

HOSTTYPE=`uname -m`//设置系统类型

unamer=`uname -r`//用unamer保存uname –r的结果

set -m

if [ -f /etc/sysconfig/network ]; then//初始化网络配置

. /etc/sysconfig/network

fi

if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then //设置主机名,如果没有,就以//calhost作为主机名

HOSTNAME=localhost

fi

if [ ! -e /proc/mounts ]; then //挂载系统文件

mount -n -t proc /proc /proc

mount -n -t sysfs /sys /sys >/dev/null 2>&1

--More—

接下来init进程会执行/etc/inittab脚本中的代码,这个脚本中定义了linux的运行级别。以及每个级别对应的引导步骤。

[root@Bruse ~]# cat /etc/inittab | more

#

# inittabThis file describes how the INIT process should set up

#the system in a certain run-level.     // init文件描述

#

# Author:Miquel van Smoorenburg,

#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)

//多用户模式,没nfs

#3 - Full multiuser mode                  //完全多用户模式

#4 – unused                            //未使用

#5 - X11                               //图形环境

#6 - reboot (Do NOT set initdefault to this)   //重启系统

#

id:3:initdefault://默认启动级别为3

# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit //调用sysinit:/etc/rc.d/rc.sysinit脚本

l0:0:wait:/etc/rc.d/rc 0//处于0级的操作

l1:1:wait:/etc/rc.d/rc 1//处于1级的操作

l2:2:wait:/etc/rc.d/rc 2//处于2级的操作

l3:3:wait:/etc/rc.d/rc 3//处于3级的操作

l4:4:wait:/etc/rc.d/rc 4//处于4级的操作

l5:5:wait:/etc/rc.d/rc 5//处于5级的操作

l6:6:wait:/etc/rc.d/rc 6//处于6级的操作

# Trap CTRL-ALT-DELETE

ca::ctrlaltdel:/sbin/shutdown -t3 -r now//允许使用CTRL-ALT-DELETE组合键

# 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"

// 当收到来自UPS的断电警告2分钟后关机

# 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

。。。。。。。

每个系统运行的级别都不一样,他们各自的脚本在

l0:0:wait:/etc/rc.d/rc 0//处于0级的操作

l1:1:wait:/etc/rc.d/rc 1//处于1级的操作

l2:2:wait:/etc/rc.d/rc 2//处于2级的操作

l3:3:wait:/etc/rc.d/rc 3//处于3级的操作

l4:4:wait:/etc/rc.d/rc 4//处于4级的操作

l5:5:wait:/etc/rc.d/rc 5//处于5级的操作

l6:6:wait:/etc/rc.d/rc 6//处于6级的操作

这些脚本下的文件都是连接文件,指向/etc/init.d/…

这是init 5下的一些东东:

[root@Bruse ~]# cd /etc/rc.d/rc5.d/

[root@Bruse rc5.d]# ls -l

总计 316

lrwxrwxrwx 1 root root 17 04-10 07:53 K01dnsmasq -> ../init.d/dnsmasq

lrwxrwxrwx 1 root root 24 04-10 07:56 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd

lrwxrwxrwx 1 root root 24 04-10 08:00 K02NetworkManager -> ../init.d/NetworkManager

lrwxrwxrwx 1 root root 17 04-10 07:57 K02oddjobd -> ../init.d/oddjobd

lrwxrwxrwx 1 root root 16 04-10 07:54 K05conman -> ../init.d/conman

lrwxrwxrwx 1 root root 19 04-10 07:53 K05saslauthd -> ../init.d/saslauthd

lrwxrwxrwx 1 root root 17 04-10 07:53 K05wdaemon -> ../init.d/wdaemon

lrwxrwxrwx 1 root root 16 04-10 07:54 K10psacct -> ../init.d/psacct

lrwxrwxrwx 1 root root 14 04-10 07:52 K10tcsd -> ../init.d/tcsd

lrwxrwxrwx 1 root root 13 04-10 07:56 K20nfs -> ../init.d/nfs

lrwxrwxrwx 1 root root 15 04-10 07:47 K20rwhod -> ../init.d/rwhod

lrwxrwxrwx 1 root root 14 04-10 07:59 K24irda -> ../init.d/irda

lrwxrwxrwx 1 root root 18 04-24 01:16 K30sendmail -> ../init.d/sendmail

lrwxrwxrwx 1 root root 13 04-10 07:53 K35smb -> ../init.d/smb

oot

lrwxrwxrwx 1 root root 19 04-10 07:59 S25bluetooth -> ../init.d/bluetooth

lrwxrwxrwx 1 root root 15 04-10 07:53 S25netfs -> ../init.d/netfs

lrwxrwxrwx 1 root root 15 04-10 07:56 S25pcscd -> ../init.d/pcscd

lrwxrwxrwx 1 root root 15 04-10 07:53 S26acpid -> ../init.d/acpid

lrwxrwxrwx 1 root root 14 04-10 08:02 S26apmd -> ../init.d/apmd

lrwxrwxrwx 1 root root 19 04-10 07:59 S26haldaemon -> ../init.d/haldaemon

lrwxrwxrwx 1 root root 14 04-10 07:59 S26hidd -> ../init.d/hidd

lrwxrwxrwx 1 root root 20 04-10 07:46 S26lm_sensors -> ../init.d/lm_sensors

lrwxrwxrwx 1 root root 16 04-10 07:54 S28autofs -> ../init.d/autofs

lrwxrwxrwx 1 root root 15 04-10 07:54 S50hplip -> ../init.d/hplip

这些文件的命名都是以Snn服务名或者Knn服务名命名的,对S开头的文件,系统会启动加载这些服务,nn表是执行脚本的顺序(有小到大)。而K开头的文件,系统会终止这些服务。

nn表是执行脚本的顺序(由大到小)。

加载完成这些程序后linux在init5级别上启动完成 。。。

*******************************》done《**********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值