linux 系统启动详解

系统启动流程

BIOS ==> MBR:Boot Code ==> 执行引导程序-GRUB ==> 加载内核 ==> 运行 init ==> runlevel

BIOS (Basic Input Output System)

称之为基本输入输出系统,一般保存在主板的BIOS芯片中。BIOS负责检查硬件(自检)并且查找可启动设备。可启动设备在BIOS设置中进行定义,如USB、CDROM、HD

MBR

BIOS 找到可启动设备后执行其引导代码。引导代码为MBR的前446字节。

GRUB

Grub是现在linux使用的主流引导程序。可以用来引导现在几乎所有的操作系统。Grub的相关文件保存在/boot/grub 目录中,Grub的配置文件为/boot/grub/grub.conf
这里写图片描述
CentOS/RHEL 7 时升级到 GRUB2

加载内核kernel

MBR的引导代码将负责找到并加载linux内核。linux内核保存在/boot/vmlinuz*。一般还会加载内核模块打包文件/boot/initramfs*.img。(linux为了保持kernel精简,将一些不常用的驱动。功能编译成模块,在需要的时候动态加载,而这些模块被打包为initramfs文件。早期linux使用initrd文件,initramfsinitrd的替代优化版本,更节省空间更灵活。)
命令 dmesg 可以查看本次启动时内核的输出信息。(对应日志文件/var/log/dmesg

运行 init

init 是linux系统中运行的第一个进程(PID = 1),init是所有进程的父进程。调用 /etc/rc.d/rc.sysinit 负责对系统进行初始化 ,挂载文件系统,并且根据运行级别启动相应服务。

运行级别 runlevel

0:关机
1:单用户(找回丢失密码)
2:多用户状态没有网络服务
3:多用户状态有网络服务
4:空(保留)
5:图形界面
6:系统重启

可以通过/etc/inittab 配置文件修改默认的运行级别,其他的配置项在目录/etc/init/目录下。
每个运行级别对应对应的启动服务保存在/etc/rc.d/rc[0123456].d
命令runlevel 可显示上一个运行级别及当前运行级别
命令init 可切换运行级别,如切换到运行级别 3 init 3

加载开机启动程序

前面提到,七种预设的"运行级别"各自有一个目录,存放需要开机启动的程序。不难想到,如果多个"运行级别"需要启动同一个程序,那么这个程序的启动脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修改启动脚本,岂不是每个目录都要改一遍?
Linux的解决办法,就是七个 /etc/rcN.d==> /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ==>/etc/rc.d/init.d,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。

/etc/rc.d/rc3.d/目录下的链接文件如下图:
这里写图片描述
这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。比如,我要重启Apache服务器,就运行下面的命令:
 sudo /etc/init.d/apache2 restart
 
/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

配置自启动服务

配置当前开机启动运行级别下的自启动服务 :ntsysv
配置运行级别3下的自启动服务 : ntsysv --level 3
这里写图片描述
chkconfig命令可设置系统的各种服务(具体的使用不表述了,搜索一下chkconfig命令即可)
这里写图片描述

自启动脚本

说白了开机启动会运行/etc/rc.d/rc.local文件,编辑该文件,在尾部加上需要运行的命令或脚本即可(确保rc.local有可运行权限)

进程

ps命令是Process Status的缩写,ps命令列出的是当前那些进程的快照,如果想要动态的显示进程信息,就可以使用top命令。

ps命令
top命令
kill 命令

猜你喜欢

转载自blog.csdn.net/weicy1510/article/details/81332134