Linux的init服务
引用自WiKiPedia
init(为英语:initialization的简写)是 Unix 和 类Unix 系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为1。Linux系统在引导时加载Linux内核后,便由Linux内核加载init程序,由init程序完成余下的引导过程,比如加载运行级别,加载服务,引导Shell/图形化界面等等。
Unix 系列中(如 System III 和 System V)init的作用,和研究中的 Unix 和 BSD 派生版本相比,发生了一些变化。大多数Linux发行版是和 System V 相兼容的,但是一些发行版如Slackware 采用的是BSD风格,其它的如 Gentoo 是自己定制的。后来Ubuntu 和其他一些发行版采用 Upstart来代替传统的 init 进程。至2015年,大部分Linux发行版都已采用新的systemd替代System V和Upstart,但systemd向下兼容System V。
zh.wikipedia.org/wik...
Init 系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为 init 系统),从而让计算机系统进入某种用户预订的运行模式。
仅仅将内核运行起来是毫无实际用途的,必须由 init 系统将系统代入可操作状态。比如启动外壳 shell 后,便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务。或者启动 X 图形系统以便提供更佳的人机界面,更加高效的完成任务。这里,字符界面的 shell 或者 X 系统都是一种预设的运行模式。
嵌入式设备中,经常用到的有两种init系统,Sysvinit和Systemd。
Sysvinit
Sysvinit 就是 System V 风格的 init 系统,顾名思义,它源于 System V 系列 UNIX。它提供了比 BSD 风格 init 系统更高的灵活性。是已经风行了几十年的 UNIX init 系统,一直被各类 Linux 发行版所采用。
配置文件目录:/etc/init.d
解释 | 命令 |
启动example服务 | service example start |
停止example服务 | service example stop |
重启example服务 | service example restart |
查看example服务的运行状态 | service example status |
启动exmaple服务,在系统启动时会自动运行 | chkconfig example on |
禁用example服务,在系统启动时不会自动运行 | chkconfig example off |
运行级别
Sysvinit用术语runlevel
来定义"预订的运行模式",默认的运行模式定义在/etc/inittab
文件的initdefault
项。如果没有默认的运行模式,那么用户将进入系统控制台,手动决定进入何种运行模式。
Sysvinit中运行模式描述了系统各种预订的运行模式。通常会有8种运行模式,即运行模式0-6和S
。其中0
表示关机,1
表示单用户模式,3
为命令行模式,5
为GUI模式,6
表示重启,1和S
等往往用于系统故障之后的排错和恢复。可以看出每一种运行模式所作的初始化工作是不一样的。
Sysvinit执行顺序
/etc/rc.d/rc.sysinit
etc/rc.d/rc 和/etc/rc.d/rcX.d (X 代表运行级别 0-6)
/etc/rc.d/rc.local
X Display Manager(可选)
首先,运行rc.sysinit
以便执行一些重要的系统初始化任务。
然后,Sysvinit开始运行/etc/rc.d/rc
脚本。根据不同的runlevel,rc脚本将执行/etc/rc.d/rcX.d
(X就是runlevel)目录下的所有启动脚本。当所有的初始化脚本执行完毕。该目录下有多个脚本,为了保证系统正常关闭,脚本是要按照顺序执行的在该目录下所有以K
开头的脚本都将在关闭系统时调用,字母K
之后的数字定义了它们的执行顺序。
然后,Sysvinit运行/etc/rc.d/rc.local
脚本。rc.local是Linux 留给用户进行个性化设置的地方。
Sysvinit优缺点
Sysvinit的优点:
是概念简单,开发人员只需要编写启动和停止脚本,概念非常清楚
确定的执行顺序,脚本严格按照启动数字的大小顺序执行,一个执行完毕再执行下一个,这非常有益于错误排查
Sysvinit的缺点:
串行地执行脚本导致Sysvinit运行效率较慢
对动态设备加载等Linux新特性支持不友好
Systemd
Systemd是一个新的init系统和系统管理器,它已成为大多数Linux发行版中非常流行并广泛适应的新标准init系统。systemctl是一个Systemd实用程序,它可以帮助我们管理Systemd系统。
Systemd还提供如下等特性:
和init比起来引导过程简化了很多
Systemd支持并发引导过程从而可以更快启动
通过控制组来追踪进程,而不是PID
优化了处理引导过程和服务之间依赖的方式
支持系统快照和恢复
监控已启动的服务;也支持重启已崩溃服务
包含了systemd-login模块用于控制用户登录
支持加载和卸载组件
低内存使用痕迹以及任务调度能力
记录事件的Journald模块和记录系统日志的syslogd模块
配置文件目录:/usr/lib/systemd
解释 | 命令 |
启动example服务 | systemctl start example |
停止example服务 | systemctl stop example |
重启example服务 | systemctl restart example |
查看example服务的运行状态 | systemctl status example |
启动exmaple服务,在系统启动时会自动运行 | systemctl enable example |
禁用example服务,在系统启动时不会自动运行 | systemctl disable example |
为何要创建一个新的init系统软件 www.wowotech.net/lin...
Systemd的单元概念
系统初始化需要执行的任务非常多。每一个任务都被Systemd 抽象为一个配置单元,即unit。当前单元类型如下:
service:代表一个后台服务进程,比如 mysqld。这是最常用的一类。
socket:此类配置单元封装系统和互联网中的一个 套接字 。当下,systemd 支持流式、数据报和连续包的 AF_INET、AF_INET6、AF_UNIX socket 。每一个套接字配置单元都有一个相应的服务配置单元 。相应的服务在第一个"连接"进入套接字时就会启动(例如:nscd.socket 在有新连接后便启动 nscd.service)。
device:此类配置单元封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个设备配置单元出现。
mount:此类配置单元封装文件系统结构层次中的一个挂载点。Systemd 将对这个挂载点进行监控和管理。比如可以在启动时自动将其挂载;可以在某些条件下自动卸载。Systemd 会将/etc/fstab 中的条目都转换为挂载点,并在开机时处理。
automount:此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问时,systemd 执行挂载点中定义的挂载行为。
swap: 和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换分区在启动时被激活。
target:此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念。比如想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍以便进入目标所代表的系统运行状态。 (例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别 5)
timer:定时器配置单元用来定时触发用户定义的操作,这类配置单元取代了 atd、crond 等传统的定时服务。
snapshot:与 target 配置单元相似,快照是一组配置单元。它保存了系统当前的运行状态。
Systemd的Target和运行级别
systemd使用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其它服务,来创建自己的目标。通过target文件夹的命令也可以看出对应的runlevel:
Sysvinit运行级别 | Systemd目标 | 备注 |
---|---|---|
0 | poweroff.target | 关闭系统 |
1,s | rescue.target | 单用户模式 |
2,4 | multi-user.target | 多用户,非图形化 |
3 | multi-user.target | 多用户,非图形化 |
5 | graphical.target | 多用户,图形化 |
6 | reboot.target | 重启 |
配置文件
服务配置单元文件以.service
为文件名后缀,默认时存放在/lib/systemd/system/
目录下,然后执行enable命令后会自动链接到/etc/systemd/system/
对应的目录下。下面以sshd的为例/etc/system/system/sshd.service
:
最后编辑:SteveChen 更新时间:2024-10-10 11:48