在FreeBSD 中,允许以下三种控制台(Console)类型:vidconsole、serial console和nullconsole。vidconsole就是我们通常使用的配有显示器和鼠标键盘的控制台,serial console是显示在串行口连接终端设备(serial terminal)上面的控制台,而nullconsole是指既不是vidconsole也不是serial console,也就是说主机上没有显示器、鼠标键盘以及串口终端。
要实现通过串口终端来访问FreeBSD很简单。从使用层次上可以分为三个阶段,下面将一一叙述:
阶段一:将登录提示符显示在你的串口终端上
要实现让用户从串口控制台上登录到FreeBSD,方法很简单,只需要修改/etc/ttys中的项即可。
FreeBSD使用/dev/目录下的ttyd*文件来表示串行口(接入用,另有cuad*来表示接出,不再累叙)。并且默认/etc/ttys中有以下几项:
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
虽然理论上可以使用任何一个/dev/中有的ttyd*文件来作为串口控制台,但是默认情况下FreeBSD使用ttyd0作为串口控制台,也就是说你的串口终端设备必须接到ttyd0所表示的COM1口上。
通过dmesg | grep sio可以看到类似如下的信息:
sio0: <16550A-compatible COM port> port 0×3f8-0×3ff irq 4 flags 0×10 on acpi0
sio0: type 16550A, console
sio1: <16550A-compatible COM port> port 0×2f8-0×2ff irq 3 on acpi0
sio1: type 16550A
这就是在不经过配置内核情况下,FreeBSD自动将sio0作为了串口控制台的设备,这些设置同时也可以在/boot/device.hints文件中修改。在这里,作为实例,我们以系统默认的sio0,即ttyd0作为串口终端的接入。
我们将/dev/ttys文件中的关于串口控制台的描述改为以下内容:
ttyd0 “/usr/libexec/getty std.115200″ vt220 on insecure
ttyd1 “/usr/libexec/getty std.9600″ dialup off insecure
ttyd2 “/usr/libexec/getty std.9600″ dialup off insecure
ttyd3 “/usr/libexec/getty std.9600″ dialup off insecure
std.115200表示的是传输的速度,这是我在实验中试过的最高的传输速度。这里的std.115200作为参数传递给/usr/libexec/getty。关于速度的更详细列表可参见/etc/gettytab文件。
vt220为终端的类型,当然也可以选择vt100、vt102、cons25等其他的类型,但是在笔者的环境下(装有Gentoo的pc作模拟串口终端),vt220最为合适。
insecure的选项表示在ttyd0这个串口控制台下不允许root登录,这是个好的习惯,比较采用普通用户登录再su一下也是很方便的。
为了让设置生效,reboot当然是个办法,但最方便的是
kill -HUP 1
每一次对/etc/ttys的修改,都应该使用kill -HUP 1来使之生效。
这样,在FreeBSD端的设置就完成了。
为了连接串口控制台,我在Gentoo上安装了minicom,一个非常优秀的串口通信程序。使用以下设置:
% more /etc/minicom/minirc.dfl
# Machine-generated file - use “minicom -s” to change parameters.
pr port /dev/ttyS0
pu baudrate 115200
pu mautobaud Yes
(可用root运行minicom来配置实现)
为了让普通用户使用minicom,正确来说是使用/etc/ttyS0,需要运行gpasswd -a xxx tty来将你的用户添加到tty这个组中。
这样如果设置正确的话,运行minicom就可以连接到FreeBSD的串口终端了,如果你不能看到你熟悉的login提示符,请检查你的FreeBSD中/dev/ttys里串口速度的设置以及minicom中速度的设置。
阶段二:将内核启动过程输出到你的串口终端上
在上一部分里,已经介绍了如何通过串口控制台登录到FreeBSD,但是 在有些情况下,仅仅登录到FreeBSD是不够的。上述的方法是在 FreeBSD启动完成后通过getty来实现的。如果需要查看登录过程的屏幕输出,或者需要登录到单用户模式,上述的做法是不够的。
要让FreeBSD把启动信息显示在串口控制台上,最简单的办法是:
echo “console=comconsole” >> /boot/loader.conf
要指定串口的速度则可以
方法一:
echo “comconsole_speed=115200″ >> /boot/loader.conf
方法二:
echo “machdep.conspeed=115200″ >> /boot/loader.conf (不要把machdep.conspeed的值写在/etc/sysctl.conf里,/etc/sysctl.conf里的值在FreeBSD启动完 毕之后才会应用。)
方法三:
重新编译boot模块:
在/etc/make.conf中指定
BOOT_COMCONSOLE_SPEED=115200
让后
cd /sys/src
make clean && make && make install
以及在内核中指定
options CONSPEED=115200
重新编译、安装内核。
这样,通过minicom,你就可以看到FreeBSD的启动过程了,你也从串口控制台可以选择进入单用户模式。
在此阶段描述的串口速度是在FreeBSD启动到loader 阶段设置的。
阶段三:将启动区的信息输出到你的终端上
经过阶段二的设置,通过minicom连接的FreeBSD串口控制台可以满足你启动系统的大部分需要,但是你依然无法通过控制台在启动提示符下输入boot -s这样的命令。
熟 悉FreeBSD启动过程的朋友就会知道,上述阶段二的设置loader.conf是在/boot/loader(loader阶段)被调用的时候被应用 的,但在 /boot/loader被调用之前,FreeBSD还调用了启动块(boot blocks)程序来显示boot的提示符。所以,阶段二的设置无法将这些先于/boot/loader执行的内容显示在串口控制台上,用户也无法输入 boot -s类似的启动命令。
要让启动块的信息也显示在串口控制台上,我们需要在/boot/所在的分区的根目录建立 boot.config文件。如果你的/boot目录与/目录是在同一个分区上的,那么这个文件就是/boot.config;如果你的/boot目录是 在一个独立的分区上的,这个文件就是/boot/boot.config
/boot/boot.config的内容为:
-P
-P是boot提示符下输入的参数,表示如果FreeBSD检测到键盘的话就使用vidconsole来实现启动内容,否则使用serial console。具体的其他需选项可参见handbook或者man boot。
默认情况下,在boot阶段的串口控制台的传输速度是9600,在当前的FreeBSD版本里,我还没有发现可以修改boot阶段的串口控制台速度。而在7.0 Current的文档中,我找到了以下内容:
A new option -S, which allows setting the boot2 serial console speed in the /boot.config file or on the boot: prompt line, has been added.
所以,要修改boot阶段的串口速度,还得等更新的版本的FreeBSD吧(不一定是7.0),我现在的版本是6.1-Prerelease。
关于串口控制台的速度
值得一提的是,速度的设置。
1、 如果串口控制台是通过/boot.config来启动的(阶段三),那么在loader阶段,也就是本文说的阶段二,串口控制台的速度默认就是boot阶 段的串口速度,除非手动在/boot/loader.conf中设置comconsole_speed或者machdep.conspeed的值。而 /etc/ttys中定义的速度值会被忽略掉。
2、如果串口是通过/boot/loader.conf中定义console= comconsole来启动的话(阶段二),默认的就是9600或者用BOOT_COMCONSOLE_SPEED重新定义的值,如果在 /boot/loader.conf中指定了comconsole_speed或者machdep.conspeed的值,则串口控制台的速度就是这些变 量指定的值。
3、如果串口控制台是通过/etc/ttys启动的(阶段三),串口控制台的速度就是/etc/ttyps中指定的值。
推荐的方案
因此,在boot的-S参数没有正是应用之前,可以使用以下的方案来配置您的串口控制台
1、方案一:
/boot.config:
-P
/etc/loader.conf
comconsole_speed=115200
/etc/ttys
ttyd0 “/usr/libexec/getty std.115200″ vt220 on insecure
方案二:
/etc/make.conf
BOOT_COMCONSOLE_SPEED=11520
cd /sys/boot/ && make clean && make && make install
如有必要请在内核中加入options CONSPEED=11520
/etc/loader.conf
console=comconsole
/etc/ttys
ttyd0 “/usr/libexec/getty std.115200″ vt220 on insecure
Tips:
如何查看FreeBSD当前串口控制台的传输速度:
sysctl -a | grep conspeed
如何在运行过程中修改FreeBSD串口控制台传输速度:
sysctl machdep.conspeed=115200