欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux的systemd与init的区别

程序员文章站 2022-07-14 13:34:50
...

介绍

init

以前的Linux启动都是用init进程。启动服务:

$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start

缺点:

  • 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

systemd

在较新的linux系统上,都使用systemd 取代了init,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。systemd为系统启动和管理提供了完整的解决方案。它提供了一组命令。字母d是守护进程(daemon)的缩写。查看systemd 的版本:

$ systemctl --version

systemd作用

systemd提供一组命令,这些涉及到linux系统的各方各面

管理系统systemctl

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

# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

查看启动耗时systemd-analyze

# 查看启动耗时
$ systemd-analyze
Startup finished in 1.152s (kernel) + 3.196s (initrd) + 23.328s (userspace) = 27.677s


# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

hostnamectl查看当前主机信息

# 显示当前主机的信息
$ hostnamectl
   Static hostname: localhost.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 32a04e6f345141f896683347d2142b27
           Boot ID: 4ec0198818fb45cb89597c2fa1609792
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1062.9.1.el7.x86_64
      Architecture: x86-64
      
# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

localectl查看本地化设置

# 查看本地化设置
$ localectl
System Locale: LANG=zh_CN.UTF-8
       VC Keymap: cn
      X11 Layout: cn

# 设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB

timedatectl查看当前时区设置

# 查看当前时区设置
$ timedatectl
      Local time:2020-12-24 20:22:07 CST
  Universal time:2020-12-24 12:22:07 UTC
        RTC time:2020-12-24 12:22:07
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

# 显示所有可用的时区
$ timedatectl list-timezones                                                           
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre


# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

loginctl查看当前登录的用户

# 列出当前session
$  loginctl list-sessions
   SESSION        UID USER             SEAT            
        c1         42 gdm              seat0           
         1       1000 oceanstar        seat0           

2 sessions listed.

# 列出当前登录用户
$ loginctl list-users
     UID USER            
        42 gdm             
      1000 oceanstar       


# 列出显示指定用户的信息
$ loginctl show-user oceanstar
UID=1000
GID=1000
Name=oceanstar
Timestamp=四 2020-12-24 20:18:20 CST
TimestampMonotonic=217149844
RuntimePath=/run/user/1000
Slice=user-1000.slice
Display=1
State=active
Sessions=1
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
Linger=no

系统资源

systemd可以管理所有系统资源(不同资源统称为Unit),分为12类:

  • 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:定时器

systemctl list-units查看当前系统的所有 Unit

# 列出正在运行的 Unit
$ systemctl list-units

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

# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive

# 列出所有加载失败的 Unit
$ systemctl list-units --failed

# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service

systemctl status查看系统状态和单个 Unit 的状态

# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H [email protected].example.com status httpd.service

systemctl提供的三个查询状态方法

# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service

# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service

# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service

Unit 管理

常用的启动和停止 Unit(主要是 service)命令

# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

systemctl list-dependencies列出Unit的所有依赖关系

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

systemctl list-dependencies命令列出一个 Unit 的所有依赖。

$ systemctl list-dependencies nginx.service

上面命令的输出结果之中,有些依赖是 Target 类型,默认不会展开显示。如果要展开 Target,就需要使用–all参数。

$ systemctl list-dependencies --all nginx.service

Unit 的配置文件