Linux系统启动原理

2024-04-22 08:04
文章标签 linux 原理 系统启动

本文主要是介绍Linux系统启动原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux系统启动原理

  • 1.Linux系统启动原理
    • 1.1.启动过程
    • 1.2.启动相关文件详解
      • 1.2.1.系统启动文件/etc/grub.conf
      • 1.2.2.系统初始化/etc/rc.d/rc.sysinit
      • 1.2.3./etc/inittab运行级别
      • 1.2.4./etc/rc.d/init.d目录下启动脚本
      • 1.2.5.chkconfig设置开机自启动
      • 1.2.6.chkconfig开机启动示例
      • 1.2.7.systemctl设置开机自启动
      • 1.2.8.通过/etc/rc.d/rc.local添加启动命令

1.Linux系统启动原理

以下以虚拟机中安装redhat-6.x为例介绍启动过程。

1.1.启动过程

1、加载 BIOS 的硬件信息,根据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB; 如果是硬盘为第一引导。
通过点击虚拟机电源-》打开电源时进入固件。或者按F2启动,进入boot。
在这里插入图片描述
在这里插入图片描述
按tab键移动,选择boot选项
在这里插入图片描述
2、读取硬盘中 MBR 的 boot Loader (亦即是 grub,Lilo 等程序);
 硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
在这里插入图片描述
注:磁盘默认一个扇区大小为:512字节。即总字节数为: 446(主引导程序) + 16*4(DPT分区表) + 2(MBR有效标识位)=512
在总共512字节的主引导扇区里包含三部分:
第一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。
第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。

3、GRUB菜单
GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。
a、依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;
b、在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得 run-level 信息;
c、init 执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境 (如网络、时区等);
d、 init 执行 run-level 下各个服务并启动 (script 方式);
e、init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;
f、 init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;
如图:
在这里插入图片描述

1.2.启动相关文件详解

1.2.1.系统启动文件/etc/grub.conf

[root@node103 ~]# vim /boot/grub/grub.conf
[root@node103 ~]# ll /etc/grub.conf
lrwxrwxrwx. 1 root root 19 04月 24 03:25 /etc/grub.conf -> …/boot/grub/grub.conf

1.2.2.系统初始化/etc/rc.d/rc.sysinit

系统初始化,例如 主机名 和/etc/fstab selinux、network等都在这里指定,执行rc.sysinit 完成了包括mount分区、激活swap 、加载modules等重要的工作。

1.2.3./etc/inittab运行级别

init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。

[root@node103 ~]# vim /etc/inittab
[root@node103 ~]# vim /etc/inittab
# Default runlevel. The runlevels used 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:3:initdefault:

运行级定义如下:
0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
1 - 单用户模式
2 - 多用户,没有 NFS
3 - 完全多用户模式(标准的运行级,默认系统启动级别)
4 – 系统保留的
5 - X11 (x window)
6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

1.2.4./etc/rc.d/init.d目录下启动脚本

系统所有启动脚本放置在 /etc/rc.d/init.d下。
rc[0-6].d :放置的是 /etc/rc.d/init.d目录下脚本的链接,对应于不同的runlevel下起不同的服务,这些目录下都 是一些符号连接, 连接到/etc/rc.d /init.d下的一些文件,命名格式是:
S{number}{name}:S开头的表示全部开机执行启动,S开始的文件向脚本传递start参数,number决定执行的顺序,越小越优先。
K{number}{name}:K开头的表示开机不启动,K开始的文件向脚本传递stop参数,number决定执行的顺序,越小越优先。

示例:
1、以/etc/init.d/network为例,查看该文件内容如下:

[root@node103 rc3.d]# vim /etc/init.d/network
#! /bin/bash
#
# network       Bring up/down networking
#
# chkconfig: 2345  10		90

观察chkconfig的那一行, 2345:表示在runlevel 2 3 4 5下被启动, 即启动rc2.d、rc3.d、rc4.d、rc5.d这几个目录下的S10network脚本。
10:是为此服务的启动顺序,越小越优先执行。
90:为关机顺序。
在这里插入图片描述

1、查看/etc/rc相关文件,可以看到rc有rc0-rc6目录。
在这里插入图片描述
2、以/etc/init.d/network为例,该文件与/etc/rc2.d/S10network建立有软连接,即系统在启动时自动启动network.
在这里插入图片描述

1.2.5.chkconfig设置开机自启动

chkconfig相关命令:
在这里插入图片描述
chkconfig –-add 【服务名】 //把服务添加到chkconfig列表
chkconfig --del 【服务名】 //把服务从chkconfig列表中删除
chkconfig 【服务名】 on //开启开机自动启动
chkconfig 【服务名】 off //关闭开机自动启动
chkconfig --list //查看所有chklist中服务
chkconfig --level 2345 【服务名】 【on|off|reset|resetpriorities】

