标签 systemd 下的文章

在 Linux 和其他类 Uniux 系统中,init(初始化)进程是系统启动时由内核执行的第一个进程,其进程 ID(PID)为 1,并静默运行在后台,直到系统关闭。

init 进程负责启动其他所有的进程,比如守护进程、服务和其他后台进程,因此,它是系统中其它所有进程之母(偏偏叫做“父进程”)。某个进程可以启动许多个子进程,但在这个过程中,某个子进程的父进程结束之后,该子进程的父进程会变成 init 进程。

这么多年过去了,许多的初始化系统在主流 Linux 脱颖而出,和本文中,我将你来看看在 Linux 操作系统最好的初始化系统。

1. System V Init

System V (SysV) 是一个在类 Unix 系统中最为成熟而且大受欢迎的初始化方案,是 Unix/Linux 系统中所有进程的父进程。SysV 是第一个商业 Unix 系统设计的初始化方案。

除了 Gentoo 使用自主的初始化系统、Slackware 使用 BSD 风格的初始化方案外,几乎所有的 Linux 发行版都率先使用 SysV 作为初始化方案。

随着时间的推移,由于一些设计上的缺陷,有几个 SysV 初始化替换方案已经开发出来,用以为 Linux 创建更加高效和完美的初始化系统。

尽管这些替代方案都超越了 SysV 并提供了更多新特性,但它们仍然和原始 SysV 初始化脚本保持兼容。

2. SystemD

SystemD 是一个 Linux 平台中相对较新的初始化方案。它由 Fedora 15 引入,集成了各类工具以便更好的管理系统。主要目的是:系统初始化、管理和跟踪引导进程中和系统运行时所有的系统进程。

Systemd 全面有别于其他传统的 Unix 初始化系统,特别是在启动系统和服务管理方面。它同样兼容 SysV 和 LBS 初始化脚本。

其中较为突出的特性如下:

  • 纯粹、简单、高效的设计
  • 启动时的并发和并行处理
  • 更好的 API
  • 开启可选进程的移除功能
  • 使用 journald 来支持事件日志
  • 使用 systemd calender timers 来支持任务计划
  • 以二进制文件存储日志
  • 保存 systemd 的状态以待今后查看
  • 与 GNOME 更好整合实现等

查看 Systemd 初始化系统简介:https://fedoraproject.org/wiki/Systemd

3. Upstart

Upstart 是一个基于事件的初始化系统,由 Ubuntu 的制作团队开发的,用以替代 SysV。它可以启动不同的系统任务和进程、在系统运行时校验进程并在系统关闭时结束进程。

它是一个使用 SysV 和 Systemd 启动脚本的混合初始化系统,Upstart 中值得一提的特性如下:

  • Ubuntu 的原生初始化系统,但可以运行在其他所有的发行版中
  • 基于事件启动/结束的任务和服务
  • 启动/结束任务和服务时生成事件
  • 可以由其他系统进程发送事件
  • 使用 D-Bus 和 init 进程通信
  • 用户可以启动/结束其各自的进程
  • 可以再现崩溃的进程等

访问 Upstart 主页:http://upstart.ubuntu.com/index.html

4. OpenRC

OpenRC 是一个基于依赖关系的类 Unix 系统初始化方案,兼容 SysV。基本可以说是 SysV 的升级版,但必须要清楚记住的是:OpenRC 并非只是完全替代 /sbin/init 文件。

它所提供的出色特性如下:

  • 可运行在包括 Gentoo 和 BSD 在内的多数 Linux 系统之中
  • 支持硬件触发的初始化脚本(LCTT 译注:如硬件热插拔所触发的)
  • 支持单个配置文件
  • 不支持单个服务配置文件
  • 以守护进程的方式运行
  • 并行服务启动等

访问 OpenRC 主页:https://wiki.gentoo.org/wiki/OpenRC

5. runit

runit 同样是一个跨平台初始化系统,可以运行在 GNU/Linux、Solaris、BSD 和 Mac OS X 中,用替代 SysV,同时提供服务监控。

