初识systemctl

 

 

从很久很久以前我们就在使用静态运行级别。而systemd提供了更为动态灵活的机制,来管控你的系统。

 

运行级别 vs. 状态

SysVInit使用静态的运行级别来构建不同的启动状态,大部分发布版本中提供了以下5个运行级别:

  • 单用户模式(Single-user mode)
  • 多用户模式,不启动网络服务(Multi-user mode without network services started)
  • 多用户模式,启动网络服务(Multi-user mode with network services started)
  • 系统关机(System shutdown)
  • 系统重启(System reboot)

对于我来说,使用多个运行级别并没有太大的好处,但它们却一直在系统中存在着。 不同于运行级别,systemd可以创建不同的状态,状态提供了灵活的机制来设置启动时的配置项。这些状态是由多个unit文件组成的,状态又叫做启动目标(target)。启动目标有一个清晰的描述性命名,而不是像运行级别那样使用数字。unit文件可以控制服务、设备、套接字和挂载点。参考下/usr/lib/systemd/system/graphical.target,这是CentOS 7默认的启动目标:

  1. [Unit]
  2. Description=Graphical Interface
  3. Documentation=man:systemd.special(7)
  4. Requires=multi-user.target
  5. After=multi-user.target
  6. Conflicts=rescue.target
  7. Wants=display-manager.service
  8. AllowIsolate=yes
  9. [Install]
  10. Alias=default.target

现在再看看unit文件长什么样? 我来给大家找个例子。 unit文件存放在下面的两个目录下:

  • /etc/systemd/system/
  • /usr/lib/systemd/system/

我们可以修改第一个目录中的文件来进行自定义配置,而第二个目录中的文件是包安装时保存的备份。/etc/systemd/system/的优先级高于/usr/lib/systemd/system/。不错,用户优先级高于机器。下面是Apache Web server的unit文件:

  1. [Unit]
  2. Description=The Apache HTTP Server
  3. After=network.target remote-fs.target nss-lookup.target
  4. [Service]
  5. Type=notify
  6. EnvironmentFile=/etc/sysconfig/httpd
  7. ExecStart=/usr/sbin/httpd/ $OPTIONS -DFOREGROUND
  8. ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
  9. ExecStop=/bin/kill -WINCH ${MAINPID}
  10. KillSignal=SIGCONT
  11. PrivateTmp=true
  12. [Install]
  13. WantedBy=multi.user.target

就算是对于新手而言,上面的文件也是非常简单易懂的。这可比SysVInit的init文件要简单多了,为了便于比较,下面截取了/etc/init.d/apache2的一个片段:

  1. SCRIPTNAME="${0##*/}"
  2. SCRIPTNAME="${SCRIPTNAME##[KS][0-9][0-9]}"
  3. if [ -n "$APACHE_CONFDIR" ] ; then
  4. if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
  5. DIR_SUFFIX="${APACHE_CONFDIR##/etc/apache2-}"
  6. else
  7. DIR_SUFFIX=

整个文件一共有410行。

你可以检查unit文件的依赖关系,我常常被这些复杂的依赖关系给吓到:

  1. $ systemctl list-dependencies httpd.service

cgroups

cgroups,或者叫控制组,在Linux内核里已经出现好几年了,但直到systemd的出现才被真正使用起来。The kernel documentation中是这样描述cgroups的:“控制组提供层次化的机制来管理任务组,使用它可以聚合和拆分任务组,并管理任务组后续产生的子任务。”换句话说,它提供了多种有效的方式来控制、限制和分配资源。systemd使用了cgroups,你可以便捷的查看它,使用下面的命令可以展示你系统中的整个cgroup树:

  1. $ systemd-cgls

你可以使用ps命令来进行查看cgroup树:

  1. $ ps xawf -eo pid,user,cgroup,args

常用命令集

下面的命令行展示了如何为守护进程重新装载配置文件,注意不是systemd服务文件。 使用这个命令能够激活新的配置项,且尽可能少的打断业务进程,下面以Apache为例:

  1. # systemctl reload httpd.service

重新装载服务文件(service file)需要完全停止和重新启动服务。如果服务挂死了,用下面的命令行可以恢复它:

  1. # systemctl restart httpd.service

