分类: 系统运维
2012-03-30 17:45:38
通过一个序列化终端登录系统和通过一个网络登录系统之间的主要的(物理的)区别是,终端和电脑之间的连接不是点对点的。在这种情况下,login只简单地是一个可用的服务,就像任何其它的网络服务,比如FTP或SMTP。
使 用上一节我们讨论的终端登录,init知道哪个终端设备为登录开启并为每个设备产生一个getty进程。而在网络登录的情况下,所有的登录从内核的网络接 口驱动而来(比如,以太驱动),而我们事先不知道有多少将会发生。我们没有一个等待每个可能的登录的进程,而必须等待一个网络连接请求的到来。
为了允许相同的软件来处理终端和网络上的登录,一个被称为伪终端的软件驱动被用来模拟一个序列化终端并映射终端操作到网络操作,反过来也是如此。(在19章,我们将深入探讨伪终端。)
BSD网络登录
在BSD里,单个进程等待多数网络连接:inetd进程,有时被称为Internet超级服务。在这节,我们将看到为BSD系统登录而调用的进程序列。我们不对这些进程的细节的网络编程分析感兴趣。
作为系统启动的一部分,init调用一个执行外壳脚本/etc/rc的外壳。这个外壳脚本启动的其中一个后台进程是inetd。一旦外壳脚本终 止,inetd的父进程则变为init;inetd等待到达主机的TCP/IP的连接请求。当一个连接请求等待它的处理时,inetd执行一个fork和 恰当程序的exec。
让我们假定TCP连接请求为TELNET服务器而到达。TELNET是一个使用TCP协议的远程登录应用程序。在另一 个(通过某种形式的网络连接到服务器主机的)主机的一个用户或在同一个主机上通过启动TELNET客户端来初始化login:telnet hostname。
客户端打开一个对主机名的TCP连接,而主机名启动的这个程序被称为TELNET服务器。客户端和服务器然后使用 TELNET应用程序协议通过TCP连接来交换数据。发生的事情是启动客户端程序的用户现在登录到服务器主机了。(当然,这假定用户在服务器主机上有一个 有效的账号。)下面是执行TELNET服务器而调用的进程序列,被称为telnetd:
1、进程ID 1的init通过fork和exec启动/bin/sh,它在当用户进入多用户时执行外壳脚本/etc/rc;产生inetd;
2、从TELNET客户端到来的TCP连接请求,使inetd通过fork产生一个子进程inetd,并通过exec执行telnetd。
telnetd 进程然后打开一个伪终端设备并用fork分为两个进程。
父进程处理网络连接的通信,而子进程执行login程序的exec。父进程和子进程通过这个伪终端 连接。在执行exec前,子进程为伪终端设置文件描述符0、1、2。
如果我们正确登录,login执行我们在9.2节描述的相同的步骤:它改变到我们的主 目录并设置我们的组ID、用户ID和我们的初始环境。login通过调用exec用我们的登录外壳代替它自己。下面是此时进程的布局:
1、进程ID 1的init通过inetd、telnetd、和login,得到了子进程登录外壳;
2、登录外壳为伪终端设备驱动打开文件描述符0、1、2。
3、终端用户通过网络连接经过telnetd服务器和telnet客户商操作伪终端设备驱动。
显然,在伪终端设备驱动和终端的真实用户之间有许多正在执行的事情。我们将在19章深入讨论伪终端时展示这种布局类型所调用的所有进程。
需要了解的重要的事是,无论我们是通过一个终端还是一个网络登录,我们都有和终端设备或伪终端设备连接的带有标准输入、标准输出和标准错误的登录外壳。我们将在后面各节里看到这个登录外壳是POSIX.1会话的开始,以及终端或伪终端是这个会话的控制终端。
Mac OS X Network登录
通过网络登录到一个Mac OS X系统和BSD系统一样,因为Mac OS X是部分基于FreeBSD的。
Linux网络登录
Linux下的网络登录和BSD下的相同,除了一个inetd的替代器被使用,它被称为扩展Internet服务,xinetd。xinetd进程对它启动的服务提供一个比inetd更好等级的控制。
Solaris网络登录
在 Solaris下的网络登录场景也BSD和Linux下的步骤基本相同。一个inetd服务器被使用,和BSD版本的相似。Solaris版本有额外的在 服务访问设施框架下运行的能力,尽管它没有被配置成这样做。相反,inetd服务器由init启动。任一种方法,我们都会得到相同的进程布局。