一、启动流程简介
1、流程
通电->bios->引导->操作系统->/boot->init进程->运行级别->/etc/init.d->用户登录->login shell
2、流程简介
在设备通电以后,首先运行主板flash Memory中的程序,主要任务是检测电脑的基础组件,如主板、内存和硬盘等。当基础组件检测完成后,找到引导设备后,电脑就会进入kernel启动阶段。kernel启动阶段通过MBR中的引导程序(LILO or GRUB)把内核映像装入内存运行。Kernel启动阶段完成后,就开始启动系统的第一个进程init,它完成一系统初始化工作,使Linux系统可以正常使用。init进程是Linux系统所有进程的父进程。
2.1 初始化阶段内核文件加载以后,开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。
2.2 确定运行级别(runlevel命令查看),根据运行级别确定启动什么进程,不通级别对应在/etc/目录下有一个运行目录,"rc级别.d",此目录下就是接下来会启动进程的脚本的链接文件,真正的脚本在`/etc/ini.d/脚本文件`。
2.3 `/etc/rc级别.d`目录下文件的命名规则例如:`S01motd`,其中"S"代表启动,“01”启动顺序的编号,“motd”服务的名字。也就是编号越小越先执行,编号相同的比较服务的名字,决定先后顺序,
2.4 上述阶段执行完毕,就是用户登录阶段,分为命令行登录、ssh登录 、图形界面登录
2.5 登录后进入一个默认的shell,debian系统默认的shell是bash,根据版本不同会有不同的默认shell
2.6 到此基本上就启动完成了。
参考:[Linux的启动流程简析(以Debian为例)](https://www.pianshen.com/article/2168148574/)
可以用ls -l /sbin/init
确定是init还是systemd管理服务
二、基于init.d服务设置过程
了解了启动过程,那么我们的目的是希望系统启动时执行我们自己的脚本,那么我们在系统执行init.d目录下脚本的时候,添加我们自己的脚本,以下是一个简单的模板。
1、编写自己的脚本文件
#!/bin/bash
#下面这部分必须添加,否则无法设置启动项时会报错
### BEGIN INIT INFO
# Provides: ip_sh
# Required-start: $remote_fs $syslog
# Required-stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: sh ip truecrypt
### END INIT INFO
do_start()
{
#执行的内容
}
do_stop()
{
#关闭的内容
}
do_status()
{
#获取状态
}
case "$1" in
start)
#do start process
do_start
;;
stop)
#do stop process
do_stop
;;
restart)
#stop process
do_stop
#start process
do_start
;;
status)
#output the process status
do_status
;;
*)
echo "unknow param following,you can input start/restart/stop/status" || true
exit 1
esac
exit 0
- 将脚本移动到
/etc/init.d/
目录,并执行insserv 脚本文件名
设置启动项,设置完成会在对应级别目录产生我们脚本的链接文件。 - sync将修改内容写入到磁盘,重启系统即可。
三、基于systemd服务的设置流程
1、进入启动目录:/etc/systemd/system/
2、编写启动脚本并保存,下述是一个简单的模板
[Unit]
#描述服务的简短说明,用于标识和识别服务。
Description=My Service
#指定服务应该在哪个目标之后启动。network.target服务将在网络目标(network.target)之后启动,确保网络已经可用。
After=network.target
[Service]
#指定要执行的命令或脚本的路径。
ExecStart=/path/to/your/script.sh
#指定服务的工作目录,即执行命令或脚本时的当前目录
WorkingDirectory=/path/to/your/working/directory
#定义服务在失败或意外退出后的行为,always表示无论什么原因导致服务退出,都会自动重新启动。
Restart=always
[Install]
#指定服务应该被安装到哪个目标。multi-user.target表示服务将被安装到multi-user.target,即多用户目标,表示服务将在多用户模式下启动。
WantedBy=multi-user.target
3、重新加载systemd配置,以使系统识别新的服务单元文件:systemctl daemon-reload
4、系统启动时自动启动该服务,可以使用以下命令将其添加到启动项中:systemctl enable my-service