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
文件,initramfs
是initrd
的替代优化版本,更节省空间更灵活。)
命令 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
命令即可)
systemctl 命令
最近在配置阿里云的centOS7.4 ,已经在使用新的命令systemctl
systemctl
命令是系统服务管理器指令,它实际上将 service
和 chkconfig
这两个命令组合到一起。
任务 | 旧指令 | 新指令 |
---|---|---|
使某服务自动启动 | 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
命令