一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2466|回复: 1
收起左侧

linux 串口输出调试

[复制链接]
发表于 2016-11-19 21:28 | 显示全部楼层 |阅读模式
linux 串口输出调试* d( L$ d4 q- I9 J  k
在某些情况下,需要同时对两台或多台Linux主机进行管理和操作。如果手头缺少足够多的键盘和显示器,那么通过一台机器的串口对其余主机进行控制不失为一种快捷、有效的方法。
下面就以两台主机为例,简单介绍一下配置方法。假设这两台主机分别为A和B,它们都运行Red Hat 9.0。
A主机配置
A主机要选择一个合适的串口通信工具,本文中使用Linux自带的Minicom。
以root身份登录,运行如下命令:

1 [& F% ?$ h; |9 s
  # minicom -s
4 }# W' k1 n3 E0 ?5 ^$ a+ i+ q
屏幕上出现Minicom的主配置选单,移动键盘的方向键,选择“Serial Port Setup”选单项,会出现如下配置项:
- Q% g0 m) _9 p
  A - Serial Device : /dev/ttyS0
  B - Lockfile Location : /var/lock
  C - Callin Program :
  D - Callout Program :
  E - Bps/Par/Bits : 9600 8N1
  F - Hardware Flow Control : No
  G - Software Flow Control : No
  Change which setting?

