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的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意