Home -- Michael's Blog :: Just Do IT -- Manuals

20.6. 设置串行控制台

Contributed by Kazutaka YOKOTA. Based on a document by Bill Paul.

20.6.1. Introduction

FreeBSD可以通过一个串口只使用一个哑(dumb)终端就可以启动一个系统。这样一种配置只有两种人能使用:希望在机器上安装FreeBSD的系统管理员,他没有键盘或显示器,还有就是要调试内核或设备驱动程序的开发人员。

就象第 12 章描述的,FreeBSD可以使用一个三步的启动过程。最先两步被储存在FreeBSD启动磁盘的启动slice的启动代码块中。启动块然后就被加载,接着运行第三步启动引导器(/boot/loader)。

为了设置串行控制台,你必须配置启动代码块,启动引导器代码和内核。

20.6.2. 串行控制台的配置, 简明版

本节假定您使用默认的配置, 了解如何连接串口, 并且希望快速地了解一下串行控制台。 如果您在采取这些步骤时遇到问题, 请参考 第 20.6.3 节 中关于高级设置的详细介绍。

  1. 连接串口。 串行控制台将出现在 COM1 上。

  2. 使用 echo -h > /boot.config 来启用引导加载器和内核的串口控制台。

  3. 编辑 /etc/ttys 并把 ttyd0off 改为 on。 这将在串口控制台上启用一个登录提示, 其内容和普通的控制台一样。

  4. shutdown -r now 将重启系统并启用串行控制台。

20.6.3. 串行控制台的设置S

  1. 准备一个串行线缆。

    你需要使用一个null-modem的线缆或一个标准的串行线和一个null-modem适配器。看看第 20.2.2 节有关串行线的讨论。

  2. 拔去你的键盘。

    绝大多数的PC在开机检测的时候会检测到键盘,如果键盘没有被检测到,将会出现一个错误。一些机器会提示丢失键盘,就不会继续引导系统。

    如果你的计算机出现错误,但仍能继续启动,你可以不必理它。

    如果你的计算机没有键盘拒绝启动,那你需要配置BIOS来避免这个错误。看看你的主板的使用说明了解更多细节。

    提示: 在BIOS中设置键盘Not installed并不意味着你不能使用键盘。这样做只是告诉BIOS不要在机器开机检测时检测键盘,以至不会提示说系统找不到键盘。即使你设置了Not installed,只要把你的键盘插上去仍然可以使用。

    注: 如果你的系统有一个PS/2鼠标,如果机会好的话,你也可以象键盘一样把它拔下来,这是因为PS/2鼠标与键盘的一些硬件是共享的,你的鼠标插上去,系统会认为键盘仍在那儿。

  3. 插一个哑(dumb)终端到COM1:(sio0)。

    如果你没有一个哑终端,你可以使用一个比较老的带有一个modem程序的PC/XT机器,或在其他UNIX®机器上的串口。如果你没有COM1:(sio0),去找一个。这时,你没有办法只能选择COM1:来启动系统。如果你已经在另一台设备上使用COM1:,你必须临时删除那个设备,然后安装一个新的系统启动块和内核。

  4. 确信你的内核配置文件已经为COM1:(sio0)设置了适当的标记:

    有关的标记是:

    0x10

    启用控制台支持。其他的控制台标记会被忽略,除非它被设置了。现在,绝大多数的设置都有控制台的支持。这个标记的第一个就是首选的。这个单独选项是不能确保串口适用于控制台的,设置下面的标记或加上下面描述的-h选项,和这个放在一起。

    0x20

    不管下面有没有讨论,都迫使这个选项支持控制台。这个标记在FreeBSD 2.X中替换了COMCONSOLE选项。标记0x20必须和0x10一起使用。

    0x40

    预留这个单元 (配合 0x10) 并让它不能用于普通的使用。 您不应在希望作为控制台的串口单元上设置这个标志。 这一标志是为内核远程调试准备的。 参见 开发者手册 以了解关于远程调试更进一步的情况。

    注: 在FreeBSD 4.0-CURRENT和以后的版本中,标记0x40通常是不同的,有另一个标记可以来指定一个串口用于远程调试。

    例如:

    device sio0 at isa? port port IO_COM1 flags 0x10 irq 4
    

    看看sio的联机手册了解更多信息。

    如果标记没有被设置,你必须运行UserConfig或重新编译内核。

  5. 在启动磁盘的a分区的根目录创建一个boot.config文件。

    这个文件将指导启动块代码如何启动系统。为了激活串行控制台,你必须有一个或多个下面的选项——如果你要多个选项,在同一行必须都包含它们:

    -h

    切换内部和串行控制台。你使用这个来交换控制台设备。例如,如果你从内部控制台启动,你可以使用-h来直接使用启动引导器和内核来使用串口作为它的控制台设备。另外,如果你从串口启动,你可以使用-h来告诉启动引导器和内核使用显示设备作为控制台。/para>

    -D

    切换单一和双重控制台配置。在单一配置中,控制台将是本机的控制台(显示设备)或串口。在双重控制台配置中,显示设备和串口将同时成为控制台,无论-h的选项的情形。然而,双控制台配置只在启动块运行的过程中起作用。一旦启动引导器获得控制,由-h选项指定的控制台将成为唯一的控制台。

    -P

    在启动时,探测键盘。如果键盘找不到,-D-h选项会自动设置。

    注: 由于启动块的当前版本的限制,-P选项只能探测扩展的键盘。少于101键的键盘将无法被探测到。如果你碰到这个情况,你必须避免使用-P选项。不幸的是这个问题还没有解决。

    使用-P选项来自动选择控制台,或使用-h选项来激活控制台。

    你也可以使用boot联机文档中所描述的其他选项。

    除了-P选项,所有选项将被传给启动引导器(/boot/loader)。启动引导器将通过检查-h选项的状态来决定是显示设备成为控制台,还是串口成为控制台。这意味着如果你指定-D选项,但在/boot.config中没有-h选项,你在启动代码块时使用串口作为控制台。启动引导器将使用内部显示设备作为控制台。

  6. 启动机器

    当你启动你的FreeBSD时,启动块将把/boot.config的内容发给控制台。例如:

    /boot.config: -P
    Keyboard: no
    

    如果你把-P放在/boot.config中并指出键盘存在或不存在,那将只出现第二行。这些信息会被定位到串口或内部控制台,或两个都是,完全取决于/boot.config中的选项。

    选项 定位信息
    none internal console
    -h serial console
    -D serial and internal consoles
    -Dh serial and internal consoles
    -P, keyboard present internal console
    -P, keyboard absent serial console

    出现上面信息后,在启动块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。在通常情况下,你不需要打断启动进程,但为了确信设置是否正确,你也可以这样做。

    键入任何键,而不是Enter,控制台会打断启动进程。启动块将进入命令行模式。你看到:

    >> FreeBSD/i386 BOOT
    Default: 0:ad(0,a)/boot/loader
    boot:
    

    检验上面出现的信息,可能是串口,或内部控制台,或两个都是,完全取决于你在/boot.config中的选项。如果信息出现在正确的控制台,键入Enter继续启动进程。

    如果你要使用串行控制台,但你没有看到命令行,那可能设置有问题。这时,你键入-h然后单击Enter/Return来告诉启动块(然后是启动引导器和内核)选择串口作为控制台。一旦系统起来了,回去检查一下是什么出问题了。

启动引导器加载完后,你将进入启动进程的第三步,你仍然可以在启动引导器通过设定你喜欢的环境来切换内部控制台和串行控制台。看看第 20.6.6 节

20.6.4. 摘要

这是几个在这章要讨论的几个设置和选择的控制台的摘要。

20.6.4.1. 例1: 你为sio0设置标记为0x10

device sio0 at isa? port port IO_COM1 flags 0x10 irq 4
在/boot.config中的选项 启动块过程中的控制台 启动引导器过程中的控制台 内核中的控制台
nothing internal internal internal
-h serial serial serial
-D serial and internal internal internal
-Dh serial and internal serial serial
-P, keyboard present internal internal internal
-P, keyboard absent serial and internal serial serial

20.6.4.2. 例2:你为sio0设置标记为0x30

device sio0 at isa? port port IO_COM1 flags 0x30 irq 4
在/boot.config中的选项 启动块过程中的控制台 启动引导器过程中的控制台 内核中的控制台
nothing internal internal serial
-h serial serial serial
-D serial and internal internal serial
-Dh serial and internal serial serial
-P, keyboard present internal internal serial
-P, keyboard absent serial and internal serial serial

20.6.5. 串行控制台的提示

20.6.5.1. 设置一个快速的串口速度

默认的串口被设置成9600波特,8位,没有奇偶校验,1个停止位。如果你希望改变速度,你必须重新编译启动块。在/etc/make.conf中添加下面一行,然后编译新的启动块:

BOOT_COMCONSOLE_SPEED=19200

参见 第 20.6.5.2 节 以了解如何编译和安装新的引导快。