你还可以用一个命令重启所有的守护进程。这个命令会重新装载所有守护进程的unit文件,然后重新生成依赖关系树:

  1. # systemctl daemon-reload

在非特权模式下,你也可以进行重启、挂起、关机操作:

  1. $ systemctl reboot
  2. $ systemctl suspend
  3. $ systemctl poweroff

按照惯例,最后给大家介绍一些systemd的学习材料。Here We Go Again, Another Linux Init: Intro to systemd 和 Understanding and Using Systemd 是不错的入门材料,这两份文档里会链接到更多其他资源。

 

 

systemd提供更优秀的框架以表示系统服务间的依赖关系

实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果

systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。

systemd尽可能减少对shell脚本的依赖。

 

systemd单位类型

 

(systemctl --type=单位类型,用来过滤单位):

服务(service):管理着后台服务;

挂载(mount)自动挂载(automount):用来挂载文件系统;

目票(target):运行级别;

套接字(socket):用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位;

 

开机服务管理

 

=================================================

systemd添加新的unit(daemon)

也就是采用systemd来管理,/sbin/chkconfig --add foo相当

把新生成的foo.service 放到/usr/lib/systemd/system/下面,然后采用load命令导入

systemctl load foo.service

 

删除unit(daemon)

删除一个unit没有相应的命令,通常的做法是停掉daemon,然后删除相应的配置文件。

 

开机启动unit

systemctl enable postfix.service

增加由/usr/lib/systemd/system/到/etc/systemd/system/multi-user.target.wants/下的软链接

ln -s '/usr/lib/systemd/system/postfix.service' '/etc/systemd/system/multi-user.target.wants/postfix.service'

 

开机不启动unit

systemctl disable httpd.service

删除/etc/systemd/system/multi-user.target.wants下的软链接

 

查看开机是否启动

systemctl is-enabled .service #查询服务是否开机启动

 

systemd查看开机自启动的程序

相当于chkconfig --list

ls /etc/systemd/system/multi-user.target.wants/

 

查看systemd单元加载及活动情况

systemctl

 

显示启动失败的单元

systemctl --failed

 

查看systemd管理的所有单元

systemctl list-unit-files

 

服务管理

 

=================================================

启动服务

systemctl start httpd.service

关闭服务

systemctl stop httpd.service

重启服务

systemctl restart httpd.service

重新加载

systemctl reload httpd.service

查看状态

systemctl status httpd.service

包括启动状态、启动时间、主进程及相关进程、相关日志

 

运行级别

 

=================================================

systemd用target替代了runlevel的概念,多个的 'target' 可以同时激活

systemd不使用/etc/inittab,如何查看系统默认的运行级别

ll /etc/systemd/system/default.target

查看这个软链接真正指向的文件

 

如何查看系统的当前运行级别

runlevel依然可用

systemd的方法是:systemctl list-units --type=target

 

改变当前target,重启无效

systemctl isolate graphical.target

 

修改默认运行级别

1.首先删除已经存在的符号链接

rm /etc/systemd/system/default.target

2.默认级别转换为3(文本模式)

systemctl enable multi-user.target

相当于ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

3.重启

reboot

 

7.0中一个最主要的改变,就是切换到了systemd。它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理。systemd兼容SysV和Linux标准组的启动脚本。

 

Systemd是一个Linux操作系统下的系统和服务管理器。它被设计成向后兼容SysV启动脚本,并提供了大量的特性,如开机时平行启动系统服务,按需启动守护进程,支持系统状态快照,或者基于依赖的服务控制逻辑。

 

 

 

先前的使用SysV初始化或Upstart的红帽企业版Linux版本中,使用位于/etc/rc.d/init.d/目录中的bash初始化脚本进行管理。而在RHEL 7/CentOS 7中,这些启动脚本被服务单元取代了。服务单元以.service文件扩展结束,提供了与初始化脚本同样的用途。要查看、启动、停止、重启、启用或者禁用系统服务,你要使用systemctl来代替旧的service命令。

 

注:为了向后兼容,旧的service命令在CentOS 7中仍然可用,它会重定向所有命令到新的systemctl工具。

 

使用systemctl来启动/停止/重启服务

要启动一个服务,你需要使用如下命令:

 

1.# systemctl start httpd.service

这会启动httpd服务,就我们而言,Apache HTTP服务器。

 