相比于 SysV 和其他 Linux 初始化系统,它提供了一些好用和卓越的组件,如下:

  • 服务监控:每个服务都关联一个服务目录
  • 清理进程状态,以保证每个进程处于干净状态
  • 可靠的日志机制
  • 快速的系统启动和关闭
  • 可移植
  • 打包方便
  • 代码体积小等

访问 runit 主页:http://smarden.org/runit/

正如我之前所说的,Linux 中的初始化系统负责启动和管理所有的进程。此外,SysV 是 Linux 系统中主要的初始化系统,但由于一些性能缺陷,系统开发者已经开发出几个替代品。

在这里,我已经介绍了几个可用的替代方案,但你可能觉得有一些其他的初始化系统值得在此提及。请在下方的评论区将你的想法告诉我们。


via: http://www.tecmint.com/best-linux-init-systems/

作者:Aaron Kili 译者:GHLandy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Canonical 的 Martin Pitt 宣布将不再使用他们自己的 Upstart 初始化系统来启动 Ubuntu 桌面会话,取而代之的是更现代化的、却仍有争议的 Systemd。

每次 Systemd 发布,我们都对发现这个所谓的“初始化系统”又做了比原来的设计目标还要多得多的工作。它慢慢地接管了 GNU/Linux 操作系统越来越多的内部组件的工作,甚至,我们毫不怀疑,它将会完全取代它们,而这一天并不远了,或许,将来你会看到 Systemd/Linux 操作系统——除了 Linux 内核,其它的都叫 Systemd。

Upstart 是 Canonical/Ubuntu 自己的项目,它同 Systemd 一样,目标都是取代传统的初始化系统,用在几乎所有的 Ubuntu Linux 上。然而,从 Ubuntu 15.04 开始,Ubuntu 开始逐步使用 Systemd 替代 Upstart 初始化系统,这让许多用户很愤怒。

目前,Upstart 仍被用来控制各种启动过程中的服务和任务的运行和停止,比如桌面会话的启动还是使用 Upstart 控制的。不过 Canonical 计划使用 Systemd 来替代 Upstart 来管理桌面会话。

“按照 Ubuntu 开发者峰会上的讨论,我们准备放弃用 Upstart 来启动图形桌面会话,而使用 Systemd 来管理它,”Martin Pitt 说,“这样,一半的桌面会话将会由 Systemd unit 来管理。”

主要是将 /usr/share/xsessions/*.desktop 里面的 Exec= 行切换为 Systemd 管理,显示管理器使用它们来显示哪些桌面会话可用,以及了解如何启动它们。这会影响到 Ubuntu 16.10 的 ubuntu-desktop 3.18.1.2-1ubuntu5 和 xubuntu-default-settings 16.10.1 软件包。Unity 、HUD 和指示器这些目前仍然由 Upstart 运行,它们会在之后的 CI 过程中转换,此外,dbus、gnome-session 等 Upstart 管理的任务还会继续由 Upstart 运行。

欢迎来到“Fedora 中的容器技术”系列!本文是该系列文章中的第一篇,它将说明你可以怎样使用 Fedora 中各种可用的容器技术。本文将学习 systemd-nspawn 的相关知识。

容器是什么?

一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔离的环境中运行一个程序或者一个操作系统。这和 chroot虚拟机 的思想非常类似。运行在容器中的进程是由与宿主操作系统相同的内核来管理的,但它们是与宿主文件系统以及其它进程隔离开的。

什么是 systemd-nspawn?

systemd 项目认为应当将容器技术变成桌面的基础部分,并且应当和用户的其余系统集成在一起。为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。

systemd-nspawnchroot 在许多方面都是类似的,但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具,例如用来管理容器的 machinectl。由 systemd-nspawn 运行的容器将会与 systemd 组件一同运行在宿主系统上。举例来说,一个容器的日志可以输出到宿主系统的日志中。

在 Fedora 24 上,systemd-nspawn 已经从 systemd 软件包分离出来了,所以你需要安装 systemd-container 软件包。一如往常,你可以使用 dnf install systemd-container 进行安装。

创建容器

使用 systemd-nspawn 创建一个容器是很容易的。假设你有一个专门为 Debian 创造的应用,并且无法在其它发行版中正常运行。那并不是一个问题,我们可以创造一个容器!为了设置容器使用最新版本的 Debian(现在是 Jessie),你需要挑选一个目录来放置你的系统。我暂时将使用目录 ~/DebianJessie

一旦你创建完目录,你需要运行 debootstrap,你可以从 Fedora 仓库中安装它。对于 Debian Jessie,你运行下面的命令来初始化一个 Debian 文件系统。

$ debootstrap --arch=amd64 stable ~/DebianJessie

以上默认你的架构是 x86\_64。如果不是的话,你必须将架构的名称改为 amd64。你可以使用 uname -m 得知你的机器架构。

一旦设置好你的根目录,你就可以使用下面的命令来启动你的容器。

$ systemd-nspawn -bD ~/DebianJessie

容器将会在数秒后准备好并运行,当你试图登录时就会注意到:你无法使用你的系统上任何账户。这是因为 systemd-nspawn 虚拟化了用户。修复的方法很简单:将之前的命令中的 -b 移除即可。你将直接进入容器的 root 用户的 shell。此时,你只能使用 passwd 命令为 root 设置密码,或者使用 adduser 命令添加一个新用户。一旦设置好密码或添加好用户,你就可以把 -b 标志添加回去然后继续了。你会进入到熟悉的登录控制台,然后你使用设置好的认证信息登录进去。

以上对于任意你想在容器中运行的发行版都适用,但前提是你需要使用正确的包管理器创建系统。对于 Fedora,你应使用 DNF 而非 debootstrap。想要设置一个最小化的 Fedora 系统,你可以运行下面的命令,要将“/absolute/path/”替换成任何你希望容器存放的位置。

$ sudo dnf --releasever=24 --installroot=/absolute/path/ install systemd passwd dnf fedora-release

设置网络

如果你尝试启动一个服务,但它绑定了你宿主机正在使用的端口,你将会注意到这个问题:你的容器正在使用和宿主机相同的网络接口。幸运的是,systemd-nspawn 提供了几种可以将网络从宿主机分开的方法。

本地网络

第一种方法是使用 --private-network 标志,它默认仅创建一个回环设备。这对于你不需要使用网络的环境是非常理想的,例如构建系统和其它持续集成系统。

多个网络接口

如果你有多个网络接口设备,你可以使用 --network-interface 标志给容器分配一个接口。想要给我的容器分配 eno1,我会添加选项 --network-interface=eno1。当某个接口分配给一个容器后,宿主机就不能同时使用那个接口了。只有当容器彻底关闭后,宿主机才可以使用那个接口。

共享网络接口

对于我们中那些并没有额外的网络设备的人来说,还有其它方法可以访问容器。一种就是使用 --port 选项。这会将容器中的一个端口定向到宿主机。使用格式是 协议:宿主机端口:容器端口,这里的协议可以是 tcp 或者 udp宿主机端口 是宿主机的一个合法端口,容器端口 则是容器中的一个合法端口。你可以省略协议,只指定 宿主机端口:容器端口。我通常的用法类似 --port=2222:22

你可以使用 --network-veth 启用完全的、仅宿主机模式的网络,这会在宿主机和容器之间创建一个虚拟的网络接口。你也可以使用 --network-bridge 桥接二者的连接。

使用 systemd 组件

如果你容器中的系统含有 D-Bus,你可以使用 systemd 提供的实用工具来控制并监视你的容器。基础安装的 Debian 并不包含 dbus。如果你想在 Debian Jessie 中使用 dbus,你需要运行命令 apt install dbus

machinectl

为了能够轻松地管理容器,systemd 提供了 machinectl 实用工具。使用 machinectl,你可以使用 machinectl login name 登录到一个容器中、使用 machinectl status name检查状态、使用 machinectl reboot name 启动容器或者使用 machinectl poweroff name 关闭容器。

其它 systemd 命令

多数 systemd 命令,例如 journalctl, systemd-analyzesystemctl,都支持使用 --machine 选项来指定容器。例如,如果你想查看一个名为 “foobar” 的容器的日志,你可以使用 journalctl --machine=foobar。你也可以使用 systemctl --machine=foobar status service 来查看运行在这个容器中的服务状态。

和 SELinux 一起工作

如果你要使用 SELinux 强制模式(Fedora 默认模式),你需要为你的容器设置 SELinux 环境。想要那样的话,你需要在宿主系统上运行下面两行命令。

$ semanage fcontext -a -t svirt_sandbox_file_t "/path/to/container(/.*)?"
$ restorecon -R /path/to/container/

确保使用你的容器路径替换 “/path/to/container”。对于我的容器 "DebianJessie",我会运行下面的命令:

$ semanage fcontext -a -t svirt_sandbox_file_t "/home/johnmh/DebianJessie(/.*)?"
$ restorecon -R /home/johnmh/DebianJessie/

via: https://fedoramagazine.org/container-technologies-fedora-systemd-nspawn/

作者:John M. Harris, Jr. 译者:ChrisLeeGit 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Zbigniew Jędrzejewski-Szmek 宣布 systemd 发布了 230 版本,这是一个主要更新版本。上个版本 systemd 229 发布于大约三个月前。

本次更新主要的关注点是其 DNS 解析服务 systemd-resolved,现在它可以使用 DNSSEC 来校验解析结果了。正如你所知道的,systemd 的“魔爪”已经伸向了 GNU/Linux 中除了内核以外的各个基础部分,比如 DNS 解析器就是一个例子,它用于为系统内的 DNS 解析请求提供服务。在本次更新中,当使用“allow-downgrade”模式时,它会默认打开 DNSSEC 扩展。DNSSEC 是一个用于校验 DNS 解析数据是否安全的扩展,对于防范 DNS 欺诈有重要作用,只是到目前为止还有不少 DNS 服务器尚未支持,所以,你也可以在编译时通过增加“--with-default-dnssec=no”编译参数来关闭它。

“我们建议下游维护人员在开发期间打开该功能,并将发现的问题报告给上游,”Zbigniew Jędrzejewski-Szmek 说,“我们非常希望得到 DNSSEC 校验器的反馈,不管是哪种反馈。不过要注意,DNSSEC 支持可能在下游发行版的稳定版本中关闭,因为它可能会导致和一些 DNS 服务器及网络的不兼容。”

当然,systemd-resolved 并不是 systemd 初始化系统中唯一得到改进的部件,其它的部件也有不少改变。

systemd 230 不久之后将会进入到各个以 systemd 作为默认的初始化系统的 Linux 发行版之中。

头条消息

即将到来的 GNOME 3.22 中,各个主要应用都逐步就绪:比如,“游戏”应用会支持 Atari 2600 和 Atari 7800 游戏;“日历”应用可以使用拖放来移动事件;“控制中心”应用也重新打造了等等。

Ubuntu 的 Mir 显示服务器将在 0.24 版本中完全支持 Vulkan API,在当前发布的版本 0.22.1 中已经初步支持了。更多详情

SeeedStudio 发布了一款树莓派 3 的替代品: 狗骨头之绿色无线版 BeagleBone Green Wireless ,内置 Wi-Fi 和低功耗蓝牙。该产品已经可以预定,零售价 $44.9。

版本更迭

  • systemd 发布 230 版本,这个版本中,systemd 所接管的解析器进程 systemd-resolved 将默认打开 DNSSEC。
  • Q4OS 1.4.10 发布。它是一款基于 Debian 的发行版,采用 Trinity 桌面环境(TDE),新版本引入了“Bourbon”开始菜单,这是一个双面板的、可高度定制的开始菜单系统。
  • Mozilla Firefox 46.0.1 已经放到了 Ubuntu 的软件库中,然而 Mozilla Thunderbird 的最新稳定版 45 并没有一同出现,目前 Ubuntu 软件库中仍然是很老的 Mozilla Thunderbird 38.8.0,至于原因则不得而知。当然,你可以自己手工升级使用最新版本:sudo apt-add-repository ppa:mozillateam/thunderbird-nextsudo apt-get update && sudo apt-get dist-upgrade
  • Ubuntu 16.04 LTS 中的 KDE 用的是 KDE Plasma 5.5 和 KDE Applications 15.12,然而最新的 KDE 版本已经是 5.6.4 了。不过, Kubuntu 和 KDE 开发者 Marcin Sągol 宣布 Kubuntu 用户可以不用等待了,可以使用如下命令来升级到最新的 KDE 5.6.4 :sudo apt-add-repository ppa:kubuntu-ppa/backports
    sudo apt update && sudo apt -y full-upgrade

几个月前, Linux 基金会宣布 LFCS (Linux 基金会认证系统管理员) 认证诞生了,这个令人兴奋的新计划定位于让来自全球各地的初级到中级的 Linux 系统管理员得到认证。这其中包括维护已经在运行的系统和服务的能力、第一手的问题查找和分析能力、以及决定何时向开发团队提交问题的能力。

Linux Foundation Certified Sysadmin – Part 7

第七讲: Linux 基金会认证系统管理员

下面的视频简要介绍了 Linux 基金会认证计划。

本讲是系列教程中的第七讲,在这篇文章中,我们会介绍如何管理 Linux 系统自启动进程和服务,这是 LFCS 认证考试要求的一部分。

管理 Linux 自启动进程

Linux 系统的启动程序包括多个阶段,每个阶段由一个不同的图示块表示。下面的图示简要总结了启动过程以及所有包括的主要组件。

Linux Boot Process

Linux 启动过程

当你按下你机器上的电源键时,存储在主板 EEPROM 芯片中的固件初始化 POST(通电自检) 检查系统硬件资源的状态。POST 结束后,固件会搜索并加载位于第一块可用磁盘上的 MBR 或 EFI 分区的第一阶段引导程序,并把控制权交给引导程序。

MBR 方式

MBR 是位于 BIOS 设置中标记为可启动磁盘上的第一个扇区,大小是 512 个字节。

  • 前面 446 个字节:包括可执行代码和错误信息文本的引导程序
  • 接下来的 64 个字节:四个分区(主分区或扩展分区)中每个分区一条记录的分区表。其中,每条记录标示了每个一个分区的状态(是否活跃)、大小以及开始和结束扇区。
  • 最后 2 个字节: MBR 有效性检查的魔法数。

下面的命令对 MBR 进行备份(在本例中,/dev/sda 是第一块硬盘)。结果文件 mbr.bkp 在分区表被破坏、例如系统不可引导时能排上用场。

当然,为了后面需要的时候能使用它,我们需要把它保存到别的地方(例如一个 USB 设备)。该文件能帮助我们重新恢复 MBR,这只在我们操作过程中没有改变硬盘驱动布局时才有效。

备份 MBR

# dd if=/dev/sda of=mbr.bkp bs=512 count=1

Backup MBR in Linux

在 Linux 中备份 MBR

恢复 MBR

# dd if=mbr.bkp of=/dev/sda bs=512 count=1

Restore MBR in Linux

在 Linux 中恢复 MBR

EFI/UEFI 方式

对于使用 EFI/UEFI 方式的系统, UEFI 固件读取它的设置来决定从哪里启动哪个 UEFI 应用。(例如, EFI 分区位于哪块磁盘或分区。

接下来,加载并运行第二阶段引导程序(又名引导管理器)。GRUB[GRand Unified Boot] 是 Linux 中最常使用的引导管理器。今天大部分使用的系统中都能找到它两个中的其中一个版本。

  • GRUB 有效配置文件: /boot/grub/menu.lst(旧发行版, EFI/UEFI 固件不支持)。
  • GRUB2 配置文件: 通常是 /etc/default/grub。

尽管 LFCS 考试目标没有明确要求了解 GRUB 内部知识,但如果你足够大胆并且不怕把你的系统搞乱(为了以防万一,你可以先在虚拟机上进行尝试)你可以运行:

# update-grub

为了使更改生效,你需要以 root 用户修改 GRUB 的配置。

首先, GRUB 加载默认的内核以及 initrd 或 initramfs 镜像。补充一句,initrd 或者 initramfs 帮助完成硬件检测、内核模块加载、以及发现挂载根目录文件系统需要的设备。

一旦真正的根目录文件系统启动,为了显示用户界面,内核就会执行系统和服务管理器(init 或 systemd,进程号 PID 一般为 1)开始普通用户态的引导程序。

init 和 systemd 都是管理其它守护进程的守护进程(后台进程),它们总是最先启动(系统引导时),最后结束(系统关闭时)。

Systemd and Init

Systemd 和 Init

自启动服务(SysVinit)

Linux 中运行等级通过控制运行哪些服务来以不同方式使用系统。换句话说,运行等级控制着当前执行状态下可以完成什么任务(以及什么不能完成)。

传统上,这个启动过程是基于起源于 System V Unix 的形式,通过执行脚本启动或者停止服务从而使机器进入指定的运行等级(换句话说,是一个不同的系统运行模式)。

在每个运行等级中,独立服务可以设置为运行、或者在运行时关闭。一些主流发行版的最新版本中,已经移除了标准的 System V,而用一个称为 systemd(表示系统守护进程)的新服务和系统管理器代替,但为了兼容性,通常也支持 sysv 命令。这意味着你可以在基于 systemd 的发行版中运行大部分有名的 sysv 初始化工具。

除了启动系统进程,init 还会查看 /etc/inittab 来决定进入哪个运行等级。

RunlevelDescription
0停止系统。运行等级 0 是一个用于快速关闭系统的特殊过渡状态。
1别名为 s 或 S,这个运行等级有时候也称为维护模式。在这个运行等级启动的服务由于发行版不同而不同。通常用于正常系统操作损坏时低级别的系统维护。
2多用户。在 Debian 系统及其衍生版中,这是默认的运行等级,还包括了一个图形化登录(如果有的话)。在基于红帽的系统中,这是没有网络的多用户模式。
3在基于红帽的系统中,这是默认的多用户模式,运行除了图形化环境以外的所有东西。基于 Debian 的系统中通常不会使用这个运行等级以及等级 4 和 5。
4通常默认情况下不使用,可用于自定制。
5基于红帽的系统中,支持 GUI 登录的完全多用户模式。这个运行等级和等级 3 类似,但是有可用的 GUI 登录。
6重启系统。

要在运行等级之间切换,我们只需要使用 init 命令更改运行等级:init N(其中 N 是上面列出的一个运行等级)。 请注意这并不是运行中的系统切换运行等级的推荐方式,因为它不会给已经登录的用户发送警告(因而导致他们丢失工作以及进程异常终结)。

相反,应该用 shutdown 命令重启系统(它首先发送警告信息给所有已经登录的用户,并锁住任何新的登录;然后再给 init 发送信号切换运行等级)但是,首先要在 /etc/inittab 文件中设置好默认的运行等级(系统引导到的等级)。

因为这个原因,按照下面的步骤切当地切换运行等级。以 root 用户在 /etc/inittab 中查找下面的行。

id:2:initdefault:

并用你喜欢的文本编辑器,例如 vim(本系列的 LFCS 系列第二讲:如何安装和使用纯文本编辑器 vi/vim),更改数字 2 为想要的运行等级。

然后,以 root 用户执行

# shutdown -r now

最后一个命令会重启系统,并使它在下一次引导时进入指定的运行等级,并会执行保存在 /etc/rc[runlevel].d 目录中的脚本以决定应该启动什么服务、不应该启动什么服务。例如,在下面的系统中运行等级 2。

Change Runlevels in Linux

在 Linux 中更改运行等级

使用 chkconfig 管理服务

为了在启动时启动或者停用系统服务,我们可以在 CentOS / openSUSE 中使用 chkconfig 命令,在 Debian 及其衍生版中使用 sysv-rc-conf 命令。这个工具还能告诉我们对于一个指定的运行等级预先配置的状态是什么。

列出某个服务的运行等级配置。

# chkconfig --list [service name]
# chkconfig --list postfix
# chkconfig --list mysqld

Listing Runlevel Configuration

列出运行等级配置

从上图中我们可以看出,当系统进入运行等级 2 到 5 的时候就会启动 postfix,而默认情况下运行等级 2 到 4 时会运行 mysqld。现在假设我们并不希望如此。

例如,我们希望运行等级为 5 时也启动 mysqld,运行等级为 4 或 5 时关闭 postfix。下面分别针对两种情况进行设置(以 root 用户执行以下命令)。

为特定运行等级启用服务

# chkconfig --level [level(s)] service on
# chkconfig --level 5 mysqld on

为特定运行等级停用服务

# chkconfig --level [level(s)] service off
# chkconfig --level 45 postfix off

在 Linux 中启用/停用服务Enable Disable Services in Linux

启用/停用服务

我们在基于 Debian 的系统中使用 sysv-rc-conf 完成类似任务。

使用 sysv-rc-conf 管理服务

配置服务自动启动时进入指定运行等级,同时禁止启动时进入其它运行等级。

  1. 我们可以用下面的命令查看启动 mdadm 时的运行等级。
# ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

查看运行中服务的运行等级Check Runlevel of Service Running

查看运行中服务的运行等级

  1. 我们使用 sysv-rc-conf 设置防止 mdadm 在运行等级2 之外的其它等级启动。只需根据需要(你可以使用上下左右按键)选中或取消选中(通过空格键)。
# sysv-rc-conf

Sysv 运行等级配置SysV Runlevel Config

Sysv 运行等级配置

然后输入 q 退出。

  1. 重启系统并从步骤 1 开始再操作一遍。
# ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

验证服务运行等级Verify Service Runlevel

验证服务运行等级

从上图中我们可以看出 mdadm 配置为只在运行等级 2 上启动。

那关于 systemd 呢?

systemd 是另外一个被多种主流 Linux 发行版采用的服务和系统管理器。它的目标是允许系统启动时多个任务尽可能并行(而 sysvinit 并非如此,sysvinit 一般比较慢,因为它每次只启动一个进程,而且会检查彼此之间是否有依赖,在启动其它服务之前还要等待守护进程启动),充当运行中系统动态资源管理的角色。

因此,服务只在需要的时候启动,而不是系统启动时毫无缘由地启动(为了防止消耗系统资源)。

要查看你系统中运行的原生 systemd 服务和 Sysv 服务,可以用以下的命令。

# systemctl

在 Linux 中查看运行中的进程Check All Running Processes in Linux

查看运行中的进程

LOAD 一列显示了单元(UNIT 列,显示服务或者由 systemd 维护的其它进程)是否正确加载,ACTIVE 和 SUB 列则显示了该单元当前的状态。

显示服务当前状态的信息

当 ACTIVE 列显示某个单元状态并非活跃时,我们可以使用以下命令查看具体原因。

# systemctl status [unit]

例如,上图中 media-samba.mount 处于失败状态。我们可以运行:

# systemctl status media-samba.mount

查看 Linux 服务状态Check Linux Service Status

查看服务状态

我们可以看到 media-samba.mount 失败的原因是 host dev1 上的挂载进程无法找到 //192.168.0.10/gacanepa 上的共享网络。

启动或停止服务

一旦 //192.168.0.10/gacanepa 上的共享网络可用,我们可以再来尝试启动、停止以及重启 media-samba.mount 单元。执行每次操作之后,我们都执行 systemctl stats media-samba.mout 来查看它的状态。

# systemctl start media-samba.mount
# systemctl status media-samba.mount
# systemctl stop media-samba.mount
# systemctl restart media-samba.mount
# systemctl status media-samba.mount

启动停止服务

启动停止服务

启用或停用某服务随系统启动

使用 systemd 你可以在系统启动时启用或停用某服务

# systemctl enable [service]        # 启用服务
# systemctl disable [service]       # 阻止服务随系统启动

启用或停用某服务随系统启动包括在 /etc/systemd/system/multi-user.target.wants 目录添加或者删除符号链接。

启用或停用服务

启用或停用服务

你也可以用下面的命令查看某个服务的当前状态(启用或者停用)。

# systemctl is-enabled [service]

例如,

# systemctl is-enabled postfix.service

另外,你可以用下面的命令重启或者关闭系统。

# systemctl reboot
# systemctl shutdown

Upstart

基于事件的 Upstart 是 /sbin/init 守护进程的替代品,它仅为在需要那些服务的时候启动服务而生,(或者当它们在运行时管理它们),以及处理发生的实践,因此 Upstart 优于基于依赖的 sysvinit 系统。

一开始它是为 Ubuntu 发行版开发的,但在红帽企业版 Linux 6.0 中得到使用。尽管希望它能在所有 Linux 发行版中替代 sysvinit,但它已经被 systemd 超越。2014 年 2 月 14 日,Mark Shuttleworth(Canonical Ltd. 创建者)发布声明之后的 Ubuntu 发行版采用 systemd 作为默认初始化守护进程。

由于 Sysv 启动脚本已经流行很长时间了,很多软件包中都包括了 Sysv 启动脚本。为了兼容这些软件, Upstart 提供了兼容模式:它可以运行保存在常用位置(/etc/rc.d/rc?.d, /etc/init.d/rc?.d, /etc/rc?.d或其它类似的位置)的Sysv 启动脚本。因此,如果我们安装了一个还没有 Upstart 配置脚本的软件,仍然可以用原来的方式启动它。

另外,如果我们还安装了类似 chkconfig 的工具,你还可以和在基于 sysvinit 的系统中一样用它们管理基于 Sysv 的服务。

Upstart 脚本除了支持 Sysv 启动脚本,还支持基于多种方式启动或者停用服务;例如, Upstart 可以在一个特定硬件设备连接上的时候启动一个服务。

使用 Upstart以及它原生脚本的系统替换了 /etc/inittab 文件和 /etc/init 目录下和运行等级相关的以 .conf 作为后缀的 Sysv 启动脚本目录。

这些 *.conf 脚本(也称为任务定义)通常包括以下几部分:

  • 进程描述
  • 进程的运行等级或者应该触发它们的事件
  • 应该停止进程的运行等级或者触发停止进程的事件
  • 选项
  • 启动进程的命令

例如,

# My test service - Upstart script demo description "Here goes the description of 'My test service'" author "Dave Null <[email protected]>"
# Stanzas

#
# Stanzas define when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process in case of crash
respawn
# Specify working directory
chdir /home/dave/myfiles
# Specify the process/command (add arguments if needed) to run
exec bash backup.sh arg1 arg2

要使更改生效,你要让 upstart 重新加载它的配置文件。

# initctl reload-configuration

然后用下面的命令启动你的任务。

$ sudo start yourjobname

其中 yourjobname 是之前 yourjobname.conf 脚本中添加的任务名称。

关于 Upstart 更完整和详细的介绍可以参考该项目网站的 “Cookbook” 栏目。

总结

了解 Linux 启动进程对于你进行错误处理、调整计算机系统以及根据需要运行服务非常有用。

在这篇文章中,我们分析了你按下电源键启动机器的一刻到你看到完整的可操作用户界面这段时间发生了什么。我希望你能像我一样把它们放在一起阅读。欢迎在下面留下你的评论或者疑问。我们总是期待听到读者的回复。


via: http://www.tecmint.com/linux-boot-process-and-manage-services/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出