27.6 设置串口控制台

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

警告: 从 FreeBSD 8.0 开始, 用于串口的设备节点从 /dev/cuadN 改为了 /dev/cuauN; 从 /dev/ttydN 改为了 /dev/ttyuN。 FreeBSD 7.X 用户需要根据实际情况对这份文档中的例子进行必要的调整。

27.6.1 介绍

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

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

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

27.6.2 串口控制台的配置, 简明版

  这一节假定您使用默认的配置, 只希望迅速地获得关于配置串口控制台的概览。

  1. 使用串口电缆连接 COM1 和控制终端。

  2. 要在串口控制台上显示所有的引导信息, 需要以超级用户的身份执行下面的命令:

    # echo 'console="comconsole"' >> /boot/loader.conf
    
  3. 编辑 /etc/ttys 并把 ttyu0off 改为 ondialup 改为 vt100。 否则通过串口控制台上将不会提示输入口令, 从而导致潜在的安全漏洞。

  4. 重新启动并观察是否生效。

  如果需要不同的配置, 更进一步的配置讨论可以在 第 27.6.3 节 找到。

27.6.3 串口控制台的设置

  1. 准备一根串口线缆。

    您需要使用一个 null-modem 的线缆或标准的串口线和一个 null-modem 适配器。 请参考 第 27.2.2 节 中有关串口线的讨论。

  2. 拔掉键盘。

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

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

    如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS 来避免它。 请参考您的主板的使用说明了解更多细节。

    提示: 在 BIOS 中将键盘设为 “Not installed” (未安装)。 现在您仍然无法使用键盘。 这样做只是告诉 BIOS 在启动时不要探测键盘。 您的 BIOS 不应抱怨键盘不存在。 即使这一标志设置为 “Not installed” 时, 只要把键盘插上, 它就仍可使用。 如果以上的选项不存在于 BIOS 中, 可尝试寻找 “Halt on Error” 选项。 把这一项设置为 “All but Keyboard” 或者是 “No Errors”, 都能器到相同的作用。

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

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

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

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

    有关的标记是:

    0x10

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

    0x20

    无论是否使用了下面将要讨论的 -h 选项, 都强制这个单元作为控制台 (除非使用了更高优先级的控制台)。 标志 0x20 必须与 0x10 一起使用。

    0x40

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

    例如:

    device sio0 flags 0x10
    

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

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

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

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

    -h

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

    -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 内部控制台
    -h 串口控制台
    -D 串口控制台和内部控制台
    -Dh 串口控制台和内部控制台
    -P, 有键盘 内部控制台
    -P, 无键盘 串口控制台

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

    在控制台上按 Enter 以外的任意键就能打断启动进程。 引导块将进入命令行模式。 您将看到:

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

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

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

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

27.6.4 摘要

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

27.6.4.1 例1: 您为 sio0 设置标记 0x10

device sio0 flags 0x10
在 /boot.config 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台
内部 内部 内部
-h 串口 串口 串口
-D 串口和内部 内部 内部
-Dh 串口和内部 串口 串口
-P, 有键盘 内部 内部 内部
-P, 没有键盘 串口和内部 串口 串口

27.6.4.2 例2:您为 sio0 设置标记为 0x30

device sio0 flags 0x30
在 /boot.config 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台
内部 内部 串口
-h 串口 串口 串口
-D 串口和内部 内部 串口
-Dh 串口和内部 串口 串口
-P, 有键盘 内部 内部 串口
-P, 没有键盘 串口和内部 串口 串口

27.6.5 串口控制台的提示

27.6.5.1 设置更高的串口速度

  在默认配置中, 串口的设置是: 速率 9600 波特、 8 数据位、 无奇偶校验位、 1 停止位。 如果您希望修改默认的控制台速率, 可以采用下列几种方法之一:

  • BOOT_COMCONSOLE_SPEED 配置为希望的速率, 并重新编译引导块。 请参见 第 27.6.5.2 节 以了解如何联编和安装新的引导块。

    如果串口控制台已配置为使用 -h 以外的其它方式引导, 或者内核使用的速率与引导块不同, 则必需在内核配置文件中加入下述设置, 并重新联编新内核:

    options CONSPEED=19200
    
  • 使用内核引导选项 -S. -S 这个命令行选项可以加到 /boot.config 中。 请参见联机手册 boot(8) 以获得如何在 /boot.config 中增加选项, 以及其它的可用选项。

  • 在您的 /boot/loader.conf 文件中启用 comconsole_speed 选项。

    使用这个选项时,您还需要在 /boot/loader.conf 中配置 consoleboot_serial, 以及 boot_multicons。 下面是一个利用 comconsole_speed 改变串口控制台速率的例子:

    boot_multicons="YES"
    boot_serial="YES"
    comconsole_speed="115200"
    console="comconsole,vidconsole"
    

27.6.5.2 使用 sio0 以外的串口 作为控制台

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

  1. 取得内核源代码 (参考 第 25 章)。

  2. 编辑 /etc/make.conf 文件, 然后设置 BOOT_COMCONSOLE_PORT作为您要使用 (0x3f80x2f8、 0x3E8 或 0x2E8) 端口的地址。 只有 sio0sio3 (COM1COM4) 都可以使用; 但多口串口卡将不会工作。 不需要任何中断设置。

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

    device sio1 flags 0x10
    

    device sio1 flags 0x30
    

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

  4. 重新编译和安装引导块:

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

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

27.6.5.3 通过串口线进入DDB调试器

options BREAK_TO_DEBUGGER
options DDB

27.6.5.4 在串口控制台上得到一个登录命令行

  您可能希望通过串口线进入登录提示, 现在您可以看到启动信息, 通过串口控制台键入内核调试信息。可以这样做。

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

ttyu0 "/usr/libexec/getty std.9600" unknown off secure
ttyu1 "/usr/libexec/getty std.9600" unknown off secure
ttyu2 "/usr/libexec/getty std.9600" unknown off secure
ttyu3 "/usr/libexec/getty std.9600" unknown off secure

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

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

27.6.6 从启动引导器修改控制台

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

27.6.6.1 配置串口控制台

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

console="comconsole"

  无论前一节中的引导块如何配置, 这个设置都会生效。

  您最好把上面一行放在 /boot/loader.conf 文件的第一行,以便尽早地在启动时看到串口控制台的启动信息。

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

console="vidconsole"

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

  控制台可以在 /boot/loader.conf.local 或者是在 /boot/loader.conf 中指定。

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

注意: 目前, 引导块尚不提供与引导加载器的 -P 选项等价的选项, 另外, 它也不能根据是否有键盘存在自动决定选择使用内部控制台还是串口控制台。

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

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

27.6.7 警告

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

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

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.