开篇
重新开始写博客,这篇作为开篇,继忙碌地工作了快两年之后,发现抽时间将一些想法和经验沉淀下来也是如此重要。而整理文章的过程本身也是对思绪的整理,可以帮助我们更好的理解所做的事情。 接下来会把旧博客的备份文章重新放上来。
重新开始写博客,这篇作为开篇,继忙碌地工作了快两年之后,发现抽时间将一些想法和经验沉淀下来也是如此重要。而整理文章的过程本身也是对思绪的整理,可以帮助我们更好的理解所做的事情。 接下来会把旧博客的备份文章重新放上来。
firewalld 的出现带来了许多新的亮点,它使得防火墙规则管理更加方便和统一,但 firewalld 项目本身还有诸多不完善的地方,还需要一些时间的沉淀才能变得更加稳定和得到更多软件社区的支持。在我们使用过程中也发现了其存在的一些问题,我们也正在努力参与到 firewalld 的改进和测试当中,也希望有更多的人能够参与进来。
自 fedora18 开始,firewalld 已 经成为默认的防火墙管理组件被集成到系统中,用以取代 iptables service 服务,而基于 fedora18 开发的RHEL7,以及其一脉相承的CentOS7 也都使用 firewalld 作为默认的防火墙管理组件,无论是对于日常使用还是企业应用来讲这样的变更都或多或少的为使用者带来了影响。在浏览完本文前我们先不急着下结论到底这样的变化是好是坏,让我们“剥离它天生的骄傲,排除这些外界的干扰“,来看看 firewalld 到底是什么样的。 以下内容以 CentOS7 系统为例进行讲解,我们假设读者对于 iptables 防火墙相关知识有一定的掌握。
我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。
如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将 变更部分保存并更新到运行中的 iptables 即可。
这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。
那么 firewalld 除了是动态防火墙以外,它还具有哪些优势或者特性呢?第一个是配置文件。firewalld 的配置文件被放置在不同的 xml 文件当中,这使得对规则的维护变得更加容易和可读,有条理。相比于 iptables 的规则配置文件而言,这显然可以算作是一个进步。第二个是区域模型。firewalld 通过对 iptables 自定义链的使用,抽象出一个区域模型的概念,将原本十分灵活的自定义链统一成一套默认的标准使用规范和流程,使得防火墙在易用性和通用性上得到提升。令一个重要特性是对 ebtables 的支持,通过统一的接口来实现 ipt/ebt 的统一管理。还有一个重要特性是富语言。富语言风格的配置让规则管理变得更加人性化,学习门槛相比原生的 iptables 命令有所降低,让初学者可以在很短时间内掌握其基本用法,规则管理变得更快捷。
本文不打算重复阐述现有文档中的基本知识,仅 仅提供一些对现有文档中知识的补充和理解,详细的文档请参阅man page或本文结尾处的延伸阅读1部分。
firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block dmz drop external home internal public trusted work ,不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public,而在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。使用下面的命令分别列出所有支持的 zone 和查看当前的默认 zone:
firewall-cmd --get-zones
firewall-cmd --get-default-zone
所有可用 zone 的 xml 配置文件被保存在 /usr/lib/firewalld/zones/ 目录,该目录中的配置为默认配置,不允许管理员手工修改,自定义 zone 配置需保存到 /etc/firewalld/zones/ 目录。防火墙规则即是通过 zone 配置文件进行组织管理,因此 zone 的配置文件功能类似于 /etc/sysconfig/iptables 文件,只不过根据不同的场景默认定义了不同的版本供选择使用,这就是 zone 的方便之处。
在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等,与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用,当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中。service 配置的好处显而易见,第一,通过服务名字来管理规则更加人性化,第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:
firewall-cmd --get-services
firewall-cmd --list-services
在 firewalld 官方文档中提供了若干使用示例,这些示例对学习防火墙管理是很好的基本参考资料。接下来我们将通过一些真实的使用示例来展示如何使用 firewalld 对防火墙规则进行管理。
出于安全因素我们往往需要对一些关键的网络服务默认端口号进行变更,如 ssh,ssh 的默认端口号是 22,通过查看防火墙规则可以发现默认是开放了 22 端口的访问的:
[root@localhost ~]# iptables -S
... ...
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
假设自定义的 ssh 端口号为 22022,使用下面的命令来添加新端口的防火墙规则:
firewall-cmd --add-port=22022/tcp
如果需要使规则保存到 zone 配置文件,则需要加参数 --permanent。我们还可以使用自定义 service 的方式来实现同样的效果:
在 /etc/firewalld/services/
目录中添加 自定义配置文件 custom-ssh.xml ,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>customized SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22022"/>
</service>
执行命令重载配置文件,并添加防火墙规则:
systemctl reload firewalld
firewall-cmd --add-service=custom-ssh
一旦新的规则生效,旧的 ssh 端口规则旧可以被禁用掉:
firewall-cmd --remove-service=ssh
某些特殊的服务我们并不想开放给所有人访问,只需要开放给特定的IP地址即可,例如 SNMP 服务,我们将使用 firewalld 的富语言风格配置指令:
firewall-cmd --add-rich-rule="rule family='ipv4' source address='10.0.0.2' port port='161' protocol='udp' accept"
查看防火墙规则状态,证明结果正是我们想要的:
[root@localhost ~]# iptables -S
... ...
-A IN_public_allow -s 10.0.0.2/32 -p udp -m udp --dport 161 -m conntrack --ctstate NEW -j ACCEPT
参考链接:2
以下是数天前NGINX官方博客发表的一篇有关nginx性能优化的文章,内容简明扼要,值得一读。译文在原文基础上略有变动,如有不足,欢迎指正。
NGINX作为一款高性能负载均衡器,缓存和web服务器被大家所熟知,为全世界40%的网站提供着服务。NGINX和Linux系统中的大多数默认配置对普通应用来说已经很合适,然而要想达到更高的性能以应对高负载场景那么一些性能优化是必须的。这篇文章将会探讨一些在性能调优时涉及到的NGINX和Linux系统参数。当然可供调节的参数众多,我们这 里只会涉及部分对大多数用户来说被使用最多的。其他没有被涉及到的参数多是需要对系统有深入了解之后才需要接触到的。
我们假定此文读者对NGINX的基本架构和配置有一定了解,此文不会重复NGINX文档中的内容,如有涉及我们仅会给出链接。
在做性能调优时一个最佳实践是一次只动一个参数,如果调整后未达到预期效果,则将其修改回初始值。我们将从Linux系统的一些参数开始讲起,这些参数将对后续的NGINX配置调整有着至关重要的作用。
现代Linux内核(2.6+)中的很多参数设置都是十分到位的,但是仍然有一些是需要我们进行调整的。如果一些默认的值设置得太小,那么在内核日志中将记录着错误信息,这预示着我们需要对其中一些参数进行调整了。在众多选项当中我们只会涉及到对大多数负载场景都实用的,请参考Linux系统文档以了解更多有关这些选项的细节。
下面的设置与网络连接和连接队列有直接关联。如果你有大量的接入请求,且偶尔出现一些失效请求的话,那么下面的设置将起到优化效果。
net.core.somaxconn
此参数控制NGINX等待连接的队列大小。因NGINX处理连接的速度快,所以一般这个参数不建议被设置太大,但是默认值有点偏低,所以针对大流量网站来说调整这个参数是必须的,如果此参数被设置多低那么有可能在内核日志中看到报错,这时需要调整此参数直到报错消失为止。注意,如果此参数设置大于512的话,则需要对NGINX配置中的listen指令中的backlog参数进行同步调整。
net.core.netdev_max_backlog
此参数控制数据包在进入CPU处理前,在网卡中被缓存的量,需要处理大带宽的机器需要增加此参数的值。设置此参数需要参考具体的网卡的文档或者根据系统错误日志进行调整。
文件描述符是系统在处理如网络连接和打开文件时的系统资源。NGINX中每个连接的建立可能需要占用两个文件描述符,例如代理模式下,一个用来处理客户端连接,一个用来处理到后端的连接,而如果HTTP keepalives被启用的话对文件描述符的消耗会轻松一些。需要处理高并发的机器建议调整下面的参数:
sys.fs.file_max
这个参数影响系统全局的文件描述符打开数量限制。
nofile
此参数影响单个用户的文件描述符数量,在/etc/security/limits.conf中进行设置。
当NGINX被作为代理服务器时,每个到后端服务器的连接将占用一个临时的,或短期的端口。
net.ipv4.ip_local_port_range
此参数控制可被用作临时端口的起始范围,一个通用设置是1024-65000
net.ipv4.tcp_fin_timeout
此参数控制一个连接使用完毕后端口被回收再利用的超时时间,一般默认设置为60秒,但是一般设置降低到30或者15秒都是没有问题的。
下面介绍NGINX中对性能有影响的参数,如下面提到的一样,我们只讲解一些适用于大多数用户的参数进行调整,其他未提及的可能是不建议调整的。
NGINX可以同时启动多个worker进程,每个进程处理大量的连接,通过调整下面的参数可以控制启动的进程数量和每个进程所处理的连接数量。
worker_processes
此参数控制NGINX启动进程的数量,在多数情况下每个cpu核心分配一个进程是最佳的,将参数值设置为auto即可达到。很多场景下都需要增加此参数的值,如在需要处理大量磁盘I/O的场景。默认的值是1。
worker_connections
此参数控制在同一时刻单个进程可以处理的最大连接数。默认值512,但大多数系统都可以处理更大的量。其最佳值与实际场景和系统有关,需要经过反复测试才能得出。
Keepalive连接降低连接的建立和关闭对CPU和网络的消耗,对性能有着十分重要的影响。NGINX会关闭所有客户端的连接,且与后端服务器的连接都是独立的。NGINX支持到客户端和后端的keepalive, 下面的参数对客户端keepalive进行控制:
keepalive_requests
此参数控制通过单个keepalive连接可以处理的客户端请求数量,默认值是100,可以调整为更大的值,特别是在通过单个客户端进行压力测试的时候。
keepalive_timeout
此参数控制单个keepalive连接在空闲状态保持连接的时间。
下面的参数对后端keepalive进行控制:
keepalive
此参数控制单个worker进程保持到upstream server的keepalive连接数量,且默认没有设置。如需启动到后端的keepalive连接则需要进行如下设置:
proxy_http_version 1.1;
proxy_set_header Connection "";
请求产生的日志记录对CPU和I/O都有消耗,一个可以降低资源消耗的办法是启用日志缓存。启用日志缓存后,NGINX将缓存部分请求日志,然后一次性写入文件。要启用日志缓存只需要在access_log中增加“buffer=size”的设置即可,size值控制缓存的大小,同时也可以设置“flush=time”以控制缓存的时间,设置了两个参数后,NGINX会在缓存被充满或者日志条目数达到flush值时回写日志。在worker进程重启或者关闭时也会回写日志。而永久禁用日志记录也是可以实现的。
Sendfile 是一项操作系统特性,可以被NGINX启用。它通过对数据在文件描述符之间进行in-kernel copying来提供更快的tcp数据传输处理,一般通过zero-copy技术实现。NGINX使用它来完成缓存数据 或者磁盘数据到socket的写操作,不产生任何的用户空间上下文切换开销,可降低CPU负载和提高处理速度。当启用sendfile特性之后,由于数据不经过用户空间,使得对数据内容进行处理的filter将不起作用,例如gzip filter将默认被禁用。
NGINX也为用户提供设置连接限制的能力,用来对客户请求的资源进行控制,对系统性能,用户体验和安全性也产生极大的影响。下面是部分用于请求限制的指令:
limit_conn/limit_conn_zone
这两个指令用来控制NGINX可接收的连接数,例如来自单个客户端IP的连接请求。这有助于限制客户端建立过多的连接并消耗过多资源。
limit_rate
这个指令控制单个连接允许的客户端最大带宽。这可以避免系统被部分客户端耗尽资源,保证了为每个客户端请求提供服务的质量。
limit_req/limit_req_zone
这两个指令可以控制NGINX的请求回复水平,以不至于被部分客户端拖垮。也被用来加强安全性,特别是对登陆页面等进行有效的保护。
max_conns
这个指令用来控制到后端服务器的最大连接数,保护后端服务器不被拖垮,默认值是zero,没有任何限制。
queue
如果max_conns被设置,那么此参数对超过最大连接时的状态产生影响,可以设置队列中请求的个数和缓冲时间,如果没有设置此参数,则队列不存在。
NGINX还有一些特性能对某些特定场景下的应用起到性能优化作用,我们将探讨其中的两个特性。
当把NGINX作为负载均衡器来使用的场景下,启用cache可以显著改善到客户端的响应时间,且显著降低后端服务器的压力。如需了解更多NGINX的caching设置,可以参考此链接:: NGINX Admin Guide – Caching.
对回应内容进行压缩将有效降低回应内容的大小,降低带宽消耗,然而压缩将增加CPU的开销,所以带宽成本较高时启用才是明智之举。需要明确注意的是不要对已经压缩的内容启用压缩,例如jpeg格式的图片,如需了解更多有关压缩的设置可以参考此文档: NGINX Admin Guide – Compression and Decompression
原文链接:
这里总结了个人比较推崇的shell脚本coding style,编写出方便阅读和维护的脚本是运维人员的基本操守。
1.关于缩进: 一个tab定义为4个空格; 关于这个缩进距离貌似有太多的的说法了,有的会用8个空格,有的用2个空格,还有的用4个空格;不过最终取决于团队风格。但是记住,正确的做法是项目、文件、成员间全部统一,千万不要出现一个项目内各种缩进,tab和空格混用,甚至一个文件中的缩进都不统一的情况。在vim中设置如下:
set ts=4
set sw=4
set expandtab
2.尽量缩短单行的长度,最好不超过72字符(注意:这个限制因历史原因导致,为了兼容那些老的终端设备而考虑,实际上现在已经不适用了,单行代码可以更长,只要不要超过大多数屏幕的输出宽度就好)
bad:
thisisaverylongline || thisisanotherlongline
good:
thisisaverylongline ||
thisisanotherlongline
3.注释尽量保持清晰的层次,#号与注释文本间保持一个空格以示和代码的区分
bad:
#this is a comment
#this is a code line
good:
# this is a comment
#this is code line
4.定义函数可以不用写function关键字,函数名字尽量短小无歧义,尽量传递返回值
bad:
function cmd1
good:
cmd_start() {
dosomethinghere
return 0
}
5.全局变量用大写,局部变量用小写,函数内尽量不要使用全局变量,以免混淆导致变量覆盖,注意尽量使用小写表示变量
bad:
foo() {
a=2
echo $a
}
a=1
echo $a
good:
foo(){
local a
a=2
echo $a
}
A=1
echo $A
6.使用内建的[] 、[[]] 进行条件测试,避免使用test命令
bad:
test -f filename
good:
[ -f filename ]
[[ -n $string ]]
7.使用$(())进行普通运算,尽量避免使用expr或其他外部命令 $[]也可用于计算
bad:
num=$(expr 1 + 1)
good:
num=$((1+1))
num=$[1+2]
8.管道符左右都应加空格,重定向符空格加左不加右
bad:
find /data -name tmp*|xargs rm -fr
cat a>b
good:
find /data -name tmp* | xargs rm -fr
cat a >b
9.当source
命令属于外部命令的时候,我们应尽量使用.
,当视力不好怕写错看错的时候,应尽量不用.
而用source
,在实际使用中我们发现.
号极难辨认,这里推荐使用source命令,更方便维护。
bad:
. func_file
good:
source func_file
10.if 和 then 之间使用分号+空格分隔, 不要用换行,书写上和c style类似:
bad:
grep string logfile
if [ $? -ne 0 ]
then
dosomething
fi
while 1
do
do something here
done
good:
if grep string logfile; then
dosomething
fi
while 1; do
do something here
done
注意;和then间有一个空格的距离
11.如果grep能直接处理文件输入那就不要和cat连用; 如果wc能直接从文件统计就不要和cat连用; 如果grep能统计行数就不要和wc连用
bad:
cat file | grep tring
cat file.list | wc -l
grep avi av.list | wc -l
good:
grep tring file
wc -l file.list
grep -c avi av.list
12.如果awk的时候需要搜索恰好awk又能搜索,那么就不要再和grep连用
bad:
dosomething | grep tring | awk '{print $1}'
good:
dosomething | awk '/tring/' '{print $1}'
13、尽量编写兼容旧版本shell风格且含义清晰的代码,不推荐不兼容写法或者不方便他人维护的代码
bad:
do_some_thing |& do_another_thing
do_some_thing &>> some_where
good:
do_some_thing 2>&1 | do_another_thing
do_some_thing >some_where 2>&1
注意 : 以上仅代表个人习惯和理解,并不能适用于所有人,适合的才是最好的。
拓展阅读文档:
但是由于计算机软硬件的不断发展,人们逐渐发现sysvinit所提供的功能已经无法满足当前的需求,服务多年的sysvinit终将过时,于是一些替代的方案开始出现,这其中包括upstart ,systemd等。
在linux的世界里,第一个启动到用户空间的进程名叫init,其pid为1,init进程启动完毕后,它相当于其他进程的根,负责将其他的服务进程启动起来,最终启动成为一个完整可用的系统。而提供这个init程序的软件名为sysvinit,它在整个linux系统中所担任的角色重要程度无可厚非。但是由于计算机软硬件的不断发展,人们逐渐发现sysvinit所提供的功能已经无法满足当前的需求,服务多年的sysvinit终将过时,于是一些替代的方案开始出现,这其中包括upstart ,systemd等。
为什么说sysvinit会过时呢?我们从用户需求的角度来看不难发现,其实我们对init的最原始最核心需求是,将系统从内核引导至用户空间,而由于现在硬件水平的发展,使得我们在单纯的原始需求之上产生了新的或者更多的需求,那就是不仅要引导系统,而且要快速的引导系统。而早在sysvinit诞生的那个时候启动速度的重要程度似乎不是很高,所以它在这方面显得有些老是很自然的。现在让我们继续思考一下如何才能实现快速引导。试想,当一个系统启动的时候需要启动长长的一列服务,这样的系 统启动速度应该不会快到哪里去,如大多数人使用桌面系统的情况一样,一个加快系统启动速度的最直接方法就是减少启动项,把不必要的启动项禁止掉。而另外一个方法则实现起来不像第一个这么简单,那就是并行启动。并行启动可以带来的速度提升显而易见,我们只需要尽可能保证让更多的服务可以并行启动即可。而从其他方面来看sysvinit由于对脚本的依赖导致启动完毕所有服务过程中需要大量的执行外部命令,这一点也将导致引导速度的变慢。
当一项标准已经无法满足当下发展的需求时,最好的办法是打破陈规让自己变成新的标准。systemd就是这么做的,因为现实的需要它已经不能顾及POSIX标准了,以不至于阻碍其更好的发展,而systemd在设计之初也和苹果的launchd在某些地方不谋而合。尽管在最初的时候这种做法没有得到所有人的认可甚至是惹恼了一些家伙,但是现在看来systemd已经成为了事实上的标准了,现在已经采用systemd的发行版有fedora,opensuse,debian,ubuntu,rhel7,archlinux等,尽管在systemd的推广过程中发生了很多曲折,但最终大家的选择是一致的---朝着更好的方向发展而不是墨守陈规。 在功能上,systemd不仅仅是解决了现有程序的种种问题,而且包含了大量新的特性,这意味着系统中原本需要的很多组件现在也都可以下岗了,下面来看看systemd的一些特性:
下面我们将通过一些例子来演示一些基本的管理命令,这些命令对于系统管理员来说至关重要。
任何启动项,只要是在系统启动时有被执行到,不论启动成功还是失败,systemd都能够记录下他们的状态,直接执行不带参数的systemctl命令即可观察到,如下:
# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Aut
sys-devices-pci...0-backlight-acpi_video1.device loaded active plugged /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0
sys-devices-pci...0-backlight-acpi_video0.device loaded active plugged /sys/devices/pci0000:00/0000:00:02.0/backlight/ac
sys-devices-pci...00-0000:00:19.0-net-em1.device loaded active plugged 82579LM Gigabit Network Connection
sys-devices-pci...d1.4:1.0-bluetooth-hci0.device loaded active plugged /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1
sys-devices-pci...000:00:1b.0-sound-card0.device loaded active plugged 6 Series/C200 Series Chipset Family High Definiti
sys-devices-pci...0000:03:00.0-net-wlp3s0.device loaded active plugged RTL8188CE 802.11b/g/n WiFi Adapter
sys-devices-pci...-0:0:0:0-block-sda-sda1.device loaded active plugged ST9500420AS
sys-devices-pci...-0:0:0:0-block-sda-sda2.device loaded active plugged ST9500420AS
sys-devices-pci...-0:0:0:0-block-sda-sda3.device loaded active plugged ST9500420AS
sys-devices-pci...-0:0:0:0-block-sda-sda5.device loaded active plugged ST9500420AS
sys-devices-pci...-0:0:0:0-block-sda-sda6.device loaded active plugged ST9500420AS
sys-devices-pci...-0:0:0:0-block-sda-sda7.device loaded active plugged LVM PV EKHM59-PY9G-AoRX-Nr9k-nnxN-XxxO-DFcj4N on
sys-devices-pci...0:0:0-0:0:0:0-block-sda.device loaded active plugged ST9500420AS
sys-devices-pci...-1:0:0:0-block-sdb-sdb1.device loaded active plugged KINGSTON_SVP200S360G
sys-devices-pci...-1:0:0:0-block-sdb-sdb2.device loaded active plugged LVM PV rlRqSb-IlQn-DJQi-i7fg-sUV5-3bjI-g2npg7 on
sys-devices-pci...1:0:0-1:0:0:0-block-sdb.device loaded active plugged KINGSTON_SVP200S360G
要检查具体的服务,则使用status选项加上服务名即可,如下:
# systemctl status libvirtd
libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled)
Active: active (running) since 一 2014-04-07 19:10:30 CST; 9min ago
Docs: man:libvirtd(8)
http://libvirt.org
Main PID: 1673 (libvirtd)
CGroup: /system.slice/libvirtd.service
├─1673 /usr/sbin/libvirtd
└─1804 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
4月 07 19:10:33 localhost.localdomain dnsmasq[1804]: using nameserver 218.6.200.139#53
4月 07 19:10:33 localhost.localdomain dnsmasq[1804]: using nameserver 61.139.2.69#53
4月 07 19:10:33 localhost.localdomain dnsmasq[1804]: using local addresses only for unqualified names
4月 07 19:10:33 localhost.localdomain dnsmasq[1804]: read /etc/hosts - 3 addresses
4月 07 19:10:33 localhost.localdomain dnsmasq[1804]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
4月 07 19:10:33 localhost.localdomain dnsmasq-dhcp[1804]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.
以上这些信息向我们展示了服务的运行时间,当前状态,相关进程pid,以及最近的有关该服务的日志信息,是不是很方便?
对于系统管理来说这是最常见的工作,但是在sysvinit时代我们只能借助例如ps命令等来完成,而systemd已经考虑到了系统管理员的需求,于是下面的命令诞生了:
# systemd-cgls
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─user.slice
│ ├─user-1000.slice
│ │ ├─session-1.scope
│ │ │ ├─1806 gdm-session-worker [pam/gdm-password]
│ │ │ ├─1820 /usr/bin/gnome-keyring-daemon --daemonize --login
│ │ │ ├─1822 gnome-session
│ │ │ ├─1830 dbus-launch --sh-syntax --exit-with-session
│ │ │ ├─1831 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
│ │ │ ├─1858 /usr/libexec/at-spi-bus-launcher
│ │ │ ├─1862 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
│ │ │ ├─1865 /usr/libexec/at-spi2-registryd --use-gnome-session
│ │ │ ├─1872 /usr/libexec/gvfsd
... ...
现在我们可以很清晰的看到哪项服 务启动了哪些进程,对于系统管理来说十分有用;
在sysvinit的时代,如果需要结束一个服务及其启动的所有进程,可能会遇到一些糟糕的进程无法正确结束掉,即便是我们使用kill,killall等命令来结束它们,到了systemd的时代一切都变得不一样,systemd号称是第一个能正确的终结一项服务的程序,下面来看看具体如何操作的:
systemctl kill crond.service
或者指定一个信号发送出去
systemctl kill -s SIGKILL crond.service
例如可以像这样执行一次reload操作
systemctl kill -s HUP --kill-who=main crond.service
下面我们回顾一下在sysvinit时代执行下面的命令所实现的功能
# service ntpd stop
# chkconfig ntpd off
很简单,首先停止服务,其次禁用服务 那么在systemd中应该如何操作呢?
# systemctl stop ntpd.service
# systemdctl disable ntpd.service
很显然systemctl命令已经取代了service 和chkconfig两个命令的位置,不光如此,我们还能将服务设置为连人工也无法启动:
# ln -s /dev/null /etc/systemd/system/ntpd.service
# systemctl daemon-reload
在过去我们可以借助第三方工具来实现对系统启动过程的耗时跟踪,现在这个功能已经集成到systemd当中,可以十分方便的了解到系统启动时在各个阶段所花费的时间:
# systemd-analyze
Startup finished in 1.669s (kernel) + 1.514s (initrd) + 7.106s (userspace) = 10.290s
以上信息简要的列出了从内核到用户空间整个引导过程大致花费的时间,如果要查看具体每项服务所花费的时间则使用如下命令:
# systemd-analyze blame
6.468s dnf-makecache.service
5.556s network.service
1.022s plymouth-start.service
812ms plymouth-quit-wait.service
542ms lvm2-pvscan@8:7.service
451ms systemd-udev-settle.service
306ms firewalld.service
246ms dmraid-activation.service
194ms lvm2-pvscan@8:18.service
171ms lvm2-monitor.service
145ms bluetooth.service
135ms accounts-daemon.service
113ms rtkit-daemon.service
111ms ModemManager.service
104ms avahi-daemon.service
102ms systemd-logind.service
79ms systemd-vconsole-setup.service
77ms acpid.service
输出结果类似上面这些内容,至此我们可以看到系统里每一项服务的启动时间,据此可以对系统引导过程了如指掌,如果你觉得这还不够直观,那么可以将结果导出到图像文件里面:
systemd-analyze plot >systemd.svg
该命令会将系统的启动过程输出到一张svg图像上面,更直观的展现出各个服务启动所花费的时间,在我们需要分析和优化服务启动项的时候很有帮助。