这节我们讲NFS开机自动启动及其原理
NFS服务器端已经配置好了,但机器重启以后我们还要重新开启NFS服务。为了不这么麻烦,我们要让NFS和portmap服务在开机时自动启动,这样就会避免出现mount clntudp_create: RPC: Program not registered这样的错误了。
让脚本在开机时自动运行需要对linux系统的启动过程有所了解。我们知道系统加载内核以后运行的第一个程序就是init,所以它的PID永远是1,你自己用top命令查看一下就知道了;而init程序首先就要读取/etc/inittab文件,init程序就根据这个文件的内容按照顺序创建进程。
我们打开这个文件,不去管以#开头的注释文字,共有7个部分:我们需要关注的是第一部分和第二部分。
Init程序首先读取第一部分,确定shell的运行级别,这里的运行级别为3。Shell一共有7个运行级别,在/etc/inittab文件开头的注释部分对这7个运行级别做了详细解释,对shell运行不了解的话这可是要必看的。
然后init程序读取第二部分,运行脚本/etc/rc.d/rc.sysinit,这个脚本主要包含有系统的初始化命令。
接着就要根据确定的shell运行级别来运行对应目录里的脚本,以启动相关服务。我的机器的运行级别是3,init就根据这个级别号运行/etc/rc.d/rc3.d目录里的脚本。
其余几个部分都是关于组合键、UPS
电源等方面的内容,感兴趣的话可以看一下。
说到这里我们知道了,init程序根据运行级别号来启动/etc/rc.d目录中对应目录里的脚本,以启动相关服务。这里是运行/etc/rc.d/rc3.d目录里的脚本,如果运行级别为5,则运行/etc/rc.d/rc5.d目录里的脚本。
我们来看一下/etc/rc.d目录里的文件。
可以看到/etc/rc.d目录里一共有3个普通文件和8个目录文件。这8个目录中init.d目录是各种程序和脚本的存放目录,而rc0.d到rc6.d这7个目录里的文件都是init.d目录里程序文件的链接文件,只是被赋于了相应的运行级别。来看一下/etc/rc.d/rc3.d目录里的文件:
我们想要开机就启动的NFS服务和portmap服务分别在图片中第二列的第一行和最后一列的第三行,即K20nfs和S13portmap。
我们看到目录里所有文件都是以K或S开头,然后跟一个数字,然后才是文件名。这是什么意思?S即start,开启服务,K即kill,关闭服务。系统确定运行级别以后,进入相应的rcN.d目录,执行以S开头的文件以启用相关服务进程,而且是按照S后面的那个数字的顺序依次执行;而更换运行级别时,会先执行以K开头的脚本,再执行以S开头的脚本,执行顺序都是按照他们后面的数字的顺序;退出系统时,就依次执行以K开头的文件关闭相关服务。
那我们知道了,在级别为3的这个运行级别上,nfs服务没有默认没有随开机而启动,而portmap服务则随开机而启动,是被系统第13个启用的服务;我们手动启动nfs服务以后,在关机的时候nfs服务是第20个被关闭的服务。
这里有了一个疑问:这些服务的启用和关闭顺序是哪里限定的?答案是程序自身。我们可以打开portmap和nfs服务的脚本看一下,脚本路径为/etc/rc.d/init.d/ portmap (nfs)。输入命令:less /etc/rc.d/init.d/ portmap (nfs)
如截图所示,portmap服务在345三个级别上运行,启用顺序为第13,关闭顺序为第87;nfs服务不在任何运行级别上启用,启用顺序为第60,关闭顺序为第20。(服务不在任何运行级别上启用时,运行级别那个字段用-代替。)
很明显,想要让NFS服务自动启用,就需要把相应级别对应的rcN.d目录里的nfs服务由K状态更改为S状态。由于运行级别为2时,系统不运行NFS,我们只需要在3、4、5三个级别上让NFS服务随开机启动。(级别4根本就没有启用,让NFS服务在级别4上启用不知道有什么用;只不过大家都这么说,我也就随大流。)
怎么更改?系统提供了一个用起来很方便的方法:使用chkconfig命令。Chkconfig主要用来查询和管理服务在不同运行级别上的启用情况,需要注意的是:chkconfig命令并没有更改程序脚本里的内容,只是更改了程序在rcN.d中的链接名称的开头字母,以此来确保其在相应运行级别上开启或关闭。
输入chkconfig命令,直接敲回车,可以明确看到它主有4种作用:
Chkconfig --list name 列出指定服务的运行级别情况
Chkconfig--add name 增加一个服务
Chkconfig --del name 删除一个服务
Chkconfig [--level <levels>] <name> <on|off|reset> 更改/重设指定服务的运行级别
我们输入chkconfig --level 345 nfs on,即可使NFS服务在运行级别3、4、5上自动运行。