1. 准备工作
1.1. 关于serial console
Console是一个输出系统管理信息的文本输出设备,这些信息来自于内核,系统启动和系统用户,serial console就是串口作为输出终端设备,是这些信息可以通过串口在远程的终端上显示。
配置一个serial console大致包括五项内容:
? 配置BIOS使用serial console(可选);
? 配置Bootloader使用serial console(可选);
? 配置内核使用serial console
? 在系统启动时运行一个支持serial console登录的程序
? 一些其他系统配置,使这些功能支持serial console,或者防止它们扰乱serial console
1.2. 串口线
使用RS232方式的DB9串口线,信号连接如下:
Signal ground —————— Signal ground
Receive data —————— Transmit data
Transmit data —————— Receive data
Ready to send —————— Clear to send
Clear to send —————— Ready to send
ata terminal ready ————-+— Data carrier detect
|
+— Data set ready
Data carrier detect —-+—————- Data terminal ready
|
Data set ready —–+
1.3. 串口参数的设置
选择的串口是COM1,设备名为ttyS0,波特率为9600,8位数据位,无奇偶校验,1位停止位。
2. 配置BIOS
有些BIOS支持serial console,可以在serial console显示BIOS启动信息,这需要在BIOS中配置。
3. 配置Bootloader
LILO、GRUB和SYSLINUX都支持serial console。
3.1. GRUB的配置
GRUB的配置文件是/boot/grub目录下的grub.conf,在配置文件的开始处添加:
serial –unit=0 –speed=9600 –word=8 –parity=no –stop=1
terminal –timeout=10 serial console
Serial命令用于设置串口的参数:
–unit:串口设备,0就表示ttyS0,如果是ttyS1就要设为1;
–speed:波特率;
–work:数据位;
–parity:奇偶校验位;
–stop:停止位。
Terminal命令用于设置终端的类型
–timeout:等待时间,单位是秒
4. 配置Kernel
Kernel的console类型可以通过console参数选择,console配置的语法如下:
console=ttyS<serial_port>[,<mode>]
console=tty<virtual_terminal>
console=lp<parallel_port>
console=ttyUSB[<usb_port>[,<mode>]
其中的ttyS就是串口设备,mode表示串口的参数;tty表示虚拟终端。
每个console类型指南设置一个设备,例如,可以设置为console=tty0 console=lp0 console=ttyS0,但是设为 console=ttyS0 console=ttyS1就是错误的。
如果没有设置console参数,内核默认使用虚拟终端,即tty0,使用组合键Ctrl+Alt+F1可以切换到tty0。如果你的电脑有显示设备,最好将它设为console,即console=tty0。
根据我的设备情况可以设置为:
console=tty0 console=ttyS0,9600n8
Console参数需要用bootloader在内核启动时传递给内核,www.linuxidc.com对于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:支持modem的getty,需要配置文件
minigetty:精简版的getty,不支持serial console
RedHat9自带agetty和mgetty,在/etc/inittab文件中默认使用mgetty,在该文件中添加:
- co:2345:respawn:/sbin/agetty -h -t 60 ttyS0 9600 vt102
-t 60 : 60秒内无操作,agetty将会返回等待状态。
-h : 使用硬件流控制(CTS/RTS握手)
6. 其他配置
6.1. 让root可以通过serial console登录
配置文件/etc/securetty用于管理root用户可以登录的设备,将serial console的设备名添加到该文件,即可使root用户通过serial console登录。
为了安全性,我们通常root用户在远程登录,而是用普通用户登录,然后用su或sudo命令切换到root。
6.2. 将启动基本改为文本方式
这个只针对在没有屏幕的服务器上运行X-Window系统,编辑/etc/inittab文件中包含initdefault的那一行,例如:
id:5:initdefault:
改为
- id:3:initdefault:
如果连接了键盘和显示器,可以用start命令启动X-Window。
6.2.1. 配置为运行X
有时,一台有serial console却没有连接显示器的电脑依然需要运行X-Window,例如,这台电脑连接有X终端。
这种情况下,计算机还是需要运行在第5级,www.linuxidc.com但是不能为显示器运行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
一旦我们可以从serial console登录,我们会重建这个文件。
6.4. serial console不是/dev/modem
很多Linux会将/dev/modem链接到一个包含可用modem的串口设备。
虽然serial console是一个带有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,使它指向serial console。
相对于修改链接,修改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包含<console>变量,对于连接了键盘显示器的系统,默认的<console>变量为:
- <console>=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]\.[0-9] :[0-9]
在该文件的后面部分,console用户被赋予了使用一些设备的权限,设备权限的修改会在登录或退出后生效。
console.perms文件中默认的设备列表如下:
- <console> 0660 <floppy> 0660 root.floppy
- <console> 0600 <sound> 0600 root
- <console> 0600 <cdrom> 0660 root.disk
- <console> 0600 <pilot> 0660 root.uucp
- <console> 0600 <jaz> 0660 root.disk
- <console> 0600 <zip> 0660 root.disk
- <console> 0600 <ls120> 0660 root.disk
- <console> 0600 <scanner> 0600 root
- <console> 0600 <camera> 0600 root
- <console> 0600 <memstick> 0600 root
- <console> 0600 <flash> 0600 root
- <console> 0600 <fb> 0600 root
- <console> 0600 <kbd> 0600 root
- <console> 0600 <joystick> 0600 root
- <console> 0600 <v4l> 0600 root
- <console> 0700 <gpm> 0700 root
- <console> 0600 <mainboard> 0600 root
- <console> 0600 <rio500> 0600 root
以上被列出的设备分为两种:一些设备需要来自键盘和显示器的连接,而另一些设备可以方便的连接,这个配置文件无法区分逻辑console和物理console,可通过修改文件来区分二者。
需要键盘和显示器连接的设备如下:
- <console> 0600 <fb> 0600 root
- <console> 0600 <kbd> 0600 root
- <console> 0600 <joystick> 0600 root
- <console> 0600 <v4l> 0600 root
- <console> 0700 <gpm> 0700 root
其余的设备要修改为通过serial console来控制。例如,我们不想要一个处于托管位置的非特权用户去挂载软盘。为serial console定义一个新的console类型,叫做<sconsole>,将它添加到console.perms:
- <sconsole>=ttyS0
然后将其他设备的<console>改为<sconsole>,使它们指向serial console:
- <sconsole> 0660 <floppy> 0660 root.floppy
- <sconsole> 0600 <sound> 0600 root
- <sconsole> 0600 <cdrom> 0660 root.disk
- <sconsole> 0600 <pilot> 0660 root.uucp
- <sconsole> 0600 <jaz> 0660 root.disk
- <sconsole> 0600 <zip> 0660 root.disk
- <sconsole> 0600 <ls120> 0660 root.disk
- <sconsole> 0600 <scanner> 0600 root
- <sconsole> 0600 <camera> 0600 root
- <sconsole> 0600 <memstick> 0600 root
- <sconsole> 0600 <flash> 0600 root
- <sconsole> 0600 <mainboard> 0600 root
- <sconsole> 0600 <rio500> 0600 root
6.7. 针对RedHat的配置
RedHat将一些系统初始化所需的参数存放在/etc/sysconfig/init。
修改BOOTUP参数,使用独立终端命令写OK、PASSED和FAULT信息,这些信息将不再显示为绿色、黄色或红色。/etc/sysconfig/init文件的注释说,除了color,还可以设置其他的值,但是,BOOTUP必须被设为serial。
修改PROMPT参数,禁止交互启动。
对/etc/sysconfig/init的修改如下:
- BOOTUP=serial
- PROMPT=no
RedHat会运行一个用于发现硬件设备的程序,叫做kudzu。当发现一个串口时,kudzu会将其复位,这将停止serial console。kudzu的配置文件是/etc/sysconfig/kudzu。
将配置文件中的SAFE设为yes,就会阻止kudzu复位设备。
修改/etc/sysconfig/kudzu:
- SAFE=yes
7. 重启测试
7.1. 验证console操作
有可能的话,在串口上接一个串口接线盒。在重启的过程中,DTR信号会被激活,出现console信息时,数据指示灯会闪烁。在里一台电脑上配置好终端,重启计算机。
重启过程中,在终端界面可以看到bootloader的启动信息,然后是kernel启动,系统初始化输出,最后会显示/etc/issue的内容,并且getty要求你登录。
如果没有看到login信息,可能会提示按下Return或Enter键。
7.2. 重建console设置
用root用户登录serial console。前面我们删除了/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
结束单用户模式返回正常运行级别后,serial console的终端配置会保存到/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,一个安装RedHat 9,bootlloader为Grub 0.93,另一个安装WindowsXP,用超级终端作为serial console显示设备,用DB9头的串口通信线将二者COM1相连,只将两端的TX和RX信号交叉相连,其他信号都直连。
操作步骤:
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系统上打开超级终端,波特率为9600,8位数据位,1位停止位,无奇偶校验,无数据流控制。然后重启Redhat9,在超级终端上即可看到内核和文件系统的启动信息,最后可以用普通用户登录,登录后可以用su root命令切换到root用户。这里有个问题还未解决,文件系统的信息只能在超级终端上显示,在Redhat9的屏幕上��示完内核启动信息后就暂停输出了,最后直接显示登录信息,待解决。
4) 如果想让root用户通过serial console登录,需要修改/etc/securetty,在该文件的最后一行添加ttyS0,重启后即可在超级终端用root用户登录。
5) 其他设置暂未测试。