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 rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet