系统启动(level 2)时默认启动的服务 系统启动时是不启动的,只有当Client端向Server发出申请服务的呼叫时,Server会启动对应的进程;
olaris9高级系统管理
第二章 client-server model(网络服务)
一、 client-server进程(网络服务进程)
级别: /etc/rc#.d/S****
固定端口服务
server 需要
级别:/etc/rc#.d/S****
动态端口服务
监听
需要: inetd进程
/etc/inet/inetd.conf /etc/rpc
( /etc/services)
二、 启动server进程
1、 网络服务的后台进程
Inetd后台进程
? 该进程是一种特殊的网路进程,它的作用是启动那些在系统启动时不能够自动启动的服务器进程。inetd进程是在系统启动时, 运行到/etc/rc2.d/S72inetsvc脚本,在后台启动的;inetd读取/etc/inet/services文件和/etc/inet/inetd.conf文件,然后开始监听网络上其它主机发出的联接请求,同时监听/etc/inet/services文件中定义的所有端口。
? 当网上某台机器作为client端,向某台服务器发出联接请求时,如果该请求在服务器的/etc/inet/services文件中没有定义,则不会启动任何服务;client端会收到一个“connection refused”的信息。
? 如果client端发出请求的端口在服务器端是有定义的,则inetd会运行/etc/inet/inetd.conf文件中的path字段列出的程序, 并用/etc/inet/inetd.conf文件中指定的用户启动该服务。
? server端启动的网络服务将会通过网络与发出请求的client端建立联接。
? 在/etc/inet/inetd.conf文件中, 有一些服务的path的描述中是internal一词。
? internal的意思为: 当一个联结接请求送到这个服务的时候,inetd不会启动另一个过程,而是直接与发出请求的计算机通过网络进行通信.(换句话说,就是这个网络服务是inetd内置的功能 )。
? 只有那些能够进行快速处理的过程才会采用这样的方式。如echo、chargend以及iscard。
2、 网络端口
固定端口: well-known ports
动态(临时)端口: ephemeral (short-lived) ports
端口的两种分配方式:固定端口服务和动态邦定端口服务
网上的任何服务(如ftp、rlogin、telnet等)的建立都是通过端口(port)建立的端口号就相当于网络服务通讯时用的地址,但它不是一种物理的地址,是一种抽象的地址
为了正确建立这种联接,需要有一个规则来定义网上的各种服务及对应的端口号;要求每个服务的端口号是不同的。
3、 启动一个使用固定端口的服务
固定端口服务定义在/etc/inet/services文件中,定义了端口号和服务的对应关系;如果用户自己想增加某些网络服务及定义对应的端口号,必须在client和server端二边都修改这些文件,端口号必须在1024以后;因为1024之前的端口是系统占用的;
查看telnet使用的固定端口,使用如下命令
# grep telnet /etc/inet/services
telnet 23/tcp
系统启动(level 2)时默认启动的服务
系统启动时是不启动的,只有当Client端向Server发出申请服务的呼叫时,Server会启动对应的进程;一旦服务结束,Server端将自动关闭对应的进程
有些大型网络服务或负荷较重的网络服务是不靠inetd管理的;如sendmail等。
它们虽然在/etc/services中有定义, 但是启动、关闭都是在/etc/rc2.d 下由单独
的脚本启动, 并在后台有单独的进程管理。
Sendmail进程就是一个系统启动时默认启动的服务的一个例子
# grep mail /etc/inet/services
smtp 25/tcp mail
当启动sol9系统时,sendmail进程由启动脚本/etc/rc2.d/S88sendmail初始化;sendmail进程启动之后开始监听端口25来收取邮件。不需要inetd进程来监听端口25和启动sendmail进程,因为sendmail进程已经运行了。
手工停止sendmail进程
/etc/init.d/sendmail stop
不由inetd控制的固定端口服务有:
? DNS, 通过S72inetsvc启动。
? NIS, 通过S71rpc或者S71yp启动。
? NIS+, 通过S71rpc启动。
? NFS, 通过S15nfs.server启动。
? in.routed, 通过S72inetsvc启动。
这样做的好处是:大型网络服务是由自己的专用后台进程来监听和处理,速度较快。
inetd则仅负责监听和处理负荷不重的网络服务,防止消耗系统资源。
telnet服务是一个系统启动时没有自动启动的固定端口服务;telnet服务使用inetd daemon 去监听网络请求,这样telnet服务就不必一直启动着,当inetd daemon在某一端口接收到网络请求,就会参照/etc/inet/service文件决定启动哪个服务。下面是连接到telnet服务的过程:
a. 主机sys41通过 “telnet sys42”命令,执行网络服务请求链接到接收主机sys42
b. telnet 服务是固定端口服务(well-know service),其端口为23
c. telnet包请求一个链接—转到主机sys42的23端口
d. 开始,inetd daemon 监听telnet服务的23端口。Sys41主机发出的“telnet sys42”命令,产生一个到23端口的请求,通过/etc/inet/services这个文件,inetd把这个请求作为telnet请求
e. telnet服务并不是一直运行,而是等待一个connection。一旦有请求,Inetd daemon必须动态的启动telnet服务
f. inetd daemon 参考/etc/inetd.conf文件为所请求的服务找到匹配的入口,inetd daemon 识别到telnet service 这行。
g. Inetd daemon 参照/etc/inetd.conf ,执行in.telnetd进程,in.telnetd daemon接管控制了当前的telnet session的通讯。
h. In.telnetd daemon 接收本次session在23端口持续不断的通讯,直到本次session结束。
4、 启动RPC服务
Rpc服务本身是固定端口服务,记录动态端口服务的程序号和端口号
Rpc服务包括:
系统启动时默认自动启动的那些服务
Boot是没有自动启动而是按需启动的服务
(1)boot时启动的RPC服务
Boot时通过启动脚本一起启动的RPC服务,有可利用的连续端口超过32768,rpcbind 进程关联RPC程序号和端口号,rpcbind 服务必须运行在服务系统中,以使你可以向服务器发出RPC请求。当一个RPC服务在boot时启动,它会传递如下信息给rpcbind进程:
与其关联的端口
RPC程序号
当一个client想产生一个RPC call来获得一个程序号,它能够发出RPC请求之前,必须首先联系服务器端的rpcbind服务来获得端口地址。如果RPC服务在启动期间,通过rpcbind daemon已经注册了它的当前端口号,RPC服务当前的端口号反馈给client端。
当启动solaris9 OE时,启动脚本/etc/rc2.d/S71rpc初始化rpcbind服务。Rpcbin daemon所使用的端口号记录在/etc/inet/services文件中,os启动完之后,rpcbind daemon启动在111端口的监听。查看rpcbind使用的端口,协议,使用如下命令:
#grep rpcbind /etc/services
(2)按需启动RPC服务
有一些RPC服务只是按需启动,端口号在服务器boot时由rpcbind进程登记。当client端的一个应用请求一个服务,rpcbin进程返回这个服务的端口号给client机器,client端机器使用刚刚返回的端口号产生一个新的请求。按需启动的RPC服务,例如sprayd 服务,通过如下步骤来实现:
a.rpcbind daemon 在所有系统中通过一个启动脚本已经启动。Sprayd服务在/etc/rpc和/etc/inetd.conf两个文件中记录,而且,在开机(boot)时,由rpcbind进程登记其当前委派的端口号和程序号。
b.host1上的一个用户发出了sprayd到host2的命令,sprayd请求开始由111端口处理,并包含sprayd服务的程序号。
c.服务器host2上的rpcbind daemon读取程序号,并确定该请求为sprayd服务。Rpcbind daemon返回sprayd服务当前的端口号给client host1。
d.client机器host1发出第二次请求到服务器host1上sprayd服务的端口。Inetd daemon接收到这个请求。
e.inetd daemon参照/etc/inetd.conf文件寻找与请求服务匹配的入口。Inetd daemon启动sprady服务。
f.rpc.sprady daemon接管本次sprayd会话的通信。
(3)rpcinfo命令
Rpcinfo命令产生一个到 RPC服务器的一个RPC调用,并形成报告。Rpcinfo比较常用的两个参数为-p和-d。
列出已经登记的RPC服务:
#rpcinfo –p
program vers proto port service
100000 4 tcp 111 rpcbind
100000 3 tcp 111 rpcbind
100000 2 tcp 111 rpcbind
100000 4 udp 111 rpcbind
100000 3 udp 111 rpcbind
100000 2 udp 111 rpcbind
100232 10 udp 32772 sadmind
100021 1 udp 4045 nlockmgr
100021 2 udp 4045 nlockmgr
100021 3 udp 4045 nlockmgr
100021 4 udp 4045 nlockmgr
100011 1 udp 32773 rquotad
100002 2 udp 32775 rusersd
100002 3 udp 32775 rusersd
100021 1 tcp 4045 nlockmgr
100002 2 tcp 32771 rusersd
100024 1 udp 32774 status
100021 2 tcp 4045 nlockmgr
100002 3 tcp 32771 rusersd
100021 3 tcp 4045 nlockmgr
100024 1 tcp 32772 status
100021 4 tcp 4045 nlockmgr
100012 1 udp 32776 sprayd
该命令返回程序号,程序号的版本号,RPC协议,端口号和RPC服务。
删除登记的RPC服务:
Rpcinfo –d 程序号 程序号的版本号
例如:
#rpcinfo –d 100012 1
该例子删除了sprayd服务,想再次注册sprayd服务,可以给inetd daemon发一个HUB信号:
#pkill -HUP inetd