首页 > 运维 > linux运维 > 正文

Linux systemd和SysVinit的区别

P粉602998670
发布: 2025-09-09 10:07:01
原创
659人浏览过
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的主要原因包括:

魔乐社区
魔乐社区

天翼云和华为联合打造的AI开发者社区,支持AI模型评测训练、全流程开发应用

魔乐社区 102
查看详情 魔乐社区
  • 启动速度: 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系统。

以上就是Linux systemd和SysVinit的区别的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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