为Linux系统配置serial console

原文:

《RemoteSerialConsoleHOWTO》:

http://www.linux.com/learn/docs/ldp/714-Remote-Serial-Console-HOWTO

TranslateByBob

Email[email protected]

Friday,July15,2011

根据我的环境(Redhat9Grub0.93),翻译了我需要的部分。原文还有针对LiloSyslinux的配置说明。

该文档的PDF版本下载:http://download.csdn.net/source/3462563

1.准备工作

1.1.关于serialconsole

Console是一个输出系统管理信息的文本输出设备,这些信息来自于内核,系统启动和系统用户,serialconsole就是串口作为输出终端设备,是这些信息可以通过串口在远程的终端上显示。

配置一个serialconsole大致包括五项内容:

Ø配置BIOS使用serialconsole(可选);

Ø配置Bootloader使用serialconsole(可选);

Ø配置内核使用serialconsole

Ø在系统启动时运行一个支持serialconsole登录的程序

Ø一些其他系统配置,使这些功能支持serialconsole,或者防止它们扰乱serialconsole

1.2.串口线

使用RS232方式的DB9串口线,信号连接如下:

Signalground------------------Signalground

Receivedata------------------Transmitdata

Transmitdata------------------Receivedata

Readytosend------------------Cleartosend

Cleartosend------------------Readytosend

ataterminalready-------------+---Datacarrierdetect

|

+---Datasetready

Datacarrierdetect----+----------------Dataterminalready

|

Datasetready-----+

1.3.串口参数的设置

选择的串口是COM1,设备名为ttyS0,波特率为9600,8位数据位,无奇偶校验,1位停止位。

2.配置BIOS

有些BIOS支持serialconsole,可以在serialconsole显示BIOS启动信息,这需要在BIOS中配置。

3.配置Bootloader

LILOGRUBSYSLINUX都支持serialconsole

3.1.GRUB的配置

GRUB的配置文件是/boot/grub目录下的grub.conf,在配置文件的开始处添加:

serial--unit=0--speed=9600--word=8--parity=no--stop=1

terminal--timeout=10serialconsole

Serial命令用于设置串口的参数:

--unit:串口设备,0就表示ttyS0,如果是ttyS1就要设为1

--speed:波特率;

--work:数据位;

--parity:奇偶校验位;

--stop:停止位。

Terminal命令用于设置终端的类型

--timeout:等待时间,单位是秒

4.配置Kernel

Kernelconsole类型可以通过console参数选择,console配置的语法如下:

console=ttyS[,]
console=tty
console=lp
console=ttyUSB[[,]

其中的ttyS就是串口设备,mode表示串口的参数;tty表示虚拟终端。

每个console类型指南设置一个设备,例如,可以设置为console=tty0console=lp0console=ttyS0,但是设为console=ttyS0console=ttyS1就是错误的。

如果没有设置console参数,内核默认使用虚拟终端,即tty0,使用组合键Ctrl+Alt+F1可以切换到tty0。如果你的电脑有显示设备,最好将它设为console,即console=tty0

根据我的设备情况可以设置为:

console=tty0console=ttyS0,9600n8

Console参数需要用bootloader在内核启动时传递给内核,对于GRUB,需要修改grub.conf文件,将参数添加到kernel命令后面即可,例如;

title Red Hat Linux (2.4.9-21) root (hd0,0) kernel /vmlinuz-2.4.9-21 ro root=/dev/hda6 console=tty0 console=ttyS0,9600n8 initrd /initrd-2.4.9-21.img

5.配置getty

getty会监控和等待一个连接,然后配置串口连接,发送/etc/issue的内容,并且要求输入登录名和密码,然后开始登录,如果登录失败,getty会返回等待状态。

getty的另一项工作是设置TERM变量的值,以指定所连接的终端的类型。

常用的getty有四个版本:

getty:传统的getty,需要配置文件/etc/gettydefs

agetty:无需配置文件,直接通过命令行传递参数

mgetty:支持modemgetty,需要配置文件

minigetty:精简版的getty,不支持serialconsole

RedHat9自带agettymgetty,在/etc/inittab文件中默认使用mgetty,在该文件中添加:

co:2345:respawn:/sbin/agetty -h -t 60 ttyS0 9600 vt102

-t60:60秒内无操作,agetty将会返回等待状态。

-h:使用硬件流控制(CTS/RTS握手)

6.其他配置

6.1.让root可以通过serialconsole登录

配置文件/etc/securetty用于管理root用户可以登录的设备,将serialconsole的设备名添加到该文件,即可使root用户通过serialconsole登录。

为了安全性,我们通常root用户在远程登录,而是用普通用户登录,然后用susudo命令切换到root

6.2.将启动基本改为文本方式

这个只针对在没有屏幕的服务器上运行X-Window系统,编辑/etc/inittab文件中包含initdefault的那一行,例如:

id:5:initdefault:

改为

id:3:initdefault:

如果连接了键盘和显示器,可以用start命令启动X-Window

6.2.1.配置为运行X

有时,一台有serialconsole却没有连接显示器的电脑依然需要运行X-Window,例如,这台电脑连接有X终端。

这种情况下,计算机还是需要运行在第5级,但是不能为显示器运行X-server。修改/etc/X11/xdm/Xservers,删除所有以冒号开头的行,例如:

:0 local /usr/X11R6/bin/X

如果操作系统使用的是GNOME,那就要修改它的配置文件/etc/X11/gdm/gdm.conf,删除[servers]段中的所有本地X-Server的条目,例如:

[servers] 0=/usr/bin/X11/X

6.3.删除已有的console设置

/etc/ioctl.save包含了单用户模式中使用的串口和终端的特性,这些特性通常是有getty来设置的——在没用getty运行的单用户模式下,这个文件的内容被用来设置串口和终端。

因为我们已经改变了console,已有的设置已经不正确了,所以要删除这个文件:

rm -f /etc/ioctl.save

一旦我们可以从serialconsole登录,我们会重建这个文件。

6.4.serialconsole不是/dev/modem

很多Linux会将/dev/modem链接到一个包含可用modem的串口设备。

虽然serialconsole是一个带有modem的串口,但是我们真的不希望它被用作一个呼叫设备。

检查/dev/modem是否指向了那个用做console的串口,如果是,将它删除。

bash$ ls -l /dev/modem lrwxrwxrwx 1 root root 10 Jan 01 00:00 /dev/modem -> /dev/ttyS0 bash# rm /dev/modem

6.5.更改/dev/systty的目标

很多Linux/dev/systty链接到了键盘和显示器所使用的那个终端设备。

如果计算机没有连接键盘和显示器,或者不想给键盘和显示器提供一个文本终端,那就修改/dev/systty,使它指向serialconsole

相对于修改链接,修改MAKEDEV使用的配置文件更好,这样会重建链接。配置文件位于/dev/makedev.d目录下,默认配置指向第一个虚拟终端:

l systty tty0

修改它,使systty指向用作console的串口:

bash# cd /etc/makedev.d bash# fgrep systty * linux-2.4.x:l systty tty0 bash# vi linux-2.4.x

systty那一行改为:

l systty ttyS0

然后根据新定义重建/dev/systty:

bash# cd /dev bash# rm systty bash# ./MAKEDEV systty

6.6.配置可拔插认证模块

可拔插认证模块系统被用于向用户提供通过console登录系统的特权,它使得设备像软盘那样可以由console用户挂载,通常情况下,挂载磁盘需要超级用户权限。

PAM配置文件/etc/security/console.perms包含变量,对于连接了键盘显示器的系统,默认的变量为:

=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]\.[0-9] :[0-9]

在该文件的后面部分,console用户被赋予了使用一些设备的权限,设备权限的修改会在登录或退出后生效。

console.perms文件中默认的设备列表如下:

0660 0660 root.floppy 0600 0600 root 0600 0660 root.disk 0600 0660 root.uucp 0600 0660 root.disk 0600 0660 root.disk 0600 0660 root.disk 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0700 0700 root 0600 0600 root 0600 0600 root

以上被列出的设备分为两种:一些设备需要来自键盘和显示器的连接,而另一些设备可以方便的连接,这个配置文件无法区分逻辑console和物理console,可通过修改文件来区分二者。

