一、init system


1、计算机是如何启动的

以早期 Fedora 系统为例。

1、开机

2、BIOS 和 GRUB(引导加载程序)

3、Linux 内核启动后,init 进程 是在 Fedora 上启动的第一个进程。进程 ID (PID) 为 1。它是系统中所有其它进程的母亲,用于启动其他服务和守护程序。

2、各种 init system

对于上面介绍的 init 进程,各个不同的发行版采用了不同的 init 实现方式,即 init system(初始化系统)

(1)System V (Sys V)

System V 是类 Unix 操作系统传统的也是首款初始化系统。

(2)Upstart

Upstart 是由 Ubuntu 的制造商开发的基于事件的初始化系统,用于替代 SysV初始化系统。

它用于 Ubuntu 9.10 - 14.10 版本和基于 RHEL 6 的系统中,之后的被 systemd 取代了。

(3)systemd

systemd 旨在以并行方式启动进程的 init 替换守护程序,以许多标准发行版(Fedora,OpenSuSE,Arch,RHEL,CentOS 等)实现。

Fedora 15 是第一个采用 systemd 而不是 upstart 的发行版。

CentOS 7 也跟上,抛弃了 6 的 SysV,改用 systemd。

(4)其他

还有一些其他的 init system:

  • Launchd - mac 系统的 init system ,其实 systemd 的很多概念来源于此

  • Epoch - 基于简单性和服务管理的 init 替换守护进程,旨在启动单线程进程。

  • Mudar - 用Python编写的 init 替换守护进程,在Pardus GNU / Linux上实现,旨在异步启动进程。

(5)总结

各种 init system 的所在目录:

  • SysV:/etc/init.d
  • UpStart: /usr/share/upstart
  • systemd:/usr/lib/systemd

二、systemd


因为鄙人用的最多的 linux 发行版是 CentOS 7 ,所以这里重点介绍 systemd。

1、介绍

(1)名字含义

根据 Linux 惯例,字母 d 是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统

Linux 的守护进程都习惯加 d ,如 httpd,sshd……

(2)优点
  • 传统的 SysV ,性能太低,主要原因是 init 是串行启动,前一个服务进程启动完成后下一个服务进程才能启动,这也就导致了 init 进程启动耗时比较长。而 systemd 是并行启动,恰恰解决了这点。

  • 功能强大

  • 使用方便

(3)缺点
  • 体系庞大,非常复杂

    • 与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学

知乎上还有不少人吐槽 systemd,详见:systemd 为什么会有那么大的争议?

2、管理系统

前面介绍 systemd 的目标是要守护整个系统,所以他有很多管理系统的命令。

所以 Systemd 并不是一个命令,而是一组命令

  • systemctl是 Systemd 的主命令,用于管理系统。

    例如:

    • 重启系统 sudo systemctl reboot

    • 查看系统状态 sudo systemctl status

  • systemd-analyze 命令用于查看启动耗时。

  • hostnamectl 命令用于查看当前主机的信息。

  • localectl 命令用于查看本地化设置。

  • timedatectl 命令用于查看当前时区设置。

  • loginctl 命令用于查看当前登录的用户。

3、管理系统资源

(1)unit —— 配置单元

systemd 把系统资源划分成12种 Unit

  • Service unit:系统服务

  • Target unit:多个 Unit 构成的一个组

  • Device Unit:硬件设备

  • Mount Unit:文件系统的挂载点

  • Automount Unit:自动挂载点

  • Path Unit:文件或路径

  • Scope Unit:不是由 Systemd 启动的外部进程

  • Slice Unit:进程组

  • Snapshot Unit:Systemd 快照,可以切回某个快照

  • Socket Unit:进程间通信的 socket

  • Swap Unit:swap 文件

  • Timer Unit:定时器

Unit 之间还存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。

1、查看 unit:

# 列出正在运行的 Unit
$ systemctl list-units # 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all

2、管理 unit (以管理单个服务为例):

