我们会看到此文件分为三部分,每个部分分别对应这三种类型的终端。同时每个部分还分为四栏,总结为下面的图表:
栏名
含义
name
终端设备的名称
getty
在终端上启动运行的程序,通常为getty。其它项目包括xdm,它用来启动X Window系统,或none,说明没有程序。
type
对于虚拟终端,对应的类型为cons25。其它通常的值包括伪终端network,调制解调器入口dialup,以及unknown,用于用户试图以无法预定的类型进行连接的终端。
status
它必须是on或off。如果是on,init将运行getty栏指定的程序。如果出现单词“secure”,说明该tty允许root登录;为避免这种情况,可以用单词“insecure”。
让我们从虚拟终端部分开始解释该文件;可以看到它是以设置控制台开始的:
# If console is marked "insecure", then init will ask
# for the root password when going to single-user mode.
console none unknown off secure
如果在引导过程中fsck命令运行出了问题,init将使你的FreeBSD系统进入单用户模式以使root用户可以修复问题。如果你用insecure代替secure来设置控制台,init将在你可以继续干之前索取口令。
ttyv0 "/usr/libexec/getty Pc" cons25 on secure
# Virtual terminals
ttyv1 "/usr/libexec/getty Pc" cons25 on secure
ttyv2 "/usr/libexec/getty Pc" cons25 on secure
ttyv3 "/usr/libexec/getty Pc" cons25 on secure
ttyv4 "/usr/libexec/getty Pc" cons25 on secure
ttyv5 "/usr/libexec/getty Pc" cons25 on secure
ttyv6 "/usr/libexec/getty Pc" cons25 on secure
ttyv7 "/usr/libexec/getty Pc" cons25 on secure
ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
你可以看到在我的FreeBSD系统上除了控制台以外还有八个虚拟终端;我可以通过按ALT键加一个控制键来访问每个终端。例如ALT F1可访问控制台,ALT F2访问ttyv1, ALT F3访问ttyv2,等等。如果我启动了X会话,那么它可以用ALT F8来访问。如果我把ttyv8上的单词off改为on,那么我可以在引导时得到一个X终端而不是控制台。然后可以继续用我ALT加功能键来访问其它终端。我的所有这些虚拟终端都标为“secure”,说明它们都可接受root登录。你可以有多少个虚拟终端是由你的FreeBSD版本所决定的;如果你希望建立更多虚拟终端,可以读一下这个faq。
现在让我们移到拨号终端:
# Serial terminals
# The ''dialup'' keyword identifies dialin lines to login, fingerd etc.
ttyd0 "/usr/libexec/getty std.9600" dialup off secure
ttyd1 "/usr/libexec/getty std.9600" dialup off secure
ttyd2 "/usr/libexec/getty std.9600" dialup off secure
ttyd3 "/usr/libexec/getty std.9600" dialup off secure
你可以看到我有四个可获得的拨号终端,但它们都被关闭了。如果我想让用户通过调制解调器访问我的FreeBSD系统,我就必须至少打开它们中的一个,还必须决定是否让这些用户可以用root身份登录;如果不,就把单词“secure”改为“insecure”。你是否看到getty栏含有数字9600,它说明数据传输率为9600bps。因为现在很多调制解调器都有更高的速率,我也可以把它改为57600。最后,最好读一下FreeBSD handbook中的拨号服务部分。
/etc/ttys文件的最后一部分是网络或伪终端。你会看到它们有很多,准确地说是255个,范围从:
# Pseudo terminals
ttyp0 none network
到
ttySv none network
且缺省情况下它们都没有被允许。
如果你为了使/etc/ttys更改生效以使init使用这些更改,可以超级用户的身份向init发送一个HUP信号,如:
kill -1 1
这里前面的-1代表信号1(HUP),而后面1代表进程1(init)。
那么现在,哪个/etc/ttys文件中提到的getty程序继续保持运行呢?man 8中对getty的描述如下:
描述
init(8)调用getty程序打开并初始化tty行,读取一个登录名,然后调用login(1)。
所以,init读取/etc/ttys并在每个你在配置文件中设定的终端上启动一个getty进程。getty的工作是监视终端看是否有人试图登录。如果有的话,getty将启动登录程序校验用户的登录名和口令。如果校验合格,登录程序会启动用户的登录命令解释器并把用户置于他们的宿主目录下。当用户具有一个命令解释器后,他们就可以与操作系统交互了。现在它就可以让命令解释器解释用户的输入并确保启动了必要的进程。
当一个用户退出登录时,再次调用init启动其它的getty进程以继续监视终端等待其它的登录尝试。
让我们看一下ps命令的输出来总结一下刚才这次引导的整个过程,FreeBSD 4.1缺省已经安装了ps程序。我将用-ax开关以包含系统进程:
ps -ax
PID TT STAT TIME COMMAND
0 ?? DLs 0:00.01 (swapper)
1 ?? ILs 0:00.16 /sbin/init --
2 ?? DL 0:00.02 (pagedaemon)
3 ?? DL 0:00.00 (vmdaemon)
4 ?? DL 0:00.02 (bufdaemon)
5 ?? DL 0:01.02 (syncer)
1056 ?? Is 0:00.00 adjkerntz -i
1187 ?? Ss 0:00.08 syslogd -s
1206 ?? Is 0:00.05 inetd -wW
1208 ?? Is 0:00.11 cron
1622 ?? Ss 0:00.02 sendmail: accepting connections on port 25 (sendmail)
1621 v0 Ss 0:00.12 -csh (csh)
1701 v0 R+ 0:00.00 ps -ax
1699 v1 Is+ 0:00.01 /usr/libexec/getty Pc ttyv1
1619 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2
1618 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3
1617 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4
1616 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5
1615 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6
1614 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7
现在你可以认识很多进程:swapper的PID为0而init的为1。adjkerntz,syslogd,inetd,cron和sendmail都是由rc启动的。当然,我必须在一个命令解释器上运行这个ps命令;在上述情况中,它是从ttyv0上的c shell解释器运行的。getty进程等待虚拟终端1-7上的登录。而在虚拟终端8上则没有运行getty进程,因为该终端在/etc/ttys中被标为了“off”。