文档章节

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

LSantorini
 LSantorini
发布于 2015/11/17 22:10
字数 2775
阅读 115
收藏 15
点赞 0
评论 0

前面我们已经介绍过以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
呼和浩特
程序员
嵌入式Linux学习基础规划篇

嵌入式的学习是需要日积月累的,是通过一点一滴的积累才能成为大神。下面来介绍一下嵌入式linux学习基础规划,目标是达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质...

创客学院 ⋅ 04/10 ⋅ 0

写给想学Linux系统管理的人

昨天看的一篇帖子,很受启发,今天把它发上来,希望对我们都有所帮助,也希望可以为我们指点明路!(如果你连这篇文章看完的耐心都没有的话,那么我希望你还是不要学linux了) linux太难用了...

happy_teemo ⋅ 04/21 ⋅ 0

抽点时间让我们一起来学linux系统

抽点时间让我们一起来学linux系统 相对于windows,linux有太多的优点,一般大家都知道,比如说开源,稳定等,其实最重要的是,当你真正用起来的时候发现,效率非常高,他是程序员的福音,lin...

linux-tao ⋅ 06/10 ⋅ 0

Linux程序培训课程,带你养成良好的Linux使用习惯

开始Linux的学习之后,请不要用Windows的工作方式来思考问题,因为它们之间确实有很大的不同,比如它们之间的内存管理机制、进程运行机制等都有很大不同,因此抛开Windows的那种思维,用全新...

长沙千锋 ⋅ 05/11 ⋅ 0

Arch Linux 安装指南

1. 前提 为什么推荐Arch Linux?因为它好用呗! 如果想要学习Linux,Arch Linux是个很好的选择。Arch Linux提供了非常详细并且更新及时的Wiki(帮助文档),使用系统的过程中遇到的问题基本上...

清无色 ⋅ 05/14 ⋅ 0

LF Asia公布2017年度中国LinuxCon + ContainerCon + CloudOpen大会日程

这一开源技术盛会将为开发人员、架构师、系统管理员、DevOps、企业高层和其他专业人士提供权威内容 LF Asia今天公布了LinuxCon + ContainerCon + CloudOpen中国(LC3)大会的完整日程,这一集...

玄学酱 ⋅ 04/12 ⋅ 0

学Linux运维自动化无头绪?Linux运维自动化怎么学?

最近几年Linux系统应用越来越广泛,以至于很多人开始热衷学习Linux。但是我们都是从小都是学习windows系统长大的,从windows 98到现在的windows 10,而根据学习windows系统的经验来学习Linux...

长沙千锋 ⋅ 04/12 ⋅ 0

学着学着Linux系统写篇心得

本学期对于linux系统的学习,和自己买的一本《linux就该这么学》这本书,让我对linux有了一定的了解。我知道了linux只是个内核。现在的linux操作系统,都是用这么一个内核,加上其它的应用程...

linuxprobe16 ⋅ 06/03 ⋅ 0

使用系统启动盘装系统,实践经历,以及一点小小的感悟

写在前面 这是一篇于2017.9.26写的有道云笔记,现结合后续的实践整理成博客。 自从接触SLAM后,就离不开Linux操作系统了,而且装系统已经是现代人的必备技能之一,所以在此记录一下自己的经历...

learning_tortosie ⋅ 04/11 ⋅ 0

在Linux上部署PXE远程安装服务

在Linux上部署PXE远程安装服务 实验介绍:在Linux虚拟机环境下,部署PXE远程安装服务,最终实现在另外一台虚拟机中远程安装Linux系统(前提是Linux虚拟机已经部署好yum仓库)。 1、安装TFTP(...

xiaoyaokeyx ⋅ 05/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部