以下是redhat7以前查看方式
查看服务设置方式
[root@node103 ~]# chkconfig --list network
network        	0:关	1:关	2:开	3:开	4:开	5:开	6:关
[root@node103 ~]# 
可以看到network服务在2、3、4、5都设置为开机自启动,0/6为关机。[root@node103 rc3.d]# chkconfig network on
[root@node103 rc3.d]# ls *network*
S10network
[root@node103 rc3.d]# 
#说明,如果在此级别下开机启动,就不再显示其关机顺序了设置开机关闭network服务
[root@node103 rc3.d]# chkconfig network off
[root@node103 rc3.d]# 
[root@node103 rc3.d]# 
[root@node103 rc3.d]# ls *network*
K90network
[root@node103 rc3.d]# 
#说明,如果在此级别下启动就显示关机。

1.2.6.chkconfig开机启动示例

通过以上/etc/init.d目录及/etc/rc[0-6].d目录及相关命令的了解,接下来就可以自己制作脚本设置开机自启动了,以redis服务为例。
步骤:
1、安装redis服务

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -xf redis-5.0.4.tar.gz

2、编写脚本文件,将脚本文件放在/etc/init.d/目录下。

#!/bin/sh
# chkconfig: 2345 10 90  
# description: Start and Stop redis   #找到本机安装redis后,存放redis命令的目录
PATH=/usr/local/bin:/sbin:/usr/bin:/bin#redis的默认端口, 要和下文中的redis.conf中一致
REDISPORT=6379#redis服务端的命令
BASE_HOME=/opt/redis-5.0.4/#redis服务端的命令
EXEC=$BASE_HOME/src/redis-server#redis客户端的命令  这两个一般都在 PATH目录下
REDIS_CLI=$BASE_HOME/src/redis-cli#reids的进程文件生成的位置
PIDFILE=/var/run/redis.pid#redis的配置文件所在的目录 
CONF=$BASE_HOME/redis.conf
#AUTH="1234"  这句没什么用可以不要  function start(){echo "staring redis server..........."ps -ef | grep redis-server | grep -v grepif [ $? -eq 0 ];thenecho "redis server is running......."   elseecho "start redis server"$EXEC $CONF >$BASE_HOME/logs/redis.log 2>&1 &echo "staring redis server success !"ps -ef | grep $EXEC | grep -v grepfiecho "staring redis server end "
}function stop(){echo "stop redis server ......."param=`ps -ef | grep redis-server | grep -v grep | awk  '{print $2}'`if [ "$param" = "" ];thenecho "redis server not running"# exit 1fifor item in ${param[*]}doecho "stop process num: $item"sudo kill -9 $itemecho " stop redis server success"doneecho "staring redis server end "
}function status(){echo "check redis status......."param=`ps -ef | grep redis-server | grep -v grep | awk  '{print $2}'`if [ "$param" = "" ];thenecho "redis server not running"exit 1elseecho "redis server is running"echo $paramfi	echo "check redis server end "
}case "$1" in   start)echo "staring redis server: ${0}"stopstart;;   stop)stop;;status)status		;;                restart)   ${0} stop   ${0} start   ;;   *)   echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  exit 1  
esac

4、通过chkconfig 设置开机自启动。

[root@node103 redis-5.0.4]# chkconfig redis on
[root@node103 redis-5.0.4]# chkconfig --list redis
redis          	0:关	1:关	2:开	3:开	4:开	5:开	6:关
[root@node103 redis-5.0.4]# 

在这里插入图片描述
3、查看在/etc/rc[n].d目录下建立的软连接

#!/bin/sh
# chkconfig: 2345 10 90  
# description: Start and Stop redis   

由于我们chkconfig 设置系统runlevel在 2、3、4、5这几个基本启动时执行,故查看结果如下
在这里插入图片描述
以上表示通过chkconfig设置redis服务开机自启动成功。

1.2.7.systemctl设置开机自启动

以redis服务为例。
步骤:
1、安装redis服务

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -xf redis-5.0.4.tar.gz

2、编写脚本文件,将脚本文件放在/etc/init.d/目录下。
参考以上《chkconfig开机启动示例》,编写redis脚本

3、添加service服务
vim /etc/systemd/system/redis.service

#!/bin/bash#导入路径
export REDIS_HOME=/opt/redis-5.0.4/
export PATH=$PATH:$REDIS_HOME#服务的说明
[Unit]
#描述服务
Description=redis server
#描述服务类别
After=network.target remote-fs.target nss-lookup.target#服务运行参数的设置
[Service]
Environment="REDIS_HOME=$REDIS_HOME"
#forking是后台运行的形式
Type=forking
#启动服务的具体运行命令
ExecStart=/opt/redis-5.0.4/src/redis-server /opt/redis-5.0.4/redis.conf
#重启命令
ExecReload=/bin/kill -s HUP $MAINPID
#停止命令
ExecStop=ps -ef | grep redis-server | grep -v grep | awk '{print $2}' | xargs kill -9
#服务分配独立的临时空间
PrivateTmp=true#服务安装的相关设置,可设置为多用户
[install]
WantedBy=multi-user.target

