第二章Linux系统的概述

“上帝查看着他所创造的一切,并且看上去都很好” (起源 131

 

这章给出了Linux系统的一个概述。首先,描述了所提供的主要功能和服务。其次,概要地叙述了实现这些服务的程序。本章的目的是给出对系统作为一个整体的理解,各个部分的详细描述在其他章节中。

操作系统的各个部分

一个UNIX操作系统由一个内核以及一些系统程序组成。当然还有一些用于工作的应用程序。内核是操作系统的心脏。[1] 它维护着磁盘上文件的轨迹,启动程序并且并行地运行着它们,给各种进程分配内存以及其他的资源,从网络上接收和发送数据包等等。内核自己做的事很少,但它提供了建立所有服务所需的工具。它也防止了任何人直接对硬件的访问,迫使任何人使用它所提供的工具。这样,内核为各个用户之间提供了一些保护。内核所提供的工具是通过系统调用(system calls)来使用的;有关更多的信息请参见manual page 第二部分。

系统程序利用内核所提供的工具来实现一个操作系统所需的各种服务。系统程序,以及所有其他程序,运行于“内核之上”,也即所谓的用户模式(user mode)。系统程序和应用程序之间的区别在于它们专注的方面:应用程序主要用于将有用的事情做好(或用于游戏,如果它正好是一个游戏程序),而系统程序是用来使系统正常地工作。一个字处理程序是一个应用程序;而telnet是一个系统程序。这些区别常常是模糊不清的,然而,这仅仅对于强迫分类来说是重要的。

一个操作系统也可包含一些编译程序以及相应的库程序(在Linux下由指GCC以及C库程序),尽管不是所有的编程语言必需成为操作系统的一部分。文档,以及有时甚至一些游戏,也能算是操作系统的一部分。传统上来说,操作系统是由它的安装磁带或磁盘上的内容来定义的;对于Linux来讲,就不是那么清楚了,因为它散布在世界上很多的FTP站点上。

注释

[1] 实际上,它常被错误地当成自身就是操作系统,但并不是这样的。一个操作系统要比一个平凡的内核提供更多的服务。

 

内核中的重要部分

Linux内核由几个重要的部分组成:进程管理、内存管理、硬件设备驱动程序、文件系统驱动程序、网络管理以及各种其它部分。图2-1显示出了其中的一些。

 

2-1 Linux内核中非常重要的部分中的一些

也许内核中最重要的部分(没有它们就不能工作)是内存管理以及进程管理。内存管理用来给进程分配内存区域和分配交换空间区域,内核的部分,以及用于高速缓冲。进程管理用于创建进程,以及通过在处理器上交换活动进程来实现多任务的功能。

在最低层,内核包含每种它支持的硬件的设备驱动程序。由于世界充满了各种各样不同种类的硬件,硬件设备驱动程序的数量是庞大的。有许多在一些方面相似的硬件仅仅在软件是如何控制它们方面是有所区别的。这种相似性使得支持相同操作的驱动程序通用类成为可能;类的每个成员对于内核的其余部分来说有着同样的接口,但在实现它们方面有所不同。例如,所有的磁盘驱动程序对于内核的其它部分来说看上去是相同的,也即,它们都有如‘初始化驱动器’、‘读扇区N’、‘写扇区N’的操作。

有些内核提供的软件服务本身就有着相似的属性,并且因此可以抽象成类。例如,各种网络协议被抽象成一种编程接口,BSD套接字库。另一个例子是虚拟文件系统(virtual filesystem(VFS)层将其文件系统操作从其实现中抽象出来。每一种文件系统类型提供了各自文件系统操作的实现。当某个实体试尝使用一个文件系统时,该请求通过VFS,发送到相应文件系统驱动程序中。

 

UNIX系统的主要服务工作

本节描述了一些非常重要的UNIX服务,但并不是很详细的。它们将在其它章节中更彻底地讨论。

Init

UNIX系统中的一个非常重要的服务是由init提供的。Init是每个UNIX系统第一个启动的进程,作为内核引导所做的最后一件事。当init启动后,它通过执行各种启动事务来继续引导进程(检查并监视文件系统,启动后台程序daemons,等等)。

Init所做事情的精确列表依靠它是以何种方式;有几种方式可供选择。Init通常提供单用户模式的方式,在该方式中除了用户root能在控制台使用一个shell外其它任何人都不能登录;常用的模式称为多用户模式(multiuser mode)。有些方式将此概括为运行层(run levels);单用户和多用户模式被当作两种运行层,并且还可以有其它的层,例如,在控制台上运行X

在正常的操作下,init确定getty正在工作着(用以允许用户登录),并且收取孤立进程(父辈进程已结束的进程;在UNIX中所有的进程必须属于单棵进程树,所以孤立进程必须被收取)。

当系统关闭时,init负责杀死所有其它的进程,卸载所有的文件系统以及停止处理器的工作,以及任何它被配置成要做的工作。

从终端登录

从终端登录(通过串行线)以及从控制台登录(当没有运行X时)是有getty程序提供的。Init为每个终端启动一个独立的getty实例以允许登录操作。Getty读入用户名并且运行login程序,login程序读入口令。如果用户名以及口令正确的话,login就运行shell程序。当shell程序终止时,也即,用户退出时,或者login程序因用户名以及口令不匹配而终止时,init注意到这点并启动一个新的getty实例。内核是不知道login的,这都是由系统程序来处理的。

Syslog

内核及许多系统程序会产生出错、警告以及其他一些消息。以后甚至更晚些时候来观察这些消息常常是很重要的,因此这些消息应被写入一个文件中去。做这个事情的程序是syslog。根据写入者或消息的重要性,它可以配置成对消息进行分类并写入不同的文件中去。例如,内核消息常常导入到一个独立的文件中,因为内核消息常常是非常重要的,并用来确定问题的所在。

定期命令执行:cron at

用户和系统管理员常常需要定时地执行某些命令。例如,系统管理员想要运行一个命令来清理临时文件目录(/tmp 以及 /var/tmp)中的旧文件,以防止磁盘过满,因为并非所有程序在其后都会正确地清理。

Cron服务即用来做此事的。每个用户都有一个crontab文件,在这个文件中他列出了他想执行的命令和这些命令被执行的时间。Cron后台程序(守护程序)会在指定的时间启动命令。

At服务与cron相类似,但它只执行一次:命令在指定时间被执行,但并不会重复执行。

图形用户界面

UNIXLinux并没有把用户界面(接口)集成到内核中去;而是由用户层程序来实现的。这对文本模式和图形模式环境是一样的。

这种安排使得系统非常灵活,但也有缺点,为每个程序编制一个不同的用户界面是非常简单的,这使得系统更难于学习。

Linux中启初使用的图形环境称作X 窗口系统(简称X)。X也并没有实现一个用户接口;它只实现了一个窗口系统, 也即,实现图形用户接口的一组工具。在X上实现的三种非常流行的用户接口形式是AthenaMotif以及Open Look

连网(网络)

连网是连接两台或多台计算机以使得它们能互相通信的一种活动。连接与通信的实际方法稍嫌复杂,但其最终结果却是非常有用的。

UNIX操作系统有许多的连网特征。许多基本服务(文件系统、打印服务、备份等等)能够在网络上完成。这能使得系统管理简单化,因为这允许集中管理而仍然有着微机化以及分布计算的益处,比如低成本化和很好的容错性能。

然而本书仅仅对连网粗率一述;详细信息请参见Linux网络管理员手册,包括网络是如何工作的基本描述。

网络登录

网络登录的工作原理与通常的登录稍有区别。每个终端都有一独立的串行线,通过它即可进行登录操作。而对于每个通过网络登录的人来讲,存在着一个独立的虚拟网络连接,并且这些连接数是不限的。[1] 因此针对于每个虚拟连接而运行一个独立的getty是不可能的。通过网络来登录有几种不同的方法,telnetrloginTCP/IP网络中主要的方法。

与一群gettys相反,每种网络登录只有一个守护程序(telnetrlogin有各自的守护程序)听取所有的登录请求。当它识别到一个时,它就启动它的一个新的实例来处理这单个请求;原始实例将继续听取其它的登录请求。新的实例的工作原理同getty相类似。

网络文件系统

连网服务所带来的好处之一是通过网络文件系统共享文件。常用的一种称为网络文件系统,或NFS,是由Sun公司研制开发的。

使用网络文件系统,一台机器上的程序所作的任何文件操作将通过网络送达另一台计算机。这使得这个程序误以为其它计算机上的所有文件好象是在该程序运行的计算机上。这使得信息的共享尤其得简单,因为它无须对程序作任何的修改。

邮件

电子邮件通常是经由计算机进行通信最重要的方法。一封电子信件使用一定的格式存贮于一个文件中,并且由一个特定的邮件程序来发送和读取信件。

每个用户有一个接收邮件箱(一个特定格式的文件),所有的新邮件都存于此。当某个人发送了一个邮件,邮件程序就会定位到接收者的邮件箱并且将这封信添加到邮件箱文件中。如果接受者的邮件箱在另一台机器上,这封信就会发送到另一台机器上,该机器将会把这封信递送到最适合的邮件箱中去。

邮件系统由许多程序组成。到本地或远程邮件箱的邮件的递送是由一个程序来完成的(邮件传递代理或称MTA,例如,sendmail smail),而用户所使用的程序却是各种各样的(邮件用户代理或称MUA,例如:pineelm)。邮件箱通常存储于/var/spool/mail中。

Printing

在某个时刻只有一个用户能使用一台打印机,但是不在用户中共享打印机是不经济的。因此打印机被软件以打印队列的方式管理起来:所有的打印作业被放置于一个打印队列中并且当打印机完成了它的当前打印任务,下一个打印作业就会被自动地送达打印机。这就将用户从组织打印机队列以及争取打印机控制权的活动中解脱了出来。[2]

打印队列软件也能将打印输出到磁盘上,也即,当作业在队列中时文本被保存在一个文件中。这使得一个应用程序能够快速地输出打印作业到打印队列软件中;应用程序无须等待作业实际打印完才继续执行。这真是方便,因为这允许一个程序打印出一个版本,并且无须等待它打印出来而又制作出一个完全的修正新版本。

文件系统规划

文件系统可分成许多部分;通常和一个根(root)文件系统一起有/bin/lib/etc以及一些其它目录;一个/usr文件系统内含程序和不变的数据;一个/var文件系统内含变化着的数据(如log 文件);以及一个包含每个人的个人文件的/home文件系统。依赖于硬件的配置以及系统管理员的决策,文件系统的分布可以是不同的;它甚至全都合在一个文件系统中。

 

第三章稍详细地描述了文件系统的规划;Linux文件系统标准更详细地描述了这些。

注释

  1. 其实,起码是可以有许多的。网络带宽仍然是不足的资源,通过一个网络连接的并发登录数仍然受限于一些实际的上限。
  2. 实际上,它们在打印机上形成了一个新的队列,等待它们被打印出来,因为没人使得队列软件能够确实地知道什么时候一个人的打印输出是确实已经完成了。这在办公室社会关系内确实是一个进步。