原文:
《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命令后面即可,例如;
- 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級,但是不能為顯示器運行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) 其他設置暫未測試。
更多嵌入式學習視頻:www.makeru.com.cn/?t=12 嵌入式學習交流群:561213221