详细说明:
[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户

参数说明:
Description:描述服务
After:描述服务类别

[Service]服务运行参数的设置
Type=forking是后台运行的形式
User 服务启动用户
Group 服务启动用户组
ExecStart 为服务的具体运行命令
ExecReload 为重启命令
ExecStop 为停止命令
PrivateTmp=True表示给服务分配独立的临时空间

4、sytemctl设置开机自启动

[root@node103 ~]# 
[root@node103 ~]# systemctl daemon-reload
[root@node103 ~]# systemctl enable redis.service
[root@node103 ~]# systemctl start redis.service
[root@node103 ~]#
[root@node103 ~]# ps -ef | grep redis
root      38174      1  0 13:47 ?        00:00:00 /opt/redis-5.0.4/src/redis-server 127.0.0.1:6379
root      38181  30619  0 13:47 pts/2    00:00:00 grep --color=auto redis
[root@node103 ~]# 
[root@node103 ~]# systemctl stop redis.service
[root@node103 ~]# 
[root@node103 ~]# ps -ef | grep redis
root      38203  30619  0 13:48 pts/2    00:00:00 grep --color=auto redis
[root@node103 ~]# 

1.2.8.通过/etc/rc.d/rc.local添加启动命令

    /etc目录:存放系统配置文件,包含所有应用程序的文件,也包含启动、关闭某个特定程序的脚本,例如:/etc/passwd,/etc/init.d/network等。/etc/rc[0-6].d/ 目录中的程序启动之后,表示系统启动完成。但是有一些程序我们是需要在系统启动之后随着系统一起启动的,这时我们并不需要自己把需要启动的服务链接到 /etc/rc[0-6].d/ 目录中,因为系统给我们准备了 /etc/rc.d/rc.local 配置文件。/etc/rc.d/rc.local文件会在Centos系统启动时执行,在每次系统启动时都会执行一次。所以可以把需要开机后执行的命令直接放在 /etc/rc.d/rc.local 配置文件即可。/etc/rc.local与/etc/rc.d/rc.local的关系:/etc/rc.local是/etc/rc.d/rc.local文件的软链接,也就是说他们是同一个文件,即在操作  /etc/rc.local等同于/etc/rc.d/rc.local。由于重启时是以root用户重启,故该文件需要保证root用户有脚本执行权限。

以下以redis服务为例介绍在 /etc/rc.local文件中添加开机启动命令。
1、安装redis服务

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -xf redis-5.0.4.tar.gz

2、编写脚本

 [root@node103 redis-5.0.4]# vim /opt/redis-5.0.4/redis.sh#!/bin/sh
# chkconfig: 2345 10 90  
# description: Start and Stop redis   
# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
# tar -xf redis-5.0.4.tar.gz
# cd redis-5.0.4
# make & make install
##找到本机安装redis后,存放redis命令的目录
PATH=/usr/local/bin:/sbin:/usr/bin:/bin#redis的默认端口, 要和下文中的redis.conf中一致
REDISPORT=6379#redis服务端的命令
BASE_HOME=/opt/redis-5.0.4/#redis服务端的命令
EXEC=$BASE_HOME/src/redis-server#redis客户端的命令  这两个一般都在 PATH目录下
REDIS_CLI=$BASE_HOME/src/redis-cli#reids的进程文件生成的位置
PIDFILE=/var/run/redis.pid#redis的配置文件所在的目录 
CONF=$BASE_HOME/redis.conf
#AUTH="1234"  这句没什么用可以不要  function start(){echo "staring redis server..........."ps -ef | grep redis-server | grep -v grepif [ $? -eq 0 ];thenecho "redis server is running......."   elseecho "start redis server"$EXEC $CONF >$BASE_HOME/logs/redis.log 2>&1 &echo "staring redis server success !"ps -ef | grep $EXEC | grep -v grepfiecho "staring redis server end "
}function stop(){echo "stop redis server ......."param=`ps -ef | grep redis-server | grep -v grep | awk  '{print $2}'`if [ "$param" = "" ];thenecho "redis server not running"# exit 1fifor item in ${param[*]}doecho "stop process num: $item"sudo kill -9 $itemecho " stop redis server success"doneecho "staring redis server end "
}function status(){echo "check redis status......."param=`ps -ef | grep redis-server | grep -v grep | awk  '{print $2}'`if [ "$param" = "" ];thenecho "redis server not running"exit 1elseecho "redis server is running"echo $paramfi	echo "check redis server end "
}case "$1" in   start)echo "staring redis server: ${0}"stopstart;;   stop)stop;;status)status		;;                restart)   ${0} stop   ${0} start   ;;   *)   echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  exit 1  
esac

3、添加开机自启动命令

[root@node103 ~]# 
[root@node103 ~]# vim /etc/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.touch /var/lock/subsys/local
sh /opt/redis-5.0.4/redis.sh start

在这里插入图片描述
4、测试演示

[root@node103 ~]# ps -ef | grep redis
root      39338  30619  0 15:07 pts/2    00:00:00 grep --color=auto redis
[root@node103 ~]# reboot

在这里插入图片描述

这篇关于Linux系统启动原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925225

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li