0

0

Linux systemd和SysVinit的区别

P粉602998670

P粉602998670

发布时间:2025-09-09 10:07:01

|

687人浏览过

|

来源于php中文网

原创

systemd相比SysVinit具有更快的启动速度和更强的管理功能,主要区别在于:1. 启动方式上,SysVinit为串行启动,而systemd支持并行启动,显著提升效率;2. 依赖关系处理上,SysVinit依赖脚本顺序控制,易出错,systemd通过单元文件声明依赖,自动处理启动顺序;3. 管理工具上,SysVinit使用service命令调用init.d脚本,systemd使用systemctl直接与守护进程通信,功能更全面;4. 日志管理上,SysVinit日志分散,需手动查看,systemd集成journald统一管理,支持过滤和持久化;5. 资源控制上,systemd深度集成Cgroups,可限制服务资源使用,提升系统稳定性。迁移至systemd的主要原因包括提升启动速度、优化依赖管理、增强资源与日志控制能力。将SysVinit脚本转换为systemd单元文件需分析原脚本功能,创建对应.service文件,配置[Unit]、[Service]、[Install]三部分,分别设置描述与依赖、服务运行参数、启用目标,最后通过systemctl命令启用、启动并检查服务状态。systemd支持多种单元文件类型,包括.service(管理服务)、.socket(网络套接字激活)、.timer(定时任务)、.mount与.autom

linux systemd和sysvinit的区别

systemd和SysVinit是Linux系统中两种不同的初始化系统,它们的主要区别在于启动方式、依赖关系处理和管理方式。systemd采用并行启动,依赖关系通过单元文件声明,管理工具

systemctl
,而SysVinit采用串行启动,依赖关系通过脚本中的顺序控制,管理工具为
service
命令。systemd旨在提供更快的启动速度和更强大的管理功能。

systemd更快、更强大,但也更复杂。

解决方案

systemd和SysVinit的区别主要体现在以下几个方面:

  1. 启动方式:

    • SysVinit: 采用串行启动方式。系统启动时,按照预先设定的顺序逐个执行
      /etc/init.d/
      目录下的脚本。每个脚本执行完毕后,才会执行下一个脚本。这种方式启动速度慢,因为所有服务必须按顺序启动,即使某些服务之间没有依赖关系。
    • systemd: 采用并行启动方式。系统启动时,systemd会分析所有单元(Unit)之间的依赖关系,然后尽可能同时启动多个服务。这样可以显著提高启动速度,尤其是在服务器上,因为许多服务可以并发启动。
  2. 依赖关系处理:

    • SysVinit: 依赖关系通过脚本中的启动顺序和
      start_dependencies
      等变量进行控制。这种方式比较脆弱,容易出错,而且难以维护。如果依赖关系发生变化,需要手动修改脚本。
    • systemd: 依赖关系通过单元文件(Unit files)进行声明。单元文件使用一种声明式的语法,可以清晰地描述服务之间的依赖关系。systemd会自动处理这些依赖关系,确保服务按照正确的顺序启动。例如,一个需要数据库的服务可以在其单元文件中声明对数据库服务的依赖,systemd会确保数据库服务先于该服务启动。
  3. 管理方式:

    • SysVinit: 使用
      service
      命令管理服务。例如,
      service apache2 start
      可以启动Apache服务器。
      service
      命令实际上是调用
      /etc/init.d/
      目录下的脚本。
    • systemd: 使用
      systemctl
      命令管理服务。例如,
      systemctl start apache2.service
      可以启动Apache服务器。
      systemctl
      命令直接与systemd守护进程通信,可以更精确地控制服务的状态。
      systemctl
      还提供了更多的功能,例如查看服务日志、查看服务依赖关系、管理系统状态等。
  4. 日志管理:

    • SysVinit: 日志通常由各个服务自己管理,通常存储在
      /var/log/
      目录下。需要使用
      grep
      tail
      等命令手动查看日志。
    • systemd: 使用
      journald
      统一管理所有服务的日志。可以使用
      journalctl
      命令查看日志,可以按时间、服务、优先级等条件过滤日志。
      journald
      还支持持久化日志,可以将日志存储在磁盘上,方便以后分析。
  5. Cgroups支持:

    • SysVinit: 对Cgroups的支持有限。
    • systemd: 深度集成Cgroups。Cgroups是一种Linux内核特性,可以用来限制和隔离进程的资源使用,例如CPU、内存、IO等。systemd可以使用Cgroups来管理服务,可以限制服务的资源使用,防止服务占用过多资源影响其他服务。

