Linux系统可以同时运行数百个任务。其中大多数都属于操作系统环境的组成部分,不过可能也会有那么一两个你不需要的守护进程。
有3种可用于启动守护进程和服务的工具,Linux发行版支持其中任意一种。传统的SysV系统使用/etc/init.d中的脚本。较新的systemd守护进程除了使用/etc/init.d之外,还用到了systemctl
调用。还有些发行版使用的是upstart,配置脚本保存在/etc/init中。
systemd如今已经取代了SysVinit系统。upstart是由Ubuntu开发并采用的,但是在14.04版中,
已经改成了systemd。考虑到大多数发行版使用的都是systemd,因此本章将重点放在了该系统。
12.2.1 预备知识
第一步要做的是确定系统使用的是SysVinit、systemd还是upstart。
Linux/Unix系统必须有一个PID为1的初始化进程。该进程会执行fork和exec系统调用,生成其他进程。ps命令可以告诉你运行的是哪一个初始化进程:
$ ps -p 1 -o cmd/lib/system/systemd
在上面的例子中,系统显然使用的是sysytemd。但是在有些发行版中,SysVinit程序只是实际的init程序的一个符号链接,而且不管你用的是SysVinit、upstart还是systemd,ps命令输出的总是/sbin/init:
$ ps -p 1 -o cmd/sbin/init
ps和grep命令可以给出更多的线索:
$ ps -eaf | grep upstart2
或者也可以这样
$ ps -eaf | grep systemd
如果上面的命令返回upstart-udev-bridge或systemd/systemd,则表明系统运行的是upstart或systemd。如果找不到匹配的内容,说明系统可能运行的是SysVinit。
12.2.2 实战演练
大多数发行版都支持service命令。选项-status-all可以输出/etc/int.d中所定义的全部服务的当前状态。
该命令在不同的发行版中的输出也不尽相同:
$ service --status-all[ - ] apparmor[ ? ] apport[ - ] atd[ - ] console-setup.sh[ - ] cron[ ? ] cryptdisks[ ? ] cryptdisks-early[ - ] dbus[ ? ] hwclock.sh[ + ] irqbalance[ - ] iscsid...
可以使用grep命令筛选输出,只显示处于运行状态的服务。
- Ubuntu: ```bash $ service —status-all | grep + # 只显示已运行的服务 [ ? ] apport [ ? ] cryptdisks [ ? ] cryptdisks-early [ ? ] hwclock.sh [ + ] irqbalance [ ? ] kmod [ + ] mariadb [ + ] open-iscsi [ ? ] plymouth [ ? ] plymouth-log [ + ] redis-server
- **CentOS:**```bash$ service -status-all | grep running
你应该把不必要的服务都禁止掉。这可以降低系统负载,提高安全性。
需要检查的服务如下。
- smbd、nmbd:这两个是
Samba守护进程,用于在Linux和Windows系统间共享资源。 - telnet:这是一个古老的、不安全的登录程序。除非有无法抗拒的需求,否则应该使用
SSH。 - ftp:另一个同样古老、不安全的文件传输协议。应该用
SSH和SCP代替。 - rlogin:远程登录。使用
SSH要更安全。 - rexec:远程执行命令。使用
SSH要更安全。 - automount:如果你没有用
NFS或Samba,就不需要这个。 - named:该守护进程提供了域名服务(
DNS)。只有在系统定义了域名及其对应的IP地址 - 的情况下才有必要使用该服务。你不需要用它来解析域名和访问网络。
- lpd:行式打印机守护进程(
Line Printer Daemon)可以让其他主机使用本系统的打印机。如果不打算用作打印服务器,没必要使用该服务。 - nfsd:
NFS守护进程。允许远程主机挂载本地主机的磁盘分区。如果不是用作文件服务器,可以不使用该服务。 - portmap:
NFS服务的一部分。如果系统没有启用NFS,可以不使用该服务。 - mysql:数据库服务器。
Web服务器可能需要用到它。 - httpd:
HTTP守护进程。有时候是作为Server System软件组的一部分安装的。
禁止无用服务的方法不止一种,这取决于你使用的系统是基于Redhat还是Debian,运行的是systemd、SysV还是upstart。不管使用哪种方法,必须有root权限。
1. 基于systemd的系统
systemctl 命令可以启用或禁止服务。
启用服务:
# systemctl enable SERVICENAME
禁止服务:
# systemctl disable SERVICENAME
可以使用下列命令禁止
FTP服务:# systemctl disable ftp
2. 基于RedHat的系统
对于采用了
SysV方式初始化脚本(/etc/rc#.d)的系统来说,可以将chkconfig作为前端工具使用。选项-del用于禁止服务,-add用于启用服务。注意,启用服务时必须有相应的初始化文件。
命令语法如下:
# chkconfig -del SERVICENAME# chkconfig -add SERVICENAME
可以使用下列命令禁止HTTPD服务:
# chkconfig -del httpd
3. 基于Debian的系统
基于Debian的系统提供了update-rc.d工具来控制SysV方式的初始化脚本。update-rc.d支持 enable和 disable 两个子命令。
可以使用下列命令禁止telnet服务:
# update -rc.d disable telnetd
12.2.3 补充内容
以上这些方法会查找在启动时由SysV或systemd初始化脚本所启用的服务。但有些服务可能是手动启用,或是在启动脚本中,亦或是通过xinetd启用。
xinetd守护进程的功能与init类似:两者都负责启用服务。和init不同的是,xinetd是按需启用服务。像SSH这样的服务,并不需要频繁启用,如果一旦启用,就会运行很长一段时间,按需启用可以降低系统负载。像httpd这种需要频繁执行一些简单操作(返回Web页面)的服务,更有效的方式就是启用后一直保持运行。
服务文件的格式类似于下面这样:
# cat /etc/xinetd.d/talk# description: The talk server accepts talk requests for chatting \# with users on other systems.service talk{flags = IPv4disable = nosocket_type = dgramwait = yesuser = nobodygroup = ttyserver = /usr/sbin/in.talkd}
更改disable字段的值就可以启用或禁止服务。如果disable的值为no,表示启用服务;如果disable的值为yes,则禁用服务。
编辑完服务文件后,一定要重启xinetd:
# cd /etc/init.d# ./inetd restart
