1.启动流程大致介绍
在 Linux 系统中,系统启动的流程可以简要地描述为以下几个步骤:
-
BIOS/UEFI启动:计算机通电后,首先执行基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)中的引导程序。这个引导程序负责初始化硬件并加载引导加载程序。
-
引导加载程序(Boot Loader):引导加载程序(如 GRUB、LILO 等)被加载到内存中,它会读取配置文件(如
grub.cfg
)以确定应该引导哪个操作系统。引导加载程序负责加载内核和初始 RAM 磁盘(initramfs)到内存中。 -
Linux内核启动:引导加载程序加载 Linux 内核(通常是 vmlinuz)和 initramfs 到内存中,然后将控制权交给内核。内核负责初始化硬件、建立内存空间、挂载根文件系统等。
-
Init进程启动:在传统的 SysVinit 系统中,系统启动后会启动 init 进程。在较新的系统中(如 systemd),init 进程被 systemd 替代。这个进程是用户空间的第一个进程,它会根据配置文件启动系统中的各种服务。
-
运行 init.d 脚本:在传统的 SysVinit 系统中,init 进程会根据运行级别(runlevel)执行
/etc/init.d
目录下的脚本。这些脚本通常用于启动、停止或管理系统服务,如网络服务、文件系统挂载等。 -
启动其他用户空间服务:除了
/etc/init.d
中的脚本外,init 进程还会启动其他用户空间的服务和进程,以确保系统正常运行。 -
用户登录:最后,系统进入用户登录界面或命令行提示符,等待用户登录并开始使用系统。
/etc/init.d
目录下的脚本起到了启动、停止或管理系统服务的作用。在第 5 步中,init 进程会执行这些脚本来启动系统中需要的各种服务,从而完成系统的初始化和启动。
2.rcS
在 /etc/init.d
目录下的 rcS
脚本通常用于系统引导过程中的基本设置和初始化。这个脚本在 Linux 中是比较标准的,尤其是在基于 SysVinit 的系统中。它在系统引导的早期阶段被执行,用于执行一些基本的系统配置和初始化任务,例如:
-
文件系统挂载:
rcS
可以负责挂载根文件系统和其他必要的文件系统,以确保系统能够正常启动并访问所需的文件。 -
系统时钟设置:它可以设置系统时钟,包括从硬件时钟同步时间等。
-
初始化系统日志:在系统启动过程中,通常需要初始化系统日志服务,以便记录系统启动时的事件和日志信息。
-
加载必要的内核模块:在引导过程中,可能需要加载一些必要的内核模块,以支持硬件设备或者提供特定的功能。
-
设置系统环境和变量:
rcS
可以设置系统的环境变量或者执行其他的初始化任务,以确保系统启动时的环境符合预期。
总的来说,rcS
脚本在系统启动的早期阶段执行一些必要的初始化任务,以确保系统能够顺利启动并进入正常的运行状态。
#!/bin/sh
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
source /etc/profile
for i in /etc/init.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
这个脚本的作用是按照一定顺序启动 /etc/init.d
目录下的所有初始化脚本。它首先加载系统环境变量和函数,然后遍历该目录下以 S
开头的文件(通常是数字),执行这些脚本。脚本可以是 shell 脚本(以 .sh
结尾)或可执行文件。
当前文件夹下有可能出现的文件
-
S10mdev
: 这个脚本用于启动mdev
守护进程,根据系统中连接的硬件设备动态创建设备节点。 -
S11module_driver_default
: 这个脚本用于加载默认的模块驱动程序。它可能会在系统启动时加载一些必要的内核模块以支持硬件设备或提供其他功能。 -
S20urandom
: 这个脚本可能用于启动/dev/urandom
设备节点,提供系统所需的随机数生成服务。 -
S21mount_jffs2
: 这个脚本可能用于挂载使用 JFFS2 文件系统格式的文件系统。 -
S40network
: 这个脚本可能用于启动网络相关的服务或配置网络接口。 -
smainapp
: 自定义主程序的启动。
3.rcK
#!/bin/sh
# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set stop
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i stop
;;
esac
done
这个脚本的作用是停止 /etc/init.d
目录下所有初始化脚本。它会按照逆序遍历以 S
开头的文件(通常是数字),然后执行这些脚本以停止相关服务或进程。脚本可以是以 .sh
结尾的 shell 脚本或可执行文件。