為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      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM