29.6.设置串行控制台 =================== FreeBSD 有能力在启动系统的时候将一个哑终端放在串口上作为控制台。这种配置对于希望在没有键盘或显示器的机器上安装 FreeBSD 的系统管理员,以及希望调试内核或设备驱动程序的开发人员来说非常有用。 正如在\ `FreeBSD 引导过程 `__\ 中所述,FreeBSD 的引导过程采用了三个阶段。前两个阶段是在引导块代码中,它被存储在引导盘上的 FreeBSD slice 的开头。然后,引导块加载并运行作为第三阶段代码的引导加载器。 为了设置从串行控制台启动,需要配置引导块代码、引导加载器代码和内核。 29.6.1.快速配置串口控制台 ------------------------- 本节提供了一个关于设置串行控制台的快速概述。这个程序可以在哑终端连接到 **COM1** 时使用。 **在 COM1 上配置串行控制台的过程** 1. 将串行电缆连接到 **COM1** 和控制终端。 2. 要配置在串行控制台显示的启动信息,以超级用户身份执行执行命令: .. code:: shell-session # echo 'console="comconsole"' >> /boot/loader.conf 3. 编辑 **/etc/ttys**\ ,将 **ttyu0** 条目中的 ``off`` 改为 ``on``\ ,\ ``dialup`` 改为 ``vt100``\ 。否则,通过串行控制台连接时将不需要密码,从而导致一个潜在的安全漏洞。 4. 重启系统来检查这些变更是否起作用 如果需要不同的配置,请看下一节更深入的配置解释。 29.6.2.深入的串行控制台配置 --------------------------- 本节将对在 FreeBSD 中设置串行控制台所需的步骤进行更详细的解释。 **配置串口控制台的过程** 1. 准备一根串口线缆。 你需要使用一个 null-modem 的线缆或标准的串口线和一个零调试解调器适配器。请参考\ `线缆和端口 `__ 中有关串口线的讨论。 2. 拔掉键盘。 绝大多数的电脑在开机检测的时候会对键盘进行检测,如果没有检测到键盘,则会出现错误。一些机器会提示缺少键盘,就不会继续引导系统。 如果你的计算机出现错误,但仍能继续启动,你可以不必理它。 如果你的计算机没有键盘就拒绝启动,那你需要配置 BIOS 来避免它。请参考你的主板的使用说明了解更多细节。 **技巧** 尝试在 BIOS 中将键盘设为“Not installed”。这个设置告诉 BIOS 在上电时不要探测键盘,这样如果键盘不在,它就不会发出警告。如果该选项在 BIOS 中不存在,则寻找“Halt on Error”选项。将此设置为“All but Keyboard”或“No Errors”将具有相同的效果。 如果系统有 PS/2 鼠标,如果幸运的话,你也可以象键盘一样把它拔下来,这是因为 PS/2 鼠标与键盘的一些硬件是共享的,你的鼠标插上去,系统会认为键盘也仍然存在。 **注意** 虽然大多数系统可以在没有键盘的情况下启动,但相当多的系统在没有图形适配器的情况下无法启动。一些系统可以通过将 BIOS 配置中的“graphics adapter”设置改为“Not installed”来配置成在没有图形适配器的情况下启动。其他系统不支持这个选项,如果系统中没有显示硬件,将拒绝启动。对于这些机器,要将显卡的接口接入,即使它只是一块废旧的单声道板。不需要连接显示器。 3. 将一个哑终端、一台带有调制解调器程序的旧电脑或另一个 UNIX® box 上的串口插入串口。 4. 在 **/boot/device.hints** 中为串口添加适当的 ``hint.uart.*`` 条目。一些多端口卡也需要内核配置选项。请参考 `uart[4] `__ 的手册页面来了解每个支持的串口所需的选项和设备提示。 5. 在引导驱动器的 ``a`` 分区的根目录中创建 **boot.config**\ 。 这个文件指示引导块代码如何引导系统。为了激活串行控制台,需要下列一个或多个选项。当使用多个选项时,把它们都放在同一行: **-h** 在内部控制台和串行控制台之间进行切换。用它来切换控制台设备。例如,要从内部(视频)控制台引导,使用 ``-h`` 来指示引导加载器和内核使用串行端口作为控制台设备。或者,如果要从串口引导,使用 ``-h``\ 来告诉引导加载器和内核使用视频显示器作为控制台。 **-D** 在单控制台和双控制台的配置之间进行切换。在单配置中,控制台将是内部控制台(视频显示器)或串行端口,取决于 ``-h`` 的状态。在双控制台配置中,无论 ``-h`` 的状态如何,视频显示器和串口将同时成为控制台。然而,双控制台的配置只在引导块运行时生效。引导加载器得到控制后,由 ``-h`` 指定的控制台就成为唯一的控制台。 **-P** 使得引导块探测键盘。如果没有发现键盘,\ ``-D`` 和 ``-h`` 选项会自动设置。 **注意** 由于当前版本的引导块的空间限制,\ ``-P`` 只能检测到扩展键盘。少于 101 个键的键盘和没有 F11 和 F12 键的键盘可能无法被检测到。由于这个限制,一些笔记本电脑上的键盘可能无法被正确发现。如果是这种情况,请不要使用 ``-P``\ 。 使用 ``-P`` 来自动选择控制台,或者使用 ``-h`` 来激活串行控制台。更多细节请参考 `boot(8) `__ 和 `boot.config(5) `__ 的手册页面。 除了 ``-P`` 之外,其他的选项都被传递给引导加载器。引导加载器将通过检查 ``-h`` 的状态来决定是内部视频还是串行端口成为控制台。这意味着如果在 **/boot.config** 中指定了 ``-D``\ ,但是没有指定 ``-h``\ ,那么串口只能在引导块中作为控制台使用,因为 Boot Loader 会使用内部视频显示作为控制台。 1. 引导机器 当 FreeBSD 引导时,引导块会将 **/boot.config** 的内容回传到控制台,比如说: .. code:: shell-session /boot.config: -P Keyboard: no 第二行只有在 **/boot.config** 中的 ``-P`` 出现时才会出现,并表明键盘的存在或不存在。这些信息要么发送到串行控制台,要么发送到内部控制台,或者同时发送到两者,这取决于 **/boot.config** 中的选项。 ================ ====================== 参数 送出消息的设备 ================ ====================== none 内部控制台 ``-h`` 串口控制台 ``-D`` 串口控制台和内部控制台 ``-Dh`` 串口控制台和内部控制台 ``-P``\ ,有键盘 内部控制台 ``-P``\ ,无键盘 串口控制台 ================ ====================== 出现上面信息后,在引导块加载引导器和更多信息显示到屏幕之前将有一个小小的停顿。在通常情况下,你不需要打断引导进程,但为了确信设置是否正确,你也可以这样做。 在控制台上按\ ``回车键``\ 以外的任意键就能打断引导进程。引导块将进入命令行模式。你将看到: .. code:: shell-session >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/boot/loader boot: 检验上面出现的信息,可能是串口,或内部控制台,或两个同时,完全取决于你在 **/boot.config** 中的参数。如果信息出现在正确的控制台,按\ ``回车键``\ 继续引导进程。 如果你要使用串口控制台,但你没有看到命令行,那可能设置有问题。这时,输入 ``-h`` 然后按 ``回车键`` 或 ``Return`` 来告诉引导块(然后是引导加载器和内核)选择串口作为控制台。系统起来了之后,就可以回去检查一下是什么出了问题。 在引导过程的第三阶段,人们仍然可以通过在引导加载器中设置适当的环境变量在内部控制台和串行控制台之间切换。参见 `loader(8) `__ 以了解更多信息。 **注意** 在 **/boot/loader.conf** 或 **/boot/loader.conf.local** 中的这一行将配置 Boot Loader 和内核将他们的引导信息发送到串行控制台,而不考虑 **/boot.config** 中的选项。 .. code:: shell-session console="comconsole" 这一行应该是 **/boot/loader.conf** 的第一行,这样引导信息就会尽早显示在串行控制台。 如果这一行不存在,或者它被设置为 ``console="vidconsole"``\ ,那么引导加载器和内核将使用引导块中由 ``-h`` 指示的控制台。参见 `loader.conf(5) `__ 了解更多信息。 目前,引导加载器在引导块中没有相当于 ``-P`` 的选项,也没有规定根据键盘的存在自动选择内部控制台和串行控制台。 .. **技巧** 虽然这不是必须的,但可以通过串行线提供一个 ``login`` 提示。要配置这一点,请使用\ `终端配置 `__\ 中的说明编辑 **/etc/ttys** 中的串口条目。如果串口的速度已经改变,请改变 ``std.9600`` 以符合新的设置。 29.6.3.设置一个更快的串行端口速度 --------------------------------- 默认情况下,串行端口设置为 9600 波特、8 位、无奇偶校验和 1 个停止位。要改变默认的控制台速度,请使用下列选项之一: - 编辑 **/etc/make.conf** 并将 ``BOOT_COMCONSOLE_SPEED`` 设置为新的控制台速度。然后,重新编译并安装引导块和引导加载器: .. code:: shell-session # cd /sys/boot # make clean # make # make install 如果串行控制台是以其他方式配置的,而不是用 ``-h`` 引导,或者内核使用的串行控制台与引导 块使用的不同,可以在定制内核配置文件中加入下列选项,并加上所需的速度,然后编译一个新的内核: .. code:: shell-session options CONSPEED=19200 - 在 **/boot.config** 中添加 ``-S19200`` 引导选项,用要使用的速度代替 19200。 - 在 **/boot/loader.conf** 中添加以下选项。用要使用的速度替换 115200: .. code:: shell-session boot_multicons="YES" boot_serial="YES" comconsole_speed="115200" console="comconsole,vidconsole" 29.6.4.从串行线进入 DDB 调试器 ------------------------------ 要配置从串行控制台进入内核调试器的能力,请在定制内核配置文件中加入以下选项,并按照\ `配置 FreeBSD 内核 `__\ 的说明编译内核。注意,虽然这对远程诊断很有用,但如果在串口上产生虚假的 BREAK,也是很危险的。请参考 `ddb(4) `__ 和 `ddb(8) `__ 以了解更多关于内核调试器的信息: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session options BREAK_TO_DEBUGGER options DDB