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
linux 系统启动详解(自启动服务、自启动脚本)
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/目录下的链接文件如下图:
linux 系统启动详解(自启动服务、自启动脚本)
这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。比如,我要重启Apache服务器,就运行下面的命令:
 sudo /etc/init.d/apache2 restart
 
/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

配置自启动服务

配置当前开机启动运行级别下的自启动服务 :ntsysv
配置运行级别3下的自启动服务 : ntsysv --level 3
linux 系统启动详解(自启动服务、自启动脚本)
chkconfig命令可设置系统的各种服务(具体的使用不表述了,搜索一下chkconfig命令即可)
linux 系统启动详解(自启动服务、自启动脚本)

systemctl 命令

最近在配置阿里云的centOS7.4 ,已经在使用新的命令systemctl
systemctl命令是系统服务管理器指令,它实际上将 servicechkconfig 这两个命令组合到一起。

任务 旧指令 新指令
使某服务自动启动 chkconfig httpd on systemctl enable httpd.service
使某服务不自动启动 chkconfig httpd off systemctl disable httpd.service
检查服务状态 service httpd status systemctl status httpd.service
显示所有已启动的服务 chkconfig --list systemctl list-units --type=service
启动某服务 service httpd start systemctl start httpd.service
停止某服务 service httpd stop systemctl stop httpd.service
重启某服务 service httpd restart systemctl restart httpd.service

自启动脚本

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

进程

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

ps命令
top命令
kill 命令