本文主要是介绍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系统启动原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!