linux systemd简介


systemd

回到顶部

linux启动的第一个用户进程是init进程,PID为1.init进程为所有用户进程的祖先进程。 目前大部分linux发行版中,传统的init进程可执行程序已经被systemd取代。 systemd即为system daemon的简写。 用ps或者pstree观察,有些发行版的1号进程还是显示为init进程, 但是可执行程序文件其实是指向systemd的符号链接:

              [root@initroot ~]# ps aux
              USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
              root         1  0.0  0.1 225604  5812 ?        Ss   Mar01   0:04 /sbin/init splash
              root         2  0.0  0.0      0     0 ?        S    Mar01   0:00 [kthreadd]
              root         4  0.0  0.0      0     0 ?        I<   Mar01   0:00 [kworker/0:0H]
            
              [root@initroot ~]# ls -l /sbin/init
              lrwxrwxrwx 1 root root 20 Sep 30 23:23 /sbin/init -> /lib/systemd/systemd
              
系统启动后运行的第一个用户进程为systemd进程,systemd进程也是系统守护进程,主要用来管理系统中的其他守护进程。 所有随系统而启动的进程都是由systemd进程启动,systemd进程是管理系统守护进程的守护进程。
systemd进程为用户提供systemctl命令管理系统守护进程。 传统的systemV init进程需要多个命令互相配合管理守护进程,这些命令有service、chkconfig、setup、init等, systemd只有systemctl命令!所有的管理工作都通过systemctl命令完成。

systemd取代init的优势

回到顶部

目前大部分linux发行版都用systemd取代了传统System V系统的init进程。那么systemd有什么好处呢:
并行处理所有服务,加速开机启动流程:
传统的init进程启动脚本是一项一项任务按顺序启动,具有相互依赖关系的进程需要按照顺序启动,这是必须的也是合理的。 但是一些没有相互依赖关系的服务进程也必须按照顺序一个一个启动,在目前大部分系统都是多内核cpu架构下,这显然是不合理的。 没有相互依赖关系的服务进程完全可以并行启动,而systemd就可以让所有没有依赖关系的服务进程同时启动,这样就大大加速了系统的启动速度!
一经要求就响应的 on-demand 启动方式:
传统的由init进程启动的服务进程,都是通过对应的启动脚本来管理服务进程。 脚本的加载执行也需要一定的时间,而且管理命令也比较多如init, chkconfig, service等。 而systemd进程由于常驻内存,任何要求(on-demand)都可以立即处理。和systemd进程搭配的管理命令也只有一个,那就是systemctl。 只需要通过systemctl命令就可以完成所有的系统服务进程管理工作。所以不管是系统的响应速度还是用户的使用效率都会大大提高。
自动检查服务的依赖关系
systemd可以自定义服务相依性的检查,假设服务进程B依赖服务进程A,当用systemctl启动服务进程B的时候,如果A进程没有启动, sysytemd会自动检查并启动进程B的依赖进程A!这样就免去管理员一项一项分析服务的依赖关系,这对于系统管理员来说可是一件非常头疼悲伤的事情。
依daemon功能分类:
systemd管理的服务非常多,systemd将所有的服务定义为一个服务单位unit,并将unit划分为不同的服务类型type。 传统的init仅将守护进程分为stand alone与super daemon, 为了方便系统管理, systemd将服务单位unit分为service, socket, target, path, snapshot, timer等多种不同的类型(type)
将多个 daemons 集合成为一个群组:
systemd将服务进程集合为一个target,一个target集合了许多daemons,也就是执行某个target就相当于执行了该target内的所有daemons! target主要就是将操作系统启动到某个运行环境,类似传统systemV的init运行等级runlevel。
向下兼容传统的init服务脚本:
systemd可以兼容init的启动脚本,因此,传统的 init 启动脚本也能够通过 systemd 来管理,只是更进阶的 systemd 功能就没有办法支持就是了。
虽然如此,不过 systemd 也是有些地方无法完全取代 init 的!包括:
在 runlevel 的对应上,大概仅有 runlevel 1, 3, 5 有对应到 systemd 的某些 target 类型而已,没有全部对应; 全部的 systemd 都用 systemctl 这个管理程序管理,而 systemctl 支持的语法有限制, 不像/etc/init.d/daemon 就是纯脚本可以自定义参数,systemctl 不可自定义参数。
如果某个服务启动是管理员自己手动执行启动,而不是使用systemctl去启动的,例如你自己手动输入crond 以启动 crond 服务, 那么systemd将无法跟踪该服务,也就无法通过systemctl命令管理了。
systemd 启动过程中,无法与管理员通过standard input传入讯息!因此,自行撰写systemd的启动设置时, 必须取消互动机制,连通过启动时传进的标准输入讯息也要避免!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读