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