要停掉它,需要以root身份使用该命令:

 

1.# systemctl stop httpd.service

要重启,你可以使用restart选项,如果服务在运行中,它将重启服务;如果服务不在运行中,它将会启动。你也可以使用try-start选项,它只会在服务已经在运行中的时候重启服务。同时,reload选项你也可以有,它会重新加载配置文件。

 

1.# systemctl restart httpd.service

2.# systemctl try-restart httpd.service

3.# systemctl reload httpd.service

我们例子中的命令看起来会像下面这样:

 

 

 

检查服务状态

要检查服务状态,你可以使用status选项,看这里:

 

1.# systemctl status httpd.service

输出结果就像这样:

 

 

 

它会告诉你运行中的服务的方方面面。

 

使用启用/禁用服务来控制开机启动

你也可以使用enable/disable选项来控制一个服务是否开机启动,命令如下:

 

1.# systemctl enable httpd.service

2.# systemctl disable httpd.service

输出结果看这里:

 

 

1. 更快启动

sysvinit一次一个串行地启动进程。

 

而Systemd则并行地启动系统服务进程,并且最初仅启动确实被依赖的那些服务,极大地减少了系统引导的时间。

 

你可以用下面的命令看到系统引导用时:

 

1.[root@linoxide ~]# systemd-analyze

 

 

使用 time 参数也能够显示同样的内容。

 

1.[root@linoxide ~]# systemd-analyze time

 

 

如果你想以进程初始化所占用时间排序打印出所有正在运行的单元列表,那么systemd-analyze命令可以帮助你完成这个任务。

 

1.[root@linoxide ~]# systemd-analyze blame

 

 

上面的截屏只显示了小部分进程,你可以就像less分页器那样用箭头滚动列表。

 

2. systemctl 命令

systemctl命令是自systemd出现以来被广泛讨论的命令。你可以通过这个命令管理你的整个系统,让我们通过探究这个命令来更进一步。

 

2.1 列出单元

systemctl命令可以带上list-units,也可以什么选项都不带来列出所有正在运行的单元。

 

1.[root@linoxide ~]# systemctl

 

1.[root@linoxide ~]# systemctl list-units

 

 

2.2 列出失败的单元

运行失败的单元可以用带--failed选项的命令显示出来。

 

1.[root@linoxide ~]# systemctl --failed

 

 

你可以在这篇文章很多地方看到systemctl的用法。

 

3. 管理服务

让我们来看看systemd是怎么管理系统服务的。

 

3.1 激活的服务

所有被激活的服务可以同下面这条命令来查看。

 

1.[root@linoxide ~]# systemctl list-units -t service

 

 

3.2 服务状态

在sysvinit中,我们可以用“service”命令来管理服务,但在systemd中,我们用systemctl这个命令。 我们可以用下面这个命令来查看服务是否在运行。

 

1.[root@linoxide ~]# systemctl status dnsmasq

 

 

3.3 启动一个服务

用下面这条命令来启动服务。

 

1.[root@linoxide ~]# systemctl start dnsmasq

对应于service命令,这个命令不进行输出。但是毋庸置疑,我们可以通过再次查看这个刚刚被启动的服务的status(状态)来确认他是否被成功地启动了。

 

 

 

3.4 停止一个服务

现在聪明的你一定知道怎么在systemd下用命令来关闭服务了吧。

 

1.[root@linoxide ~]# systemctl stop dnsmasq

 

 

3.5 重启一个服务

类似的,重启系统服务是用‘systemctl restart’来管理的。

 

1.[root@linoxide ~]# systemctl restart dnsmasq

 

 

3.6 重新加载一个服务

在我们需要重新加载服务的配置文件又不想重启这个服务(例如ssh)时,我们可以用这个命令。

 

1.[root@linoxide ~]# systemctl reload sshd

 

 

虽然上述几个命令的语法是可以工作的,但是官方文档建议我们用下面这种语法形式来运行命令(LCTT 译注,即使用在服务名后面跟上“.service”的完整名称):

 

1.[root@linoxide ~]# systemctl status dnsmasq.service

 

 

!click_multi!

 

 


---------------------
作者:skdkjzz
来源:优快云
原文:https://blog.youkuaiyun.com/skdkjzz/article/details/53106516
版权声明:本文为作者原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值