Total Pageviews

Friday, 2 November 2012

使用串口访问FreeBSD系统/Linux系统

最近热衷于使用串口登录系统,这样就不用在需要调试系统的时候,为系统连接显示器和键盘了。

  FreeBSD中的串口通信,可以阅读它的手册,下面的地址是中文手册中的串口通信部分,可以仔细阅读它。
  http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/serialcomms.html
  以下为引用:
  在FreeBSD中,您可以通过 /dev 目录中的一个记录来访问每个串行端口。有两种不同的记录:
  呼入端口被命名为/dev/ttydN, 这里 N 是端口号,从零开始。 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测 (DCD) 信号来工作。
  呼出端口被命名为 /dev/cuadN。 您通常不使用呼出端口作为终端, 只使用modem。如果串行线或终端不支持载波检测数据传输, 您可以使用呼出端口。

注意: 在 FreeBSD 5.X 和更早版本中, 呼出端口的名字是 /dev/cuaaN。

  如果您已经连接一个终端到第一个串行端口 (在 MS-DOS® 上是COM1), 则可以使用 /dev/ttyd0 来作为终端。 如果它是在第二个串行端口 (COM2), 那就是 /dev/ttyd1,等等。

  引用完毕。

  简单地来说,使用串口访问FreeBSD需要修改FreeBSD的配置文件/etc/ttys,我现在使用的版本是5.4的,找到
# Serial terminals
# The ‘dialup’ keyword identifiles dialin lines to login, fingerd etc.
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
……

将ttyd0行如下修改:
ttyd0   “/usr/libexec/getty std.38400″      vt100    on     secure

然后让init 进程重新读取一下配置文件:
#kill -HUP1

使用命令:ps aux |grep getty 来查看是否运行
输出中包含
root  24331  0.0  0.1  1288   800  d0  Is+   8:26PM   0:00.00 /usr/libexec/getty std.38400 ttyd0
表示ttyd0上已经有getty程序在监听。

然后,就可以使用串口线连接到服务器的COM1口,将波特率设置成38400,进行连接测试。需要说明的是:

  引用:
  如果 getty 进程确实在运行,但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入,您的终端或电缆可能不支持硬件握手。请尝试将 /etc/ttys 中的 std.38400 改为 3wire.38400 并一定能够记得在改完 /etc/ttys 之后 kill -HUP 1)。 3wire 记录和 std 类似,但忽略硬件握手。 您可能需要在使用 3wire 时减少波特率或启用软件流控制以避免缓冲区溢出。
  我的是HP DL380 G3的服务器,FreeBSD 5.4的系统,Cisco自带的串口线,和一个RJ-45到RS-232转换器,我的设置是这样的:
ttyd0   “/usr/libexec/getty 3wire.38400″      vt100    on     secure

  当是std.38400时无法正常通信。

  下面谈Linux系统。
  在Linux系统中,让串口上运行监听程序比在FreeBSD中在容易的多。
  大部分Linux发行版,在配置文件/etc/inittab中都已经包含了串口的getty配置信息,形似:
#S0:12345:respawn:/sbin/agetty -L 9600 ttyS0 vt100
只不过默认是注释掉的,把前面的“#”去掉,然后执行一下kill -HUP 1,ps aux |grep getty查看一下是否已经在运行,就可以了。可以看到,Linux中与FreeBSD中的串口设备命名是不一样的,不再赘述。

  建议把9600改成38400,这样操作起来就真得跟插上显示器键盘操作的感觉相似了。

  最后:

  这种使用串口访问系统方式,只有在getty程序运行在串口的时候才能正常使用,就是说系统必然是正常在运行的,尽管可能网络不通。假如出现文件系统 损坏需要修复的情况,串口就不能访问了,为了使串口在这种情况下也能使用,在Linux 中,可以在内核启动参数(kenel一行)中加入console=ttyS0,38400 ,这样会把内核console定义到ttyS0(COM1)上去。
  不用困惑,试一下就明白了,其实上目前流行的服务器像HP DL380 G4等都支持串口,就是说系统启动,硬件POST自检的时候,串口上都有输出,而且可以互动操作。但是不要误以为终端屏幕(VT100)上所有的显示都会 跟显示器(console)一样,Linux的话,从内核开始解压开始,终端上就没有任何信息了,除非内核接收到了console=ttyS0这样的参 数,否则,串口会一直到系统启动完毕,才会在终端上显示login信息。
  FreeBSD也可以让内核信息显示在串口上,甚至还可以在没有显示器,没有键盘的情况下从串口安装系统。这个在上面给出的FreeBSD手册串中通信中有详细的说明。