Systemd 使用(2:加深理解)

理解Linux启动过程

在我们打开Linux电脑的电源后第一个启动的进程就是init。分配给init进程的PID是1,它是系统其他所有进程的父进程。

当一台 Linux电脑启动后,处理器会先在系统存储中查找BIOS,之后BIOS会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记 录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由MBR控制。
主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程序), 这个时候 GRUB或LILO会加载内核模块。内核会马上查找/sbin下的“init”程序并执行它。
从这里开始init成为了Linux系统的父进程。init 读取的第一个文件是/etc/inittab,通过它init会确定我们Linux操作系统的运行级别。它会从文件/etc/fstab里查找分区表信息 然后做相应的挂载。
然后init会启动/etc/init.d里指定的默认启动级别的所有服务/脚本。所有服务在这里通过init一个一个被初始化。在这 个过程里,init每次只启动一个服务,所有服务/守护进程都在后台执行并由init来管理。

详解Linux启动过程(Systemd)

Linux操作系统的开机流程详解

第一步: BIOS自检
	这步是找到BIOS检查CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等,(启动顺很熟悉,每次gost装机的时候,要		
	把开机首选项设置成从U盘启动)。
第二步: 读取MBR(Master boot Record)
	MBR引导,也就是根据装有linux系统的硬盘上的主引导区的记录进行引导,主引导记录处在硬盘上的第一给物理分区上,硬盘能够读取到数据也就是
	靠的这个最主要的MBR主引导记录,它里面包含了硬盘的主引导程序和硬盘的分区表,分区表有四个分区记录每个分区占16个字节共64个字节,还有
	446字节放主引导程序,			他可以找到活动分区(active)并将活动区读入0×7c00内存,其实被复制到内存的就是我们说的BOOT Loader,准
	确到电脑上就是GRUB。
第三步: 加载Boot Loader
	Boot Loader的种类有很多, 其实是一段小程序,初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状 态,以便为
	最终调用操作系统内核做好一切准备。其中Grub、Lilo和spfdisk是常见的Loader。
第四步:加载内核
	系统将解压后的内核放置在内存中(这里说系统到底是哪一个系统呢?)开始调用start_kernel()函数, 来初始化各种设备,到这里内核环境已经建
	立起来了。
第五步:启动systemed单元目标
	随之而来的是/etc/inittab文件无效。取而代之的是 /etc/systemd/system/default.target,这是一个软链接
	指/usr/lib/systemd/system/graphical.target,当改变默认运行级别的时候,软连接指向的文件也随之改变

关机过程差不多是相反的过程,首先init停止所有服务,最后阶段会卸载文件系统。

Systemd概览

Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的, 这样它们可以允许 不同守护进程之间进行交互。Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。
处于不同控制组的进程之间可以通过内核来互相通信。systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。

Systemd同时也清晰地处理了系统关机过程。它在 /usr/lib/systemd/system 目录下有三个脚本,分别叫systemd- halt.service,
systemd-poweroff.service,systemd-reboot.service。这几个脚本会在用户选择 关机,重启或待机时执行。
在接收到关机事件时,systemd首先卸载所有文件系统并停止所有内存交换设备,断开存储设备,之后停止所有剩下的进程。

Systemd结构概览

  1. 当你打开电源后电脑所做的第一件事情就是BIOS初始化。BIOS会读取引导设备设定,定位并传递系统控制权给MBR
    (假设硬盘是第一引导设备)。
  2. MBR从Grub或LILO引导程序读取相关信息并初始化内核。接下来将由Grub或LILO继续引导系统。
    如果你在grub配置文件里指定了 systemd作为引导管理程序,之后的引导过程将由systemd完成。
    Systemd使用“target”来处理引导和服务管理过程。这些 systemd里的“target”文件被用于分组不同的引导单元以及启动同步进程。
  3. systemd执行的第一个目标是default.target。但实际上default.target是指向graphical.target的 软链接。
    Linux里的软链接用起来和Windows下的快捷方式一样。文件Graphical.target的实际位置是
    /usr/lib/systemd/system/graphical.target。里面内容如下:
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
  1. 在这个阶段,会启动multi-user.target而这个target将自己的子单元放在目录 “/etc/systemd/system/multi-user.target.wants” 里。
    这个target为多用户支持设定系统环境。非root用户会在这个阶段的引导过程中启用。防火墙相关的服务也会在这个阶段启动。
    “multi-user.target” 会将控制权交给另一层“basic.target”。
  2. "basic.target"单元用于启动普通服务特别是图形管理服务。它通过/etc/systemd/system/basic.target.wants
    目录来决定哪些服务会被启动,basic.target之后将控制权交给sysinit.target.
  3. "sysinit.target"会启动重要的系统服务例如系统挂载,内存交换空间和设备,内核补充选项等等。
    sysinit.target在启动过程中会传递给local-fs.target。这个target单元的内容如下面截图里所展示。

systemd添加开机启动项

Ubuntu 16.10 开始不再使用initd管理系统,改用systemd,包括用systemctl命令来替换了service和chkconfig的功能。
systemd 默认读取 /etc/systemd/system 下的配置文件,该目录下的文件会链接/lib/systemd/system/下的文件。
不同于以往的版本,ubuntu18.04默认不带/etc/rc.local文件,我们需要通过配置来让rc.local.service生效。

1、编写脚本

$ sudo vim /opt/hello.sh

脚本内容:

#!/bin/bash
while true
do
#打印hello world ,sleep 1 是每隔一秒打印一次
echo hello world >> /tmp/hello.log
#打印当前系统时间
echo $(date +%Y%m%d-%H%M%S)
sleep 1
done

2、赋予hello.sh执行权限

$sudo chmod 0755 /opt/hello.sh

3、创建Unit定义文件3、创建Unit定义文件

在 /usr/lib/systemd/system 下

$sudo vim /usr/lib/systemd/system/hello.service

hello.service 内容如下:

[Unit]
Description = hello daemon
[Service]
ExecStart = /opt/hello.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target

3.重载服务

systemctl enable hello.service

就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/nginx.service 文件的链接。

4、重启

reboot

5、相关命令

$sudo systemctl daemon-reload    #service文件改动后要重新转载一下
$sudo systemctl enable hello     # 开机自动启动on ,即在相应的启动目录文件夹下建立软连接
$sudo systemctl disable hello     # 开机自动启动off ,即取消在相应的启动目录文件夹下建立的软连接
$sudo systemctl status hello     # 查看该服务的状态
$sudo systemctl list-unit-files --type=service |grep hello       #查看服务是否启动
	list-unit-files --type 是列出所有启动文件,正常会输出
$ systemctl list-dependencies nginx.service        #列出服务的依赖
## note	
Unit中一般分三个部分【Unit/Service/Install】
Unit中主要是对服务的说明,里面有两个参数:Description(用于描述服务),After(用于描述服务启动的依赖);
Sevice中主要是设置运行参数,里面参数的意思:ExecStart (这里填sh文件路径),
Restart = always(进程时服务意外故障的时候可以自动重启的模式),Type = simple(表示其余选项均为系统默认);
Install中主要是服务安装的相关设置。

[Unit]
```c
Description : 服务的简单描述
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。

[Service]

Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。

[Install]

Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值