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 hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文