文档章节

[Linux学习笔记] Linux系统引导流程(一)

LSantorini
 LSantorini
发布于 2015/11/17 22:10
字数 2775
阅读 117
收藏 15

前面我们已经介绍过以CentOS为例的Linux系统的安装以及Linux常用命令的使用,本节内容我们将介绍Linux系统引导流程。当按下电源的那一刻,到我们看到用户界面,这其中都发生了些什么呢?赶快来一探究竟.

下图为Linux系统引导流程过程图: 

以下对Linux引导流程过程做一个简单的说明: 

1. POST加电自检

POST(POST ON SELF TEST)首先对每一个设备进行检查,完成后会寻找存有引导记录的设备,找到读入操作系统的引导记录,将系统控制权交给引导记录。

2. MBR引导

MBR(Master Boot Record),MBR记录一般是在磁盘0磁道1扇区,共512字节,前446个字节是BootLoader,后面的4*16个字节是存放分区信息的,最后两个字节是校验信息的 。

3. GRUB加载内核

GRUB(GRand Unified Bootloader)就是MBR前446个字节,是Booloader的一种,它的作用是选择要启动的内核。

GRUB用于载入内核,查看GRUB配置文件: CentOS-7系统: /boot/grub2/grub.cfg

内核启动后完成了两件事: (1)驱动硬件; (2)启动init进程

4. 启动init进程

init启动后读取inittab配置文件,执行缺省运行级别,从而继续引导进程。在UNIX系统中,init是第一个可以存在的进程,它的PID恒为1,但它也必须想一个更高级的功能负责: PID为0的内核调度器(分配CPU时间)。

这个过程包含了多个步骤,以CentOS-7以前的系统为例说明:

    (1) 读取/etc/inittab,选择默认级别<常用的运行级别有3:表示多用户; 5:X Window环境,关于运行级别的内容放在本文最后,并且十分重要>

    (2) 执行初始化系统脚本,这个脚本在/etc/rc.d/rc.sysinit中

    (3) 执行/etc/rc.d/rcX.d/下的脚本<默认级别是5,则会读取rc5.d下的所有脚本,来控制系统启动的时候启动或关闭那些服务>

        这里的脚本大致分为两类,以S开头的和以K开头的。 

        S:代表开机启动的 

        K:表示开机时不启动的 

        文件命令格式,例如: 

        S01sysstat S: 开机启动; 01: 启动次序; sysstat: 启动脚本名。注意: 该文件为软链接

    (4) 执行/etc/rc.d/rc.local脚本,这是启动过程中最后启动的一个脚本,然后会执行/bin/login 登陆用户。

下面图片中将更具体的展现了系统启动过程中经历的过程:


注意:

CentOS-7版本以前系统inittab配置文件存放目录: /etc/inittab

CentOS-7系统inittab配置文件也存放在/etc/inittab,但并未做实际配置,而是引向了运行级别配置文件

-------------------------------------------------------------------------------- L v S a n t o r i n i 的 分 割 线 -------------------------------------------------------------------------------- 

设置开机自启动服务或程序:

(1) 确定系统运行级别

(2) 编写脚本文件,并赋予文件可执行权限

(3) 创建对应的软连接文件置于在对应的rcN.d目录下(N表示运行级别: 0,1,2,3,4,5,6)

    注意: 软连接文件名要以启动脚本命名规范来命名,例如: S10sysstat

如此操作,下次设备重启就可以执行自定义的启动脚本了。

举例(CentOS 7以前版本)<此段由于无设备环境,未验证,读者可看下边用chkconfig添加启动服务的示例>:

[root@localhost rc5.d]# cd /etc/rc.d/rc5.d
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# vi /etc/rc.d/init.d/start.script 
[root@localhost rc5.d]# cat /etc/rc.d/init.d/start.script 
date >> /home/santorini/out.log
who >> /home/santorini/out.log
ls -l /etc >> /home/santorini/out.log
[root@localhost rc5.d]# ll /etc/rc.d/init.d/start.script 
-rw-r--r--. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script
[root@localhost rc5.d]# chmod 755 /etc/rc.d/init.d/start.script 
[root@localhost rc5.d]# ll /etc/rc.d/init.d/start.script 
-rwxr-xr-x. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script
[root@localhost rc5.d]# ln -s /etc/rc.d/init.d/start.script S20defineBySantorini
[root@localhost rc5.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 29 Nov 16 21:39 S20defineBySantorini -> /etc/rc.d/init.d/start.script

在介绍完下面的chkconfig命令后,我们将给出CentOS-7系统如何运行安装自启动服务.

chkconfig命令:

chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接.

语法: 
chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset]
参数用法:
 --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据;
 --del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据;
 --level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关闭;
详细:
chkconfig --list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。
chkconfig --add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。
chkconfig --del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。
chkconfig [--level levels] name [on/off/reset]:设置某一服务在指定的运行级别是启动,停止还是重置。

CentOS-7系统安装自启动服务:

[root@localhost init.d]# pwd
/etc/rc.d/init.d
[root@localhost init.d]# vi defined 
[root@localhost init.d]# cat defined 
#!/bin/bash
#chkconfig: 5 10 90   (注意10表示启动优先级,90表示停止优先级, 5表示运行级别)
#description: define
date >> /Hello.log
ls -l /etc >> /Hello.log
[root@localhost init.d]# ls -l
total 36
-rw-r--r--. 1 root root    97 Nov 17 21:49 defined
-rw-r--r--. 1 root root 13430 Jan 15  2015 functions
-rwxr-xr-x. 1 root root  2989 Jan 15  2015 netconsole
-rwxr-xr-x. 1 root root  6470 Jan 15  2015 network
-rw-r--r--. 1 root root  1160 Mar  6  2015 README
[root@localhost init.d]# chmod 755 defined 
[root@localhost init.d]# ls -l
total 36
-rwxr-xr-x. 1 root root    97 Nov 17 21:49 defined
-rw-r--r--. 1 root root 13430 Jan 15  2015 functions
-rwxr-xr-x. 1 root root  2989 Jan 15  2015 netconsole
-rwxr-xr-x. 1 root root  6470 Jan 15  2015 network
-rw-r--r--. 1 root root  1160 Mar  6  2015 README
[root@localhost init.d]# chkconfig --add defined 
[root@localhost init.d]# cd /etc/rc.d/rc5.d
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Nov 17 21:43 S10defined -> ../init.d/defined
lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network

CentOS-7安装自启动服务步骤:

(1) 在/etc/init.d目录下新建开机启动时要执行的脚本,并赋予执行权限

(2) 使用chkconfig --add 命令添加启动服务.(执行完此命令后将在对应的运行级别rcN.d下生成相应的软链接文件,并且软链接指向/etc/init.d下刚才创建的执行脚本)

ntsysv命令:

ntsysv:类似图形界面管理模式来设置开机启动服务。(RedHat特有的,基本上chkconfig就很好用了)

注意: 执行此命令需要root用户权限

总结一下功能按钮:

上下键:可以在中间的方框当中,在各个服务之间移动;

空格键:可以用来选择或取消你所需要或需要取消的服务,[*]表示开机启动;

tab键:可以在方框、OK、Cancel之间移动;

[F1]键:可以显示该服务的说明。

[root@localhost ~]# runlevel   ##查看当前运行级别
N 5
[root@localhost ~]# ntsysv --level 3   ##设置运行级别为3的开机启动项
[root@localhost ~]# ntsysv    ##设置当前运行级别的开机启动项

下图为键入ntsysv后显示的类图形界面:

+++++++++++++++++++++++++++++++++++++++++++ O T H E R   I N T R O D U C T I O N ++++++++++++++++++++++++++++++++++++++++++++++++

相关概念:

CMOS: 在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。

硬件时钟(hwclock)和软件时钟(系统时间):

[root@localhost ~]# date   ##软件时钟
Sat Nov 14 08:28:12 CST 2015
[root@localhost ~]# hwclock   ##硬件时钟
Sat 14 Nov 2015 08:27:35 AM CST  -0.192386 seconds

软硬件同步时钟及时间设置:

-s, --hctosys        set the system time from the hardware clock  ##将系统时间设置为硬件时钟
-w, --systohc        set the hardware clock from the current system time  ##将硬件时钟设置为系统时间
[root@localhost ~]# hwclock --set --date="2011-08-14 16:45:05"  ##设置硬件时钟时间
[root@localhost ~]# date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]  ##设置系统时间

runlevel(运行级别):

    runlevel 用来表示在init进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示runlevel,它纯粹是一种软件结构。init和 inittab是runlevel影响系统状态的唯一原因。下面简单说明各运行级别runlevel:

0 - halt 关机,让init关闭所有进程并关机;

1 - Single user mode 单用户模式,只能系统管理员进入,没有图形界面,在该模式下处理在有登录用户时不能进行更改的文件;

2 - Multiuser,without NFS 允许系统进入多用户的模式,没有图形界面,但并不支持文件共享,这种模式很少应用;

3 - Full multiuser mode 最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式;

4 - unused 一般不被系统使用;

5 - X11 将系统初始化为专用的X Window终端;

6 - 关闭所有运行的进程并重新启动系统(系统将不断重启).

运行级别的切换:

[root@localhost ~]# init 5

inittab文件剖析:

在inittab中,所有条目采取以下格式:  id:run-levels:action:process

id:标识符,一般为两位字母或数字

run-levels:指定运行级别,可以指定多个

action:指定运行状态

process:指定要运行的脚本/命令

=====

action常用取值:

initdefault: 指定系统缺省启动的运行级别;

sysinit: 系统启动执行process中指定的命令

wait: 执行process中指定的命令,并等其结束在运行其他命令

once: 执行process中指定的命令,不等待其结束

ctrlaltdel: 按下Ctrl+Alt+Del时执行process指定的命令

powerfail: 当出现电源错误时执行process指定的命令,不等待其结束

powerokwait: 当电源恢复时执行process指定的命令

respawn: 一旦process指定的命令终止,便重新运行该命令


© 著作权归作者所有

共有 人打赏支持
LSantorini
粉丝 12
博文 34
码字总数 38213
作品 0
呼和浩特
程序员
关于Windows下删除Linux系统的笔记

本文内容有: 一、windows直接删除linux系统,但未格式化原linux分区为NTFS格式 二、windows直接删除linux系统,直接格式化原linux分区为NTFS格式 三、正确的在windows目录下删除linux系统的...

acmfly
2013/10/23
0
0
Linux内核源码学习 (0)- 源代码的结构

截止2012年11月4日,Linux的最新稳定版本为3.6.5,可以从Linux官方网站(http://www.kernel.org/)下载最新的版本,我所研究的内核版本是2.6.34.13,这一系列笔记都是对这个版本的内核进行分...

notishell
2013/01/02
0
0
重装Windows后找回丢失的Linux启动项

众所周知,安装Windows和linux双系统的时候最好是先装Windows,然后安装linux。因为linux可以寻找硬盘下的Windows系统,从而显示引导菜单。而霸道的Windows直接无视其他系统。 但是,对于Win...

独-奏
2012/09/13
0
0
KVM虚拟化学习笔记系列文章列表

kvm虚拟化学习笔记(一)之kvm虚拟化环境安装 http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linux kvm虚拟机安装 http://koumm.blog.51cto.com/703525/1289627 kvm虚拟...

蓝狐乐队
2015/03/19
0
0
新手玩Linux ---- 从Linux From Scratch开始学习linux(二)

好多新手朋友不明白Linux的分区是怎么回事,看书有时候看的一头雾水,新手么现在了解的那么复杂了反而会打击大家的学习积极性,所以大家先简单了解下就可以了,复杂的后边会慢慢在应用的时候...

赵臣
2011/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
11
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部