副标题1 为什么Linux要从SysVinit迁移到systemd?

从SysVinit迁移到systemd的主要原因包括:

网钛淘拍CMS(TaoPaiCMS) V1.60
网钛淘拍CMS(TaoPaiCMS) V1.60

2013年07月06日 V1.60 升级包更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。1.[新增]后台引导页加入非IE浏览器提示,后台部分功能在非IE浏览器下可能没法使用2.[改进]淘客商品管理 首页 列表页 内容页 的下拉项加入颜色来区别不同项3.[改进]后台新增/修改淘客商品,增加淘宝字样的图标和天猫字样图标改成天猫logo图标4.[改进]为统一名称,“分类”改

下载
  • 启动速度: systemd的并行启动方式比SysVinit的串行启动方式快得多,尤其是在现代服务器上,可以显著减少启动时间。想象一下,服务器上有几十个甚至上百个服务,如果使用SysVinit,需要一个一个启动,非常耗时。而systemd可以同时启动多个服务,大大提高了启动效率。
  • 依赖关系管理: systemd的单元文件可以清晰地描述服务之间的依赖关系,避免了SysVinit脚本中容易出错的依赖关系处理。使用单元文件,可以更方便地管理和维护服务之间的依赖关系,即使依赖关系发生变化,也只需要修改单元文件,而不需要修改脚本。
  • 资源管理: systemd深度集成Cgroups,可以更好地管理服务的资源使用,防止服务占用过多资源影响其他服务。通过Cgroups,可以限制服务的CPU、内存、IO等资源使用,保证系统的稳定性和性能。
  • 日志管理: systemd的
    journald
    统一管理所有服务的日志,方便查看和分析。
    journald
    还支持持久化日志,可以将日志存储在磁盘上,方便以后分析。
  • 更强大的功能: systemd提供了更多的功能,例如定时器、socket激活、路径激活等,可以更灵活地管理服务。例如,可以使用定时器来定时执行任务,可以使用socket激活来按需启动服务,可以使用路径激活来在文件发生变化时启动服务。

副标题2 如何将SysVinit脚本转换为systemd单元文件?

将SysVinit脚本转换为systemd单元文件是一个逐步的过程,需要理解SysVinit脚本的功能,并将其转换为systemd单元文件的相应配置。以下是一个简单的示例,说明如何将一个简单的SysVinit脚本转换为systemd单元文件:

假设有一个SysVinit脚本

/etc/init.d/myapp
,内容如下:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          myapp
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start myapp daemon
# Description:       This script starts and stops the myapp daemon.
### END INIT INFO

NAME=myapp
DAEMON=/usr/local/bin/$NAME
PIDFILE=/var/run/$NAME.pid
USER=myapp

start() {
  if [ -f "$PIDFILE" ]; then
    echo "$NAME is already running"
    return 0
  fi
  echo "Starting $NAME"
  start-stop-daemon --start --quiet --pidfile "$PIDFILE" --make-pidfile --user "$USER" --exec "$DAEMON"
  return 0
}