如果串行控制台用其他方法来配置而不是在启动时用 -h, 或内核使用的串行控制台与启动块使用的不同, 就必须在内核配置中加入下面这行,并重新编译内核:

options CONSPEED=19200

20.6.5.2. 使用串口而不是sio0作为控制台

使用串口而不是sio0作为控制台需要做一些重编译。如果你无论如何都要使用另一个串口,重新编译启动块,启动引导器和内核。

  1. 得到内核源代码(看第 19 章)。

  2. 编辑/etc/make.conf文件,然后设置BOOT_COMCONSOLE_PORT作为你要使用(0x3f80x2f8,0x3E8 or 0x2E8)端口的地址。只有sio0sio3COM1COM4)能被使用。多接口串行卡将不会工作。不需要任何中断设置。

  3. 创建一个定制的内核配置文件,在你要使用的串口添加合适的标记。例如,如果要将sio1COM2:)作为控制台:

    device sio1 at isa? port port IO_COM2 flags 0x10 irq 3
    

    or

    device sio1 at isa? port port IO_COM2 flags 0x30 irq 3
    

    其他端口的控制台标记也不要设。

  4. 重新编译和安装启动块:

    # cd /sys/boot
    # make
    # make install
    
  5. 重建和安装内核。

  6. disklabel(8)将启动块写到启动磁盘上,然后从新内核启动。

20.6.5.3. 通过串行线进入DDB调试器

options BREAK_TO_DEBUGGER
options DDB

20.6.5.4. 在串行控制台上得到一个登陆命令行

你可能希望通过串行线得到一个登陆命令行,现在你可以看到启动信息,通过串行控制台键入内核调试信息。可以这样做。

用一个编辑器打开/etc/ttys文件,然后定位到下面的行:

ttyd0 "/usr/libexec/getty std.9600" unknown off secure
ttyd1 "/usr/libexec/getty std.9600" unknown off secure
ttyd2 "/usr/libexec/getty std.9600" unknown off secure
ttyd3 "/usr/libexec/getty std.9600" unknown off secure

ttyd0ttyd3相当于COM1COM4。可以打开或关闭某个端口。如果你已经改变了串口的速度,你必须修改标准的9600与当前的例如19200相匹配。

你也可以改变终端的类型从不知名的到你串行终端的真实类型。编辑完这个文件,你必须kill -HUP 1来使这个修改生效。

20.6.6. 从启动引导器修改控制台

前面一节描述了如何通过调整启动块来设定串行控制台。这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。由于启动引导器会被启动进程的第三步所调用,启动块以后,在启动引导器中的设置将忽略在启动块中的设置。

20.6.6.1. 设定串行控制台

你可以很容易地指定启动引导器和内核来使用串行控制台,只需要在/boot/loader.rc中写入下面这行:

set console=comconsole

This will take effect regardless of the settings in the boot block discussed in the previous section.

你最好把上面一行放在文件的第一行,以至于尽早地在启动时看到串行控制台的启动信息。

同样地,你可以指定内部控制台为:

set console=vidconsole

如果你不设置启动引导环境变量控制台,启动引导器和内核将使用在启动块时用-h选项指定的控制台。

在版本3.2或以后的版本中,你可以在/boot/loader.conf.local/boot/loader.conf中指定控制台,而不是在/boot/loader.rc中。在这个方法中,你的/boot/loader.rc文件将是这样的:

include /boot/loader.4th
start

然后,创建/boot/loader.conf.local放上下面的行。

console=comconsole

console=vidconsole

看看loader.conf(5) 的联机手册了解更多信息。

注: At the moment, the boot loader has no option equivalent to the -P option in the boot block, and there is no provision to automatically select the internal console and the serial console based on the presence of the keyboard.

20.6.6.2. 使用串口而不是sio0作为控制台

你需要使用一个串口而不是sio0重新编译启动引导器作为串行控制台。下面的步骤跟第 20.6.5.2 节描述的相似。

20.6.7. 警告

这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。不幸的是,绝大多数系统没有键盘可以让你启动,而没有显示设备就不让你启动。使用AMI BIOS的机器可以通过在CMOS中将“graphics adapter”项设为“Not installed”来在启动时不需要显示适配器。T

然而,许多机器不支持这个选项,如果你的系统没有显示硬件就拒绝启动。对于这些机器,即使你没有显示器,你也必需在机器上插上显示适配器。建议你试试采用AMI BIOS的机器。

Michael's Blog :: Just Do IT -- manuals