只要是Linux系统、不管什么发行版本,都有以下的系统服务。本文将对这些服务逐一进行说明。推荐花一些时间来了解这些服务的作用,以便清楚的知道自己该使用哪些服务。
init服务
init进程是所有进程的发起者和控制者。因为在任何基于Unix的系统(比如linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之而垮掉了。
init进程有两个作用。第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。快速执行一下ps -af 命令,可以列出许多父进程ID(Parent Process ID,PPID)为1的进程来。
init的第二个角色是在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。
1. /etc/inittab文件
/etc/inittab文件中包括了所有init启动运行级别所必须的信息。这个文件中的每一行语句的格式如下所示:
id : runlevels: action : process
注意:以#开始的语句是注释语句。看看你自己的/etc/inittab文件就可以发现其中充斥了大量的注释语句。如果确实需要对/etc/inittab文件进行什么改动(一般不会出现这种情况的),记住加上一些注释语句,解释为什么要做那些修改。
2. Telinit命令
通知init在什么时候切换系统运行级别的神秘力量实际上就是Telinit命令。这个命令有两个命令行参数:一个参数用来通知init准备切换过去的运行级别;另外一个是-tsec,其中的sec是在通知init之前需要等待的、以秒计算的时间。
注意:init是否真的切换运行级别是由它自己决定的。很明显,它经常切换,否则这个命令就不会那么有用了。在大多数Unix操作系统的具体实现(包括linux)中,Telinit命令实际上只是一个对init程序的符号链接。基于此,许多人更喜欢使用init直接切换到他们想去的运行级别而不是使用Telinit。就个人而言,我发现使用Telinit切换运行级别更便于理解和记忆。
inetd进程
inetd程序是一个守护进程。您可能已经知道守护进程是一些特殊的程序:它们在被启动之后,自愿放弃对调用自己终端的控制权。守护进程与系统其余部分的接口只有依靠进程间通信(Interprocess Communication,IPC)通道、或者依靠向系统全局性日志文件(Log File)才能发送数据项。
inetd的角色是作为Telnet和FTP等与网络服务器相关的进程的“超级服务器”。这是一个简单的道理:并不是全部的服务器进程(包括那些接受新的Telnet和FTP连接的进程)都会如此频繁地被调用,以至于必须要有一个程序随时运行在内存中。因此为了避免出现可能有几十种服务都运行在内存中准备被使用的情况,它们都列在inetd的配置文件/etc/inetd.conf中。而代替它们的是inetd监听着进入的连接。这样只需要有一个进程在内存中就可以了。
inetd的另外一个优点是程序员并不想把需要网络连接的进程都编写到系统中去。inetd程序将处理网络代码,并把进入的网络数据流作为各个进程的标准输入(Standard-In,即Stdin)传递到其中。这些进程的输出(Stdout)将会被送回连接到该进程的主机去。
注意:除非你正在进行编程,否则是不需要连接到inetd的Stdin/Stdout功能上。从另一方面来说,如果有人打算编写一个简单的命令脚本程序并让它出现在网络中,就值得深入研究这个极为强大的功能。
1.etc/inetd.conf文件
etc/inetd.conf文件是inetd的配置文件。它的结构很简单:每一行语句代表一种服务。服务定义语句的格式如下所示:
srvce_name sock_type protocol [no]wait user srvr_prog srvr_prog_args
2.安全性与inetd.conf文件
你将会发现在大多数的linux安装中,许多服务在缺省的情况下是打开的。如果你的系统将向因特网开放(包括通过拨号点对点协议被连通),你想做的第一件事就会是把一切都关闭!决不要假设因为你的系统没有对公众进行宣传,别人就不会找到它。从相反的方向看,寻找存在安全性攻击隐患系统的工具软件是既容易找到又容易使用的。
关闭服务的第一个步骤是把etc/inetd.conf文件里所有用不着的服务性说明语句都改为注释语句。一般来说,你会发现下面的方法更容易使用:先把全部东西都改为注释语句(彻底关闭网络服务),再有选择地打开需要的服务。在完成对etc/inetd.conf文件的修改之后,需要向守护进程报告其配置文件已经被修改了。这是通过向该守护进程发送HUP信号来实现的。先使用下面的命令找出inetd.conf对应的进程ID:
[ root@linuxidc/root ] # ps auxw | grep inetd | grep -v grep
这个命令的输出类似于下面的内容:
root 359 0.0 0.1 1232 168 ? S Jun21 0 : 00 inetd
root 359 0.0 0.1 1232 168 ? S Jun21 0 : 00 inetd