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 预备知识

第一步要做的是确定系统使用的是SysVinitsystemd还是upstart

Linux/Unix系统必须有一个PID1的初始化进程。该进程会执行forkexec系统调用,生成其他进程。ps命令可以告诉你运行的是哪一个初始化进程:

  1. $ ps -p 1 -o cmd
  2. /lib/system/systemd

在上面的例子中,系统显然使用的是sysytemd。但是在有些发行版中,SysVinit程序只是实际的init程序的一个符号链接,而且不管你用的是SysVinitupstart还是systemdps命令输出的总是/sbin/init

  1. $ ps -p 1 -o cmd
  2. /sbin/init

psgrep命令可以给出更多的线索:

  1. $ ps -eaf | grep upstart2

或者也可以这样

  1. $ ps -eaf | grep systemd

如果上面的命令返回upstart-udev-bridgesystemd/systemd,则表明系统运行的是upstartsystemd。如果找不到匹配的内容,说明系统可能运行的是SysVinit

12.2.2 实战演练

大多数发行版都支持service命令。选项-status-all可以输出/etc/int.d中所定义的全部服务的当前状态。

该命令在不同的发行版中的输出也不尽相同:

  1. $ service --status-all
  2. [ - ] apparmor
  3. [ ? ] apport
  4. [ - ] atd
  5. [ - ] console-setup.sh
  6. [ - ] cron
  7. [ ? ] cryptdisks
  8. [ ? ] cryptdisks-early
  9. [ - ] dbus
  10. [ ? ] hwclock.sh
  11. [ + ] irqbalance
  12. [ - ] iscsid
  13. ...

可以使用grep命令筛选输出,只显示处于运行状态的服务。

  • Ubuntu: ```bash $ service —status-all | grep + # 只显示已运行的服务 [ ? ] apport [ ? ] cryptdisks [ ? ] cryptdisks-early [ ? ] hwclock.sh [ + ] irqbalance [ ? ] kmod [ + ] mariadb [ + ] open-iscsi [ ? ] plymouth [ ? ] plymouth-log [ + ] redis-server
  1. - **CentOS:**
  2. ```bash
  3. $ service -status-all | grep running

你应该把不必要的服务都禁止掉。这可以降低系统负载,提高安全性。

需要检查的服务如下。

  • smbd、nmbd:这两个是Samba守护进程,用于在LinuxWindows系统间共享资源。
  • telnet:这是一个古老的、不安全的登录程序。除非有无法抗拒的需求,否则应该使用 SSH
  • ftp:另一个同样古老、不安全的文件传输协议。应该用SSHSCP代替。
  • rlogin:远程登录。使用SSH要更安全。
  • rexec:远程执行命令。使用SSH要更安全。
  • automount:如果你没有用NFSSamba,就不需要这个。
  • named:该守护进程提供了域名服务(DNS)。只有在系统定义了域名及其对应的IP地址
  • 的情况下才有必要使用该服务。你不需要用它来解析域名和访问网络。
  • lpd:行式打印机守护进程(Line Printer Daemon)可以让其他主机使用本系统的打印机。如果不打算用作打印服务器,没必要使用该服务。
  • nfsd:NFS守护进程。允许远程主机挂载本地主机的磁盘分区。如果不是用作文件服务器,可以不使用该服务。
  • portmap:NFS服务的一部分。如果系统没有启用NFS,可以不使用该服务。
  • mysql:数据库服务器。Web服务器可能需要用到它。
  • httpd:HTTP守护进程。有时候是作为Server System软件组的一部分安装的。

禁止无用服务的方法不止一种,这取决于你使用的系统是基于Redhat还是Debian,运行的是systemdSysV还是upstart。不管使用哪种方法,必须有root权限。

1. 基于systemd的系统

systemctl 命令可以启用或禁止服务。

  • 启用服务:

    1. # systemctl enable SERVICENAME
  • 禁止服务:

    1. # systemctl disable SERVICENAME

    可以使用下列命令禁止FTP服务:

    1. # systemctl disable ftp

    2. 基于RedHat的系统

    对于采用了SysV方式初始化脚本(/etc/rc#.d)的系统来说,可以将chkconfig作为前端工具使用。选项-del用于禁止服务,-add用于启用服务。注意,启用服务时必须有相应的初始化文件。

命令语法如下:

  1. # chkconfig -del SERVICENAME
  2. # chkconfig -add SERVICENAME

可以使用下列命令禁止HTTPD服务:

  1. # chkconfig -del httpd

3. 基于Debian的系统

基于Debian的系统提供了update-rc.d工具来控制SysV方式的初始化脚本。update-rc.d支持 enabledisable 两个子命令。

可以使用下列命令禁止telnet服务:

  1. # update -rc.d disable telnetd

12.2.3 补充内容

以上这些方法会查找在启动时由SysVsystemd初始化脚本所启用的服务。但有些服务可能是手动启用,或是在启动脚本中,亦或是通过xinetd启用。

xinetd守护进程的功能与init类似:两者都负责启用服务。和init不同的是,xinetd是按需启用服务。像SSH这样的服务,并不需要频繁启用,如果一旦启用,就会运行很长一段时间,按需启用可以降低系统负载。像httpd这种需要频繁执行一些简单操作(返回Web页面)的服务,更有效的方式就是启用后一直保持运行。

服务文件的格式类似于下面这样:

  1. # cat /etc/xinetd.d/talk
  2. # description: The talk server accepts talk requests for chatting \
  3. # with users on other systems.
  4. service talk
  5. {
  6. flags = IPv4
  7. disable = no
  8. socket_type = dgram
  9. wait = yes
  10. user = nobody
  11. group = tty
  12. server = /usr/sbin/in.talkd
  13. }

更改disable字段的值就可以启用或禁止服务。如果disable的值为no,表示启用服务;如果disable的值为yes,则禁用服务。

编辑完服务文件后,一定要重启xinetd

  1. # cd /etc/init.d
  2. # ./inetd restart