一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

linux 串口输出调试

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

1 G7 ~% i1 h1 j/ N$ K9 n" C# K
  # minicom -s
* x5 h, d& N  S0 N8 O$ q
屏幕上出现Minicom的主配置选单,移动键盘的方向键,选择“Serial Port Setup”选单项,会出现如下配置项:

  s5 r# x$ b5 T% m( H" `
  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?

) |2 k9 K, q( l) I7 M" e
按照需要配置如下参数:
◆ 串口设备 /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:
; [/ W. z' Y4 D0 a
  # minicom
  P5 g8 o$ e) m: ]8 x, H, X' S6 t
B主机配置
B主机需要修改以下几个文件。
1.修改/etc/inittab文件
该文件是init程序的配置文件,用于设置缺省状态和终端连接。在该文件中增加如下一行,用来初始化串口终端:
$ J* ]9 _  \) y. t, X- T7 R
  tty:2345:respawn:/sbin/agetty ttyS0 9600 vt100
- H3 g( e* i3 M# P# E; A
“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的帮助信息。这里扼要地说一下。
. g, f. @) r1 Q. L. G1 A, N  首先,准备好一根null modem 电缆.   d+ r. G0 }' g4 M
  其次,在文件/etc/inittab 增加下面一行。[注:如果你不采用 agetty程序,采用其他的程序如like getty_ps ,应用正确的命令语法] ' K- G" M5 G, k9 `: {: f' O
   ID:RUNLEVELS:respawn:/sbin/agetty -L SPEED TTY TERM + ^0 b5 B9 v( e& p, o
  这里: ID =两字母的标识符,如s1或s2。 2 D( Z3 ~. l* t6 y
  RUNLEVELS = 终端激活的运行级别
+ o3 j' ~/ J) A, ~/ V- e  SPEED = 串口端口速率
4 W, q! g3 [9 C  TTY = 串口的设备名 & y7 H2 F: r" U7 x% B  h
  TERM = TERM环境变量 . z* Q1 `' w0 l
  范例如下: ) L% o1 b7 h6 e' i+ m
  s2:12345:respawn:/sbin/agetty -L 9600 ttyS1 vt100
( t) f, |' F$ o  ~) ?6 D; `( `  表示串口 /dev/ttyS1 (COM2 )速率为 9600 bps,终端模式为vt100。
5 s0 j8 x0 P/ V; W, c2 v  最后,重新启动机器。 + m# R( f% l# h) l$ ~9 |
  如正确地按照上述三步进行,则就可以在终端屏幕上出现Login: 的提示符。你可以登录进系统,并能象在实际的控制台上或从远程Telnet登录一样进行工作。 ' A9 l9 j7 @2 F8 r: j
  下面简单介绍一下如何终端设置成控制台,主要涉及内核信息、启动脚本信息和LILO信息。 中国网管联盟 & N% G" E% w" j! q! Q1 z
- b9 m# B$ K# e1 p, _
一、内核信息
. R1 K6 |, `' T7 u' [" h# ~- G/ g# W* A) j9 H
  系统在启动时显示的信息总是输出到主控制台(tty1)。打开机器后,你只有等待Login: 出现在终端屏幕上,这意味着所有启动信息都无法获悉。你只有登录后用dmesg命令查看,但通常是想在login shell起来前看到这些信息。
+ m# d; \4 R! m3 t3 Y+ @' W% p  还有其他信息出现在控制台上:/etc/rc.d目录下脚本命令执行时,启动和终止机器时运行的脚本命令等输出的信息。如果信息没有出现在屏幕上,怎样真正地知道"系统已终止"呢? 4 I6 i( _% \) r0 l
  你必须修改源码/usr/src/linux/drivers/char/console.c[必须已安装了内核源码],这不是一个复杂得内核修改,按照下面三步进行: , p! W# k. A8 P. X  n& e
  首先,在程序前定义CONFIG_SERIAL_ECHO
* y* {+ H4 e1 Y4 {  #define CONFIG_SERIAL_ECHO
( M% V* h+ S& I. p  其次,修改串口地址 (仅当你使用得端口不同于默认定义的才有必要修改)。
& f' o3 `- @: m- @$ w5 m  #define SERIAL_ECHO_PORT 0x3f8 /* COM1 */
/ B* e+ z) T- X* {  或者:
9 q) n% r& ~0 U/ q8 G  #define SERIAL_ECHO_PORT 0x2f8 /* COM2 */
; l! U5 J$ e. O$ _& Z   第三,重新编译内核[请参考相应的手册],启动机器。在系统检测硬件设备时,你应该在终端屏幕上看到信息。 8 {( b1 [) ^% J2 I
   请注意 :console.c 补丁除了Alpha平台外,对所有的Linux 端口都是必要的。在Alpha平台上它是在运行make config ,选择下面的选项完成的:
www_bitscn_com
4 A. c7 l( }( `: }
   Echo console messages on /dev/ttyS1
: D* {4 K: ]" Y3 f
4 v7 y! p' I0 S二、/etc/rc.d/rc.*启动脚本信息
$ S  }* Z' ~* m( \2 T1 Y8 R0 Y
" z9 \" c: v& J, _  为了将这些信息显示在终端上,可以将这些文件中含有echo命令的行追加" > TTY "。 TTY 是终端的串口(与/etc/inittab 中串口终端行的一样)。 ) @& h9 H1 {0 f; {0 j' {; u" B# X

5 Y9 r5 R; f. `0 `8 F$ m三、 LILO 配置  {) H# B- V* j% Q
9 C7 [1 X. c- p5 o: @$ v/ G, R
  如果想选择两个内核之一启动,你必须修改LILO 配置文件,/etc/lilo.conf。配置LILO,使提示信息出现在终端上,可以参考/usr/doc/lilo/README 文件 (查看SERIAL选项)。 这里给出两步正确设置的步骤:
3 J2 b$ G) q' s; B  首先,编辑/etc/lilo.conf file ,在BOOT选项行后,插入一个SERIAL选项 。
% J/ b  L5 b6 I) k8 B" Y3 {serial=SERIAL_LINE,SPEED PARITY BITS $ `: C1 j; y7 ?# q3 m* u
  这里: - m, g" E5 A% ]1 K. Q$ `
  SERIAL_LINE = 0 (串口1)
) k# a% \# ?* I3 g; J, K          1 (串口2)
) E  d/ R% U& a3 P$ X1 o         2 (串口3)
1 l( |' _9 v+ v, Y/ w. n         3 (串口4) 2 `  M, Y, ^- z2 z  |! u
  SPEED = 串口速度   O; C7 p& m* |8 J% Z
  PARITY = n (=无)
  x* |! B  V" B2 u) d* g, g' P: u3 F       o (= 奇校验) # r' i: p4 f0 @5 f* ]' x
       e (= 偶校验)
1 ]: u7 \$ f& s: x0 F; X5 m1 r  BITS = 数据位(8 or 7)
" e! x& J( L, |3 f  请注意:在SPEED, PARITY 和BITS参数间没有空格。这些参数必须与在terminal 设置时的参数一样。下面是LILO 配置的示例: 6 m- B7 N5 h* C$ ~: p0 P
  serial=1,9600n8 , E. [) b* Q& u& Q5 k
  这一行表示COM2 ,速率9600bps,无校验位,数据位8。 www.bitsCN.com 0 _2 S% J7 d) S2 _) c; v: @
  第二,运行lilo 命令,刷新系统配置。 7 @( m! F' `5 y4 {8 `- `: g+ {
  利用SERIAL 选项, LILO 在启动默认内核前,设置了2秒的延迟 。在这期间,你可以 在终端上按"SHIFT"键发送一个终止信号,终止boot进程,并取得LILO提示信息。   T4 w; R* i! V* }& }! j/ e- \
  完成上述配置后,你的终端就可以作为一个控制台了。有一件事不能做的是用CTRL-ALT-DEL 重启动系统。
& o3 F# }! }7 J- xgrub 串口7 z! v. c% M4 U4 L0 _
2007-03-23 20:03
9 C$ u& ^  Q+ _" z) h& o. j6 H6 r! S
t1:2345:respawn:/sbin/agetty -L ttyS0 115200 vt220
& x5 K1 P4 K/ F2 t$ Odefault=0
! z, v! s; z6 e, E* atimeout=2
5 M3 W$ S( L# S! e2 H3 [serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
( S5 X0 D4 X& G7 G) Z& O" Wterminal --timeout=5 serial console+ u: |$ ]  g/ c  f0 F! O, Y- R% p2 ]
splashimage=(hd0,0)/grub/splash.xpm.gz
5 F" ^$ _+ W3 u' e) Etitle Red Hat Linux (2.4.20-8) monitor
3 W8 `: ~0 R! P         root (hd0,0)* S; S1 \0 |; B5 l1 h7 S4 Q0 P2 S
         kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ console=ttyS0 console=tty08 k3 s# @' G; w% Q; W4 ~# E# `
         initrd /initrd-2.4.20-8.img6 E* J! t1 y& `
title Red Hat Linux (2.4.20-8) serial console
* ?4 S1 o7 D9 q- N' G  R2 L/ W         root (hd0,0)3 I2 e, j& n- l
         kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ console=tty0 console=ttyS0
* V: O$ n# \8 M. ?4 v0 m; a- ~" _         initrd /initrd-2.4.20-8.img3 g. Z3 x7 \& L; v
title Red Hat Linux (2.4.20-8)
$ G- H" A# S9 T& j7 a         root (hd0,0)
) z% V0 m: [2 b# l% j         kernel /vmlinuz-2.4.20-8 ro root=LABEL=/4 ]# g: M0 V- ]
         initrd /initrd-2.4.20-8.img; x; G4 a' Z1 d9 F- q6 A

3 K* O+ j& j# a
如何在红帽企业Linux下设置串口终端?2007-9-25 17:59:00查看学习心得
4 s: Y8 s% K' S6 z3 w9 N9 I
/ V( ^, Y1 i% h2 J% `+ R在某些情况下,出于调试的目的需要给linux配置串口控制台,或者linux根本没有显卡,也需要配置串口终端。一个串口控制台将发送所有的终端显示到串口,而串口终端则可以实现通过串口登录到系统。你可以同时设置两个或者其中一个。. ?! F$ e! u: C% n
为了控制内核输出所有控制台消息到串口,你需要在时向内核传递参数console=ttyS0,这可以通过GRUB来实现,下面的例子会将控制台消息发送到tty0(显示器控制台)和ttyS0(串口1),发送到串口控制台的速度为115200,但是需要注意的是一种类型设备只能定义一个控制台,例如不能把消息同时发送到串口1和串口2,编辑/boot/grub/grub.conf,添加如下内容:) {) Q6 _& X' Y8 ^; N( T+ H& k

" X5 P& V) E, Q  yconsole=ttyS0,115200 console=tty0* C" O  d- B% h( V8 ]* X( j9 n
例如:
1 \  b8 @- s3 Z' y% ?& k% t9 @
% C4 Z. J. k8 |# 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
/ e# J' D0 I5 Y& X. }& S串口终端 为了设置一个串口终端,需要为串口衍生(spawn)一个agetty,在/etc/inittab添加如下内容: co:2345:respawn:/sbin/agetty ttyS0 115200 vt100 init q 例如:
7 y+ w. ~3 ~' X: R# H# A7 N# 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& ?2 n$ H$ u# |( y( D1 g+ Q% w
也可以在/etc/securetty文件中添加串口设置,这样才可以以root身份从串口登录,在该文件最后添加一行,内容为
+ x4 Y! u, k8 z* G5 o6 J  I0 k# x0 _# N. x  Y* p. z1 b. f
ttyS0
" ]! A  V4 o; X  K# H$ ^# M& @7 A4 Y$ r
(如果不添加此行,则登录时会不能输入密码。); X: g" G  Y/ K2 _! j

- D; ?9 v' L9 |1 P: W
, d' o/ d& v) D% ?+ I- N
发表于 2016-11-19 23:00 | 显示全部楼层
谢谢共享。
5 x9 [" D5 _2 v6 C1 L8 V# u除非调试,喜欢ssh

本版积分规则

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

GMT+8, 2024-5-3 10:30 , Processed in 0.073552 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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