4 t+ `. I& J! d2 m
按照需要配置如下参数:
◆ 串口设备 /dev/ttyS0;
◆ 波特率 9600;
◆ 帧格式 8N1(表示有8位数据、0位校验和1位停止位);
◆ 软、硬件流控 No。
注意,串口设备号可以根据所连接的端口进行更改,比如,连接到COM2口就设置为/dev/ttyS1。波特率的设定要与B主机一致。
配置完成后回到主配置选单,选择“Modem and Dialing”选单项,清除掉“A - Init string”、“B - Reset string”和“K - Hang-up string”选项的值。然后重新返回主选单,选择“Save As Dfl”选单项,保存为缺省设置。选择“Exit from Minicom”退出后,用如下命令重新启动Minicom:
# A* |* G# W- y( k
  # minicom
' u0 Z+ @) u' N( k% H9 e6 k. u
B主机配置
B主机需要修改以下几个文件。
1.修改/etc/inittab文件
该文件是init程序的配置文件,用于设置缺省状态和终端连接。在该文件中增加如下一行,用来初始化串口终端:
4 R( T# S1 ~1 P2 i' r! j
  tty:2345:respawn:/sbin/agetty ttyS0 9600 vt100
7 J3 G7 U- m& F  U3 u
“tty”为该行ID;“2345”指该行的运行级别是2、3、4、5级;“respawn”使命令退出后再执行一次,以便其它用户能够登录;“/sbin/agetty ttyS0 9600 vt100”表示具体的命令,该命令通过/sbin/agetty程序打开串口/dev/ttyS0(COM1),波特率设置为9600bps,终端模式为vt100。
重启主机B后,在A主机中会显示B主机的登录界面。但是,此时还有两个问题:一个是无法在A主机以root身份登录B;另一个是A中无法显示B主机启动和关闭过程的相关提示信息。后者是因为Linux启动时的信息都是由内核显示的,默认输出到系统主控制台(tty1)。要解决这两个问题,还需要修改/etc/securetty文件和/etc/lilo.conf文件。
2.修改/etc/securetty文件
该文件是一个被允许以root身份登录的tty设备列表,这些设备由/bin/login程序读取。为了使用户能以root身份通过串口登录,需要在该文件中添加“ttyS0”,告诉系统COM1是安全的。
3.修改/etc/lilo.conf文件
本文假设系统使用LILO启动。为了使LILO和内核的启动信息能够输出到串口,必须修改/etc/lilo.conf文件,在“linear”一行后添加“serial=0,9600n8”,把“append="root=LABEL=/"”改为“append="root=LABEL=/ console=ttyS0,9600"”。
serial选项使LILO的启动信息输出到串口,以便选择不同的系统或内核进行启动。其中,“0”表示串口使用COM1;“9600”表示波特率为9600bps;“n”表示无校验位;“8”表示有8位数据位。
“append="root=LABEL=/ console=ttyS0,9600"”的作用是向内核传递参数,使系统启动信息输出到串口COM1,波特率设为9600bps。修改完成后,重新运行一下LILO命令使配置生效。
至此,把键盘和显示器等外设连接在主机A上,主机A再通过串口连接主机B,就可以对B进行管理和控制了。所需的硬件就是一条串口线,当然还要求两台主机都具备串口。
利用串口终端作为Linux控制台,可以免去额外的键盘,显示卡和显示器,同时可将Linux主机作为一个任意用途的嵌入式黑匣。 将串口终端连接到计算机的串口上并不困难,可以参考Linux的HOWTO文档和以及inittab和agetty的帮助信息。这里扼要地说一下。 5 k" {$ x: }% R! s
  首先,准备好一根null modem 电缆.
3 M4 u5 t1 n' b) v  其次,在文件/etc/inittab 增加下面一行。[注:如果你不采用 agetty程序,采用其他的程序如like getty_ps ,应用正确的命令语法]
4 }2 v7 m! H2 B8 M( v   ID:RUNLEVELS:respawn:/sbin/agetty -L SPEED TTY TERM
3 d6 B( p( z/ V; K8 N$ Q: ^  这里: ID =两字母的标识符,如s1或s2。 . q( C: s( _- u
  RUNLEVELS = 终端激活的运行级别
: f8 r& {! ]: e5 r  SPEED = 串口端口速率 5 M0 Y! Y+ q* B: c0 b
  TTY = 串口的设备名 # p9 e; V; B4 D* x, Y  T
  TERM = TERM环境变量
* t, n5 o, V% H7 G) a# M  范例如下:   n3 y+ H$ E) h4 Q$ A
  s2:12345:respawn:/sbin/agetty -L 9600 ttyS1 vt100
5 T; K' |; ?0 u3 p. Z8 b  表示串口 /dev/ttyS1 (COM2 )速率为 9600 bps,终端模式为vt100。 2 d7 _) c* {3 s5 H/ ?) u: |  L( J0 Y
  最后,重新启动机器。
/ |6 K  L) C2 o  如正确地按照上述三步进行,则就可以在终端屏幕上出现Login: 的提示符。你可以登录进系统,并能象在实际的控制台上或从远程Telnet登录一样进行工作。
. r8 u7 \% r6 d  k  下面简单介绍一下如何终端设置成控制台,主要涉及内核信息、启动脚本信息和LILO信息。 中国网管联盟 ! I; S- O; w; e8 G- y
  z8 a4 k1 ^% w4 e; v6 i9 J
一、内核信息  f7 e8 u# y. J4 p

( f  P+ o8 \; y& M) p1 |; d  系统在启动时显示的信息总是输出到主控制台(tty1)。打开机器后,你只有等待Login: 出现在终端屏幕上,这意味着所有启动信息都无法获悉。你只有登录后用dmesg命令查看,但通常是想在login shell起来前看到这些信息。
+ q( @$ K6 D; B/ c  x+ ]0 P6 Z  还有其他信息出现在控制台上:/etc/rc.d目录下脚本命令执行时,启动和终止机器时运行的脚本命令等输出的信息。如果信息没有出现在屏幕上,怎样真正地知道"系统已终止"呢? 9 Z3 T  Y' s* A8 _, a" g# ]
  你必须修改源码/usr/src/linux/drivers/char/console.c[必须已安装了内核源码],这不是一个复杂得内核修改,按照下面三步进行:
9 l0 c' h4 x: E5 d5 M  首先,在程序前定义CONFIG_SERIAL_ECHO
6 e+ l0 u. o) F4 R) T- ^+ U  #define CONFIG_SERIAL_ECHO
7 K. Y6 L. t+ C& q4 q. y. Y& m  其次,修改串口地址 (仅当你使用得端口不同于默认定义的才有必要修改)。 0 L7 i3 C0 p9 R
  #define SERIAL_ECHO_PORT 0x3f8 /* COM1 */
# S0 p) p9 Z% Q* b& Y7 ?  ^9 V% q+ O  或者: : a# i7 s# S1 ^! U! y9 }  h1 r
  #define SERIAL_ECHO_PORT 0x2f8 /* COM2 */
: Z' x8 V: S; L. z8 e   第三,重新编译内核[请参考相应的手册],启动机器。在系统检测硬件设备时,你应该在终端屏幕上看到信息。 + E2 A1 y9 H* `- }7 ?6 W
   请注意 :console.c 补丁除了Alpha平台外,对所有的Linux 端口都是必要的。在Alpha平台上它是在运行make config ,选择下面的选项完成的:
www_bitscn_com

* U/ l* z# s, G* h# a* o) {$ K1 s   Echo console messages on /dev/ttyS1
5 G- u& {. L% {3 v; Q- O8 G
# {' c/ ^1 _/ c2 A; y二、/etc/rc.d/rc.*启动脚本信息
4 p% P; g2 Q- C9 ]( L  _
" l$ k9 H2 g" `  为了将这些信息显示在终端上,可以将这些文件中含有echo命令的行追加" > TTY "。 TTY 是终端的串口(与/etc/inittab 中串口终端行的一样)。 2 e# s6 b' X5 r" O  M0 T
$ q0 A& v8 s5 y
三、 LILO 配置  u' A. _7 t6 }4 U

' t' V( ~0 S; G5 C  如果想选择两个内核之一启动,你必须修改LILO 配置文件,/etc/lilo.conf。配置LILO,使提示信息出现在终端上,可以参考/usr/doc/lilo/README 文件 (查看SERIAL选项)。 这里给出两步正确设置的步骤:   m) J( z' F7 j5 M
  首先,编辑/etc/lilo.conf file ,在BOOT选项行后,插入一个SERIAL选项 。 " a6 |6 ~7 _. U( S' V* T
serial=SERIAL_LINE,SPEED PARITY BITS
8 ~! S* ?; x# o' y: @: w, ?  这里:
5 l7 a  G7 C+ m  SERIAL_LINE = 0 (串口1) & R6 ?5 G# `5 n0 l- g- n8 |
          1 (串口2) 0 f7 w) g! p3 v* a# Z
         2 (串口3)
1 [$ `# f. {6 g, a3 J4 E$ {) S) x4 ^         3 (串口4) 8 i. D: p- L3 w: ]) U) r
  SPEED = 串口速度 ! V9 m, o/ @! U$ ]( ^0 l/ e3 v7 ?
  PARITY = n (=无)
2 x2 U& `2 }" R5 j3 c# [" }: l! o       o (= 奇校验)
4 Z: {1 h2 N! E. s# B' R- y       e (= 偶校验)
, c. R: r. m0 m$ v! g  BITS = 数据位(8 or 7)
3 r4 \: L3 N  Z7 s2 d/ Q  请注意:在SPEED, PARITY 和BITS参数间没有空格。这些参数必须与在terminal 设置时的参数一样。下面是LILO 配置的示例: 3 B  s) i- u. |3 }" q
  serial=1,9600n8 + x* z. p3 \6 |1 ~- c8 t" F) b
  这一行表示COM2 ,速率9600bps,无校验位,数据位8。 www.bitsCN.com
0 F7 I4 o6 B( m  第二,运行lilo 命令,刷新系统配置。 9 g, ]. k! V2 S4 q! _5 C
  利用SERIAL 选项, LILO 在启动默认内核前,设置了2秒的延迟 。在这期间,你可以 在终端上按"SHIFT"键发送一个终止信号,终止boot进程,并取得LILO提示信息。 / f+ v% E3 x' H( ~; `4 K7 N
  完成上述配置后,你的终端就可以作为一个控制台了。有一件事不能做的是用CTRL-ALT-DEL 重启动系统。% {& P6 C/ q( l% x
grub 串口
' u# }7 t0 v8 z, v" X% P" S7 H2007-03-23 20:03
- M# {/ k: m, `% Q$ Z# x# z8 F: G$ [  a
t1:2345:respawn:/sbin/agetty -L ttyS0 115200 vt220
& ^# O, I" {+ D& h' F! }% M0 h. ^default=06 y5 d4 p5 F3 C. |5 z3 R3 g. ~
timeout=2
& E! e6 \1 g5 ?( r$ zserial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
$ n8 m4 t" w. Q! g5 hterminal --timeout=5 serial console
% Z3 z. d  z) q5 jsplashimage=(hd0,0)/grub/splash.xpm.gz
; B( b5 [. `/ D1 Htitle Red Hat Linux (2.4.20-8) monitor
, k  f. o* M6 ?7 Z& c) Z" k4 a         root (hd0,0)( m  L, a8 I# i
         kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ console=ttyS0 console=tty0
- J- H6 p$ I3 x         initrd /initrd-2.4.20-8.img
- {! l* _! v) d, }  [# atitle Red Hat Linux (2.4.20-8) serial console
5 _2 Q: V& J) }2 [# C% \         root (hd0,0)% C0 h, ^5 S; @; [, ?
         kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ console=tty0 console=ttyS0
( l2 b3 z* i6 U/ m' f/ X1 A8 k         initrd /initrd-2.4.20-8.img
5 v9 S) i  L& k$ o% y0 a4 vtitle Red Hat Linux (2.4.20-8)$ o+ c5 w& {3 ^0 d
         root (hd0,0)9 Y( Z; f5 F; R
         kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
: \- M4 Z& l9 @0 I1 w- U         initrd /initrd-2.4.20-8.img9 c% @& l/ o. ], N; K- s  H& E
* x  s& l1 P- J3 K7 P, J. w
如何在红帽企业Linux下设置串口终端?2007-9-25 17:59:00查看学习心得( y0 O, G& _8 ~$ m
5 r) b3 N8 y1 p
在某些情况下,出于调试的目的需要给linux配置串口控制台,或者linux根本没有显卡,也需要配置串口终端。一个串口控制台将发送所有的终端显示到串口,而串口终端则可以实现通过串口登录到系统。你可以同时设置两个或者其中一个。
' O( e& O& [$ f/ Z为了控制内核输出所有控制台消息到串口,你需要在时向内核传递参数console=ttyS0,这可以通过GRUB来实现,下面的例子会将控制台消息发送到tty0(显示器控制台)和ttyS0(串口1),发送到串口控制台的速度为115200,但是需要注意的是一种类型设备只能定义一个控制台,例如不能把消息同时发送到串口1和串口2,编辑/boot/grub/grub.conf,添加如下内容:  c8 h, }- l4 O( r8 U; T2 A( b

6 A: k, l  R- ~5 f7 o3 d% pconsole=ttyS0,115200 console=tty09 q) X3 @& K5 z1 v7 N+ Q
例如:
8 o% T- C% h$ V# r0 L: R' U$ U* H' s( F. s; V
# cat /boot/grub/grub.conf# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/hda2# initrd /initrd-version.img#boot=/dev/hdadefault=0timeout=10splashimage=(hd0,0)/grub/splash.xpm.gztitle Red Hat Enterprise Linux AS (2.4.21-27.0.2.ELsmp) root (hd0,0) kernel /vmlinuz-2.4.21-27.0.2.ELsmp ro root=LABEL=/ console=ttyS0,115200 console=tty0 initrd /initrd-2.4.21-27.0.2.ELsmp.img
$ j6 f% D+ @( N串口终端 为了设置一个串口终端,需要为串口衍生(spawn)一个agetty,在/etc/inittab添加如下内容: co:2345:respawn:/sbin/agetty ttyS0 115200 vt100 init q 例如:
  ?% [  Z( E! J) u9 n5 ?# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6co:2345:respawn:/sbin/agetty ttyS0 115200 vt100 init q
/ w3 B4 q( O" |1 n也可以在/etc/securetty文件中添加串口设置,这样才可以以root身份从串口登录,在该文件最后添加一行,内容为4 h8 @5 |& @9 j8 @" C# T7 y8 E
" @* b7 m" l; @4 x: e, t% u
ttyS01 F/ _9 d0 J( @8 u

8 r; f; k) Z1 L(如果不添加此行,则登录时会不能输入密码。)! X3 j+ B  f8 a; f  N

6 W3 r, t1 G+ Z, Z; K$ G$ Q! X7 q4 c; q2 f) t! C
发表于 2016-11-19 23:00 | 显示全部楼层
谢谢共享。# q; y5 z, p% C& d0 |2 c8 B
除非调试,喜欢ssh

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-27 08:47 , Processed in 0.054357 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表