stop() {
  echo "Stopping $NAME"
  start-stop-daemon --stop --quiet --pidfile "$PIDFILE" --retry 5 --exec "$DAEMON"
  return 0
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

对应的systemd单元文件

/etc/systemd/system/myapp.service
内容如下:

[Unit]
Description=Myapp daemon
After=network.target remote-fs.target syslog.target

[Service]
User=myapp
ExecStart=/usr/local/bin/myapp
PIDFile=/var/run/myapp.pid
Restart=on-failure

[Install]
WantedBy=multi-user.target

解释:

  • [Unit]
    部分:
    • Description
      : 描述服务的用途。
    • After
      : 指定服务的启动顺序。
      network.target
      表示网络服务启动后才启动该服务,
      remote-fs.target
      表示远程文件系统挂载后才启动该服务,
      syslog.target
      表示日志服务启动后才启动该服务。
  • [Service]
    部分:
    • User
      : 指定运行服务的用户。
    • ExecStart
      : 指定启动服务的命令。
    • PIDFile
      : 指定PID文件路径。
    • Restart
      : 指定服务失败后是否自动重启
      on-failure
      表示服务失败后自动重启。
  • [Install]
    部分:
    • WantedBy
      : 指定服务应该被哪个target启动。
      multi-user.target
      表示多用户模式下启动该服务。

转换步骤:

  1. 分析SysVinit脚本: 理解脚本的功能,包括启动、停止、重启等操作,以及依赖关系。
  2. 创建单元文件:
    /etc/systemd/system/
    目录下创建一个以
    .service
    结尾的单元文件。
  3. 编写
    [Unit]
    部分:
    描述服务的用途,并指定服务的启动顺序。
    After
    指令可以用来指定服务的依赖关系。
  4. 编写
    [Service]
    部分:
    指定运行服务的用户、启动服务的命令、PID文件路径、重启策略等。
  5. 编写
    [Install]
    部分:
    指定服务应该被哪个target启动。
  6. 启用服务: 使用
    systemctl enable myapp.service
    命令启用服务。
  7. 启动服务: 使用
    systemctl start myapp.service
    命令启动服务。
  8. 检查服务状态: 使用
    systemctl status myapp.service
    命令检查服务状态。

副标题3 systemd单元文件的类型有哪些?

systemd单元文件有多种类型,每种类型用于管理不同类型的系统资源。常见的单元文件类型包括:

  • Service Unit (.service): 用于管理后台服务进程。这是最常用的单元文件类型,用于定义如何启动、停止、重启服务,以及服务的依赖关系、资源限制等。
  • Socket Unit (.socket): 用于管理网络套接字。可以用于实现socket激活,即在有客户端连接时才启动服务。
  • Timer Unit (.timer): 用于管理定时任务。可以替代
    cron
    ,用于定时执行任务。
  • Mount Unit (.mount): 用于管理文件系统挂载点。可以用于自动挂载文件系统。
  • Automount Unit (.automount): 用于管理自动挂载点。可以用于按需挂载文件系统,即在访问挂载点时才挂载文件系统。
  • Path Unit (.path): 用于监视文件或目录。可以在文件或目录发生变化时触发事件。
  • Target Unit (.target): 用于将多个单元组合在一起。可以用于定义系统启动的不同阶段,例如
    multi-user.target
    表示多用户模式。
  • Swap Unit (.swap): 用于管理交换分区。可以用于启用或禁用交换分区。

每种单元文件类型都有其特定的配置选项,可以根据需要进行配置。例如,

Service Unit
ExecStart
ExecStop
Restart
等配置选项,
Timer Unit
OnCalendar
Unit
等配置选项。

了解不同单元文件类型的用途,可以更好地使用systemd管理系统资源。例如,可以使用

Timer Unit
来定时备份数据,可以使用
Socket Unit
来实现按需启动服务,可以使用
Path Unit
来在配置文件发生变化时自动重启服务。

总而言之,systemd是一个强大的初始化系统,它提供了比SysVinit更快的启动速度、更强大的管理功能和更灵活的配置选项。虽然systemd比SysVinit更复杂,但是学习systemd是值得的,因为它可以帮助你更好地管理Linux系统。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

345

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2074

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

410

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

393

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

219

2023.10.19

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

8

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号