需要键盘和显示器连接的设备如下:

0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0700 0700 root

其余的设备要修改为通过serialconsole来控制。例如,我们不想要一个处于托管位置的非特权用户去挂载软盘。为serialconsole定义一个新的console类型,叫做,将它添加到console.perms

=ttyS0

然后将其他设备的改为,使它们指向serialconsole:

0660 0660 root.floppy 0600 0600 root 0600 0660 root.disk 0600 0660 root.uucp 0600 0660 root.disk 0600 0660 root.disk 0600 0660 root.disk 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root 0600 0600 root

6.7.针对RedHat的配置

RedHat将一些系统初始化所需的参数存放在/etc/sysconfig/init

修改BOOTUP参数,使用独立终端命令写OKPASSEDFAULT信息,这些信息将不再显示为绿色、黄色或红色。/etc/sysconfig/init文件的注释说,除了color,还可以设置其他的值,但是,BOOTUP必须被设为serial

修改PROMPT参数,禁止交互启动。

/etc/sysconfig/init的修改如下:

BOOTUP=serial PROMPT=no

RedHat会运行一个用于发现硬件设备的程序,叫做kudzu。当发现一个串口时,kudzu会将其复位,这将停止serialconsolekudzu的配置文件是/etc/sysconfig/kudzu

将配置文件中的SAFE设为yes,就会阻止kudzu复位设备。

修改/etc/sysconfig/kudzu:

SAFE=yes

7.重启测试

7.1.验证console操作

有可能的话,在串口上接一个串口接线盒。在重启的过程中,DTR信号会被激活,出现console信息时,数据指示灯会闪烁。在里一台电脑上配置好终端,重启计算机。

重启过程中,在终端界面可以看到bootloader的启动信息,然后是kernel启动,系统初始化输出,最后会显示/etc/issue的内容,并且getty要求你登录。

如果没有看到login信息,可能会提示按下ReturnEnter键。

7.2.重建console设置

root用户登录serialconsole。前面我们删除了/etc/ioctl.save,现在要重新配置console,波特率为9600,8位数据位,无奇偶校验,1位停止位。

remote.example.edu.au ttyS0 login: root Password: … sh# rm -f /etc/ioctl.save bash# telinit 1 …Telling INIT to go to single user mode. INIT: Going single user INIT: Sending processes the TERM signal sh# stty sane -parenb cs8 crtscts brkint -istrip -ixoff -ixon

结束单用户模式返回正常运行级别后,serialconsole的终端配置会保存到/etc/ioctl.save

sh# exit ... bash# ls -l /etc/ioctl.save -rw------- 1 root root 60 Jan 1 00:00 /etc/ioctl.save

当系统以单用户模式启动后,会使用/etc/ioctl.save

附录:

我的平台:

两台PC,一个安装Redhat9bootlloaderGrub0.93,另一个安装WindowsXP,用超级终端作为serialconsole显示设备,用DB9头的串口通信线将二者COM1相连,只将两端的TXRX信号交叉相连,其他信号都直连。

操作步骤:

1)修改/boot/grub/grub.conf

添加:

serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1 terminal --timeout=10 serial console

kernel后面添加参数:

console=tty0 console=ttyS0,9600n8

2)修改/etc/inittab

添加:

co:2345:respawn:/sbin/agetty -t 60 ttyS0 9600 vt100

3)在XP系统上打开超级终端,波特率为96008位数据位,1位停止位,无奇偶校验,无数据流控制。然后重启Redhat9,在超级终端上即可看到内核和文件系统的启动信息,最后可以用普通用户登录,登录后可以用suroot命令切换到root用户。这里有个问题还未解决,文件系统的信息只能在超级终端上显示,在Redhat9的屏幕上显示完内核启动信息后就暂停输出了,最后直接显示登录信息,待解决。

4)如果想让root用户通过serialconsole登录,需要修改/etc/securetty,在该文件的最后一行添加ttyS0,重启后即可在超级终端用root用户登录。

5)其他设置暂未测试。



你可能感兴趣的:(为Linux系统配置serial console)