zoukankan      html  css  js  c++  java
  • 为Linux系统配置serial console

    原文:

    《Remote Serial Console HOWTO》:

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

    Translate By Bob

    Email:gexbob@gmail.com

    Friday, July 15, 2011

    根据我的环境(Redhat 9,Grub 0.93),翻译了我需要的部分。原文还有针对Lilo和Syslinux的配置说明。

       

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

      

    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在内核启动时传递给内核,对于GRUB,需要修改grub.conf文件,将参数添加到kernel命令后面即可,例如;

    [plain] view plain copy
     
    1. title Red Hat Linux (2.4.9-21)  
    2.   root (hd0,0)  
    3.   kernel /vmlinuz-2.4.9-21 ro root=/dev/hda6 console=tty0 console=ttyS0,9600n8  
    4.   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,在该文件中添加:

    [plain] view plain copy
     
    1. 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的那一行,例如:

    [plain] view plain copy
     
    1. id:5:initdefault:  

    改为

    [plain] view plain copy
     
    1. id:3:initdefault:  

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

    6.2.1. 配置为运行X

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

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

    [plain] view plain copy
     
    1. :0 local /usr/X11R6/bin/X  

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

    [plain] view plain copy
     
    1. [servers]  
    2. 0=/usr/bin/X11/X  

    6.3. 删除已有的console设置

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

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

    [plain] view plain copy
     
    1. rm -f /etc/ioctl.save  

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

    6.4. serial console不是/dev/modem

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

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

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

    [plain] view plain copy
     
    1. bash$ ls -l /dev/modem  
    2. lrwxrwxrwx 1 root root 10 Jan 01 00:00 /dev/modem -> /dev/ttyS0  
    3. bash# rm /dev/modem  

    6.5. 更改/dev/systty的目标

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

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

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

    [plain] view plain copy
     
    1. l systty tty0  

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

    [plain] view plain copy
     
    1. bash# cd /etc/makedev.d  
    2. bash# fgrep systty *  
    3. linux-2.4.x:l systty tty0  
    4. bash# vi linux-2.4.x  

    将systty那一行改为:

    [html] view plain copy
     
    1. l systty ttyS0  

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

    [html] view plain copy
     
    1. bash# cd /dev  
    2. bash# rm systty  
    3. bash# ./MAKEDEV systty  

    6.6. 配置可拔插认证模块

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

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

    [plain] view plain copy
     
    1. <console>=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9].[0-9] :[0-9]  

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

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

    [html] view plain copy
     
    1. <console>  0660 <floppy>     0660 root.floppy  
    2. <console>  0600 <sound>      0600 root  
    3. <console>  0600 <cdrom>      0660 root.disk  
    4. <console>  0600 <pilot>      0660 root.uucp  
    5. <console>  0600 <jaz>        0660 root.disk  
    6. <console>  0600 <zip>        0660 root.disk  
    7. <console>  0600 <ls120>      0660 root.disk  
    8. <console>  0600 <scanner>    0600 root  
    9. <console>  0600 <camera>     0600 root  
    10. <console>  0600 <memstick>   0600 root  
    11. <console>  0600 <flash>      0600 root  
    12. <console>  0600 <fb>         0600 root  
    13. <console>  0600 <kbd>        0600 root  
    14. <console>  0600 <joystick>   0600 root  
    15. <console>  0600 <v4l>        0600 root  
    16. <console>  0700 <gpm>        0700 root  
    17. <console>  0600 <mainboard>  0600 root  
    18. <console>  0600 <rio500>     0600 root  

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

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

    [plain] view plain copy
     
    1. <console>  0600 <fb>         0600 root  
    2. <console>  0600 <kbd>        0600 root  
    3. <console>  0600 <joystick>   0600 root  
    4. <console>  0600 <v4l>        0600 root  
    5. <console>  0700 <gpm>        0700 root  

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

    [html] view plain copy
     
    1. <sconsole>=ttyS0  

    然后将其他设备的<console>改为<sconsole>,使它们指向serial console:

    [html] view plain copy
     
    1. <sconsole>  0660 <floppy>     0660 root.floppy  
    2. <sconsole>  0600 <sound>      0600 root  
    3. <sconsole>  0600 <cdrom>      0660 root.disk  
    4. <sconsole>  0600 <pilot>      0660 root.uucp  
    5. <sconsole>  0600 <jaz>        0660 root.disk  
    6. <sconsole>  0600 <zip>        0660 root.disk  
    7. <sconsole>  0600 <ls120>      0660 root.disk  
    8. <sconsole>  0600 <scanner>    0600 root  
    9. <sconsole>  0600 <camera>     0600 root  
    10. <sconsole>  0600 <memstick>   0600 root  
    11. <sconsole>  0600 <flash>      0600 root  
    12. <sconsole>  0600 <mainboard>  0600 root  
    13. <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的修改如下:

    [html] view plain copy
     
    1. BOOTUP=serial  
    2. PROMPT=no  

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

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

    修改/etc/sysconfig/kudzu:

    [html] view plain copy
     
    1. 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位停止位。

    [plain] view plain copy
     
    1. remote.example.edu.au ttyS0 login: root  
    2. Password: …  
    3. sh# rm -f /etc/ioctl.save  
    4. bash# telinit 1  
    5. …Telling INIT to go to single user mode.  
    6. INIT: Going single user  
    7. INIT: Sending processes the TERM signal  
    8. sh# stty sane -parenb cs8 crtscts brkint -istrip -ixoff -ixon  

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

    [html] view plain copy
     
    1. sh# exit  
    2. ...  
    3. bash# ls -l /etc/ioctl.save  
    4. -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

    添加:

    [plain] view plain copy
     
    1. serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1  
    2. terminal --timeout=10 serial console  

    在kernel后面添加参数:

    [html] view plain copy
     
    1. console=tty0 console=ttyS0,9600n8  

    2) 修改/etc/inittab

    添加:

    [plain] view plain copy
     
    1. 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) 其他设置暂未测试。

     更多嵌入式学习视频:www.makeru.com.cn/?t=12                嵌入式学习交流群:561213221      

  • 相关阅读:
    返回一个整数数组中最大子数组的和(数组头尾连接)
    场景调研(补)
    《浪潮之巅》读书笔记3
    《软件工程》课程改进意见
    【每日scrum】第一次冲刺day6
    【每日scrum】第一次冲刺day5
    【每日scrum】第一次冲刺day4
    【每日scrum】第一次冲刺day3
    【每日scrum】第一次冲刺day2
    【每日scrum】第一次冲刺day1
  • 原文地址:https://www.cnblogs.com/huan-huan/p/8522472.html
Copyright © 2011-2022 走看看