sudo systemctl start httpd.service
sudo systemctl stop httpd.service
sudo systemctl kill httpd.service # 重启
sudo systemctl restart httpd.service # restart = stop + start
# 重新加载配置文件
sudo systemctl reload httpd.service # 显示某个 Unit 的运行状态
sudo systemctl status httpd.service
(2)unit 配置文件

每一个配置单元都有一个对应的配置文件

比如一个 MySql 服务对应一个 mysql.service 文件。

配置文件的后缀名,就是该 Unit 的种类(上面介绍了 Unit 有 12 种分类 ),比如sshd.socket。如果省略,Systemd 默认后缀名.service,所以 sshd 会被理解成sshd.service

1、(支持 Systemd 的软件会)自动生成配置文件

下面以 安装 mariadb 并设置开机自启 为例:

(1)sudo yum install mariadb mariadb-server

先用 yum 安装 mariadb。对于那些支持 Systemd 的软件,安装完成后,会自动在 /usr/lib/systemd/system 添加一个配置文件,这里叫 mariadb.service

(2)sudo systemctl start mariadb.service

通过 systemctl 启动 mariadb.service。

(3)sudo systemctl enable mariadb.service

因为每次开机,Systemd 都会默认从 /etc/systemd/system/ 读取配置文件。 所以 systemctl enable 做的就是从 /etc/systemd/system//usr/lib/systemd/system/mariadb.service 的一个软连接

再加上mariadb.service这个 unit 配置文件里的 [Install] 定义了自启行为,所以 systemctl enable 也做到了开机自启

(4)sudo systemctl disable mariadb.service

我们也可以撤销这个软连接,即撤销开机自启。

2、查看配置文件

(1)查看单个

以 sshd.service 为例:

$ systemctl cat sshd.service

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service [Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s [Install]
WantedBy=multi-user.target

关于字段的详细释义,可参考:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service # 显示某个 Unit 的依赖关系
$ systemctl list-dependencies httpd.service
$ systemctl list-dependencies --all httpd.service

(2)查看多个(列表)

# 列出所有配置文件
$ systemctl list-unit-files

在返回的列表里,显示的每个配置文件的状态,一共有 4 种:

  • enabled:已建立启动链接

  • disabled:没建立启动链接

  • static:该配置文件没有 [Install] 部分(无法执行),只能作为其他配置文件的依赖

  • masked:该配置文件被禁止建立启动链接

从配置文件的状态无法看出,该 Unit 是否正在运行。这必须执行前面提到的 systemctl status 命令。

3、修改(完)配置文件

修改配置文件需重新启动才能生效。

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
(3)target —— Unit 组

上面介绍了 Unit 有 12 种分类,其中一个叫 target ,他其实就是 Unit 组。

启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。

例如上面说到 安装 mariadb 并设置开机自启 时,其实 systemctl enable 做软连接的时候,/usr/lib/systemd/system 下的 mariadb.service 就被加入到 /etc/systemd/system 下 的 targetmulti-user.target.wants 中。即 Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target # 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

3、日志管理

Systemd 除了可以管理系统和系统资源,还统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl 一个命令,查看所有日志(内核日志和应用日志)。

(1)查看日志
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl # 实时滚动显示最新日志
$ sudo journalctl -f # 查看指定进程的日志
$ sudo journalctl _PID=1 # 查看指定用户的日志
$ sudo journalctl _UID=33 --since today # 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
(2)编辑日志配置

日志的配置文件位于/etc/systemd/journald.conf

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage # 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G # 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

4、自己从零写一个 unit

待写


参考资料

# Systemd 入门教程:命令篇

# Systemd 入门教程:实战篇

Linux’s init system & systemd的更多相关文章

  1. Linux 初始化系统(init)- systemd

    wikipedia 浅析 Linux 初始化 init 系统 systemd 中文手册 fedoraproject - systemd 1. Systemd 简介 Systemd 是 Linux 系统 ...

  2. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd

    浅析 Linux 初始化 init 系统,第 1 部分: sysvinit  第 2 部分: UpStart 第 3 部分: Systemd http://www.ibm.com/developerw ...

  3. Linux启动流程和服务管理(init和systemd)

    目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...

  4. 【转】Linux 初始化 init 系统 [sysvinit systemd upstart]

    http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?sort_by=&show_abstract=true& ...

  5. Linux初始化init系统-Sysvinit、Upstart、Systemd

    首先了解以下Ubuntu运行级别(init)对应工具的变化历史: 1.Ubuntu 6.10及以前版本使用Sysvinit. 2.Ubuntu 14.10及以前版本使用Upstart但是还留着Sysv ...

  6. LINUX PID 1和SYSTEMD 专题

    Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个 ...

  7. Linux 系统的总管 Systemd

    目录 1. init的进化,全功能的Systemd 2 1.1 Linux系统中,init主要有3个版本 2 1.2 比较传统的init程序,Systemd的特点有: 2 1.3 Systemd Jo ...

  8. 【原创】Linux基础之chkconfig systemd

    CentOS6服务用chkconfig控制,CentOS7改为systemd控制 1 systemd systemd is a suite of basic building blocks for a ...

  9. LINUX PID 1和SYSTEMD

    LINUX PID 1和SYSTEMDhttp://coolshell.cn/articles/17998.html 要说清 Systemd,得先从 Linux 操作系统的启动说起.Linux 操作系 ...

随机推荐

  1. sql语句查询结果合并union all用法_数据库技巧

    --合并重复行 select * from A union select * from B --不合并重复行 select * from A union all select * from B 按某个 ...

  2. 谷歌地图 API 开发之获取坐标以及街道详情

    自己的项目中有获取当前点击的坐标经纬度或者获取当前街道的信息的需求.估计这个对于新手来说,还是比较麻烦的,因为从官网上找这个也并不是很好找,要找好久的,运气好的可能会一下子找到. 献上自己写的测试案例 ...

  3. 解决 Docker Hadoop ssh "Connection to * closed".问题

    Docker 最近很火, 可以快速轻量级地虚拟出多个node,所以打算在Docker中跑Hadoop伪分布式应用. 其实要做出个简单的版本倒是不难,主要在 建立ssh无密码登录本机时,出现刚登录上去, ...

  4. hibernate查询方式(三)

    QBC查询 (Query By Criteria) *****QBC查询有三个特点 **查询时不写sql语句 而是用方法来查询 **操作实体类和属性 **通过criteria对象来实现 1.查询所有 ...

  5. 利用 FC + OSS 快速搭建 Serverless 实时按需图像处理服务

    作者:泽尘 简介 随着具有不同屏幕尺寸和分辨率设备的爆炸式增长,开发人员经常需要提供各种尺寸的图像,从而确保良好的用户体验.目前比较常见的做法是预先为一份图像存放多份具有不同尺寸的副本,在前端根据用户 ...

  6. linux gre隧道创建

    目录 linux gre隧道创建 实验环境 实验目的 实验步骤 1.在host A(10.10.10.47)上面操作 2.在host B(192.168.0.118)上面操作 实验结果 还原实验环境 ...

  7. 【解决】error pulling image configuration: Get https:// ...... x509: certificate has expired or is not yet valid

    [问题]进行镜像拉取时报错 [分析] 很多人会被第一句所蒙蔽,按照网上教程进行修改etc/sysconfig/docker,之后发现还是没有用. 其实这里重点是最后一句"certificat ...

  8. python学习笔记-生成随机数

    更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在实现算法时经常会用到随机数,有时会忘记各种随机数的生成方法,这里对Python中的随机数生成方法进行汇总,以供以 ...

  9. linux-history、find、

    1.history:查看历史记录 -c:清除历史命令记录 -d:删除某一条使用过的命令,-d后跟命令的序列号 2.find:在目录结构中搜索文件 -type:后面跟文件的类型,d表示目录,f表示文件 ...

  10. Obeject.hasOwnProperty

    对象{ }要用for-in遍历对象内的属性,通过hasOwnProperty判断属性是否是对象本身的,而不是原型上的 数组[ ]可以通过forEach来遍历