『壹』 linux控制台怎麼定向到串口終端
利用串口終端作為Linux控制台,可以免去額外的鍵盤,顯示卡和顯示器,同時可將Linux主機作為一個任意用途的嵌入式黑匣。那麼LINUX控制台怎麼定向到串口終端?下面跟著學習啦小編一起來了解一下吧。
LINUX控制台怎麼定向到串口終端
目的: 台機已經裝好Linux,顯示器有問題,平時一般都SSH控制,當Linux網路掛的時候,想通過串口來管理。
硬體:台機自帶兩個串口(上面的是COM1)[under Windows] or ttyS0[under Linux)),筆記本T61p沒有串口,買了個USB轉串口(具體見下圖)。同時需要串口交叉線一根(NULL modem Cable),母對母(公的是針),都是凹口那種。
目標機器:安裝的CentOS 5.2 Linux 內核2.6.18-92.1.22.el5和2.6.18-92.1.22.el5xen
客戶端: Windows XP SP3 IBM OEM. 安裝USB轉串口驅動。
需要把輸出定向到串口,一般有下面幾處:
BIOS中的設置
GRUB設置
/etc/inittab 設置
/etc/securetty 設置
BIOS中的設置
BIOS設置的作用我沒嘗試過,如果是可以連BIOS設置都可以定向到串口,那個強大了。也不知道如何去掉機器需要連鍵盤的限制。沒拿出顯示器所以沒看我台機的BIOS,不過這個功能一般只有伺服器級別的機器有。【注1】台機一般沒有串口重定向功能。
GRUB設置
這里的配置是為了把grub菜單定向到串口,這樣你就可以在串口操作grub,選擇啟動項,使用single mode等等。
同時也要給kernel參數加上console選項。
[root@CentOS5 ~]# cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/vg00/lv_root
# initrd /initrd-version.img
#boot=/dev/hdb1
serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console
default=2
timeout=20
#splashimage=(hd0,0)/grub/splash.xpm.gz =>這些在console下會工作不正常,注釋掉。
#hiddenmenu
title CentOS (2.6.18-92.1.22.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.1.22.el5 ro root=/dev/vg00/lv_root rhgb quiet
initrd /initrd-2.6.18-92.1.22.el5.img
title CentOS Serial[ttyS0] - Console (2.6.18-92.1.22.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.1.22.el5 ro root=/dev/vg00/lv_root console=ttyS0,9600 console=tty0
initrd /initrd-2.6.18-92.1.22.el5.img
title CentOS Console - serial[ttyS0] (2.6.18-92.1.22.el5) [get more output in serial console]
root (hd0,0)
kernel /vmlinuz-2.6.18-92.1.22.el5 ro root=/dev/vg00/lv_root console=tty0 console=ttyS0,9600
initrd /initrd-2.6.18-92.1.22.el5.img
title CentOS Xen (2.6.18-92.1.22.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-92.1.22.el5
mole /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/vg00/lv_root rhgb quiet xencons=off
mole /initrd-2.6.18-92.1.22.el5xen.img
title CentOS Xen Serial[ttyS0] - Console (2.6.18-92.1.22.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-92.1.22.el5
mole /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/vg00/lv_root xencons=off console=ttyS0,9600 console=tty0
mole /initrd-2.6.18-92.1.22.el5xen.img
title CentOS Xen Console - serial[ttyS0] (2.6.18-92.1.22.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-92.1.22.el5
mole /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/vg00/lv_root xencons=off console=tty0 console=ttyS0,9600
mole /initrd-2.6.18-92.1.22.el5xen.img
title Other
rootnoverify (hd0,0)
chainloader +1
後面的console有順序關系,詳見下文【注2】,我常用串口所以console=tty0 console=ttyS0,9600這個順序的輸出信息比較多。
因為我的機器有xen的內核,xen默認情況下會把串口做為xencons,所以這里設置xencons=off.
When multiple consoles are listed output is sent to all consoles and input is taken from the last listed console. The last console is the one Linux uses as the /dev/consoledevice.
/etc/inittab 設置
系統系統後,需要在串口上監聽請求,所以要有個類似伺服器的程序(agetty, mgetty etc)。
/etc/inittab中添加
s0:2345:respawn:/sbin/agetty -L -f /etc/issue.serial 9600 ttyS0 vt100
#s1:2345:respawn:/sbin/agetty -L -f /etc/issue.serial 9600 ttyS1 vt100
#S0:2345:respawn:/sbin/mgetty -r -x 9 ttyS0 ==> mgetty 用來調試比較好,log也豐富。
What is a getty?
A getty is is a program that opens a tty port, prompts for a login name, and runs the /bin/login command. It is normally invoked by init.
所以其他程序就不能再來佔用ttyS0了,串口是獨占模式的吧。
vt100:
vt100 is the terminal emulation. You can use others, but VT100 is the most common or "standard". Another widely used termial type is VT102.
OK都可以了,可以重啟server了。這里如果想測試下串口線,推薦先在Linux啟動下mgetty,因為他的debug信息和log比較豐富,適合排錯和測試。
#mgetty –r –x 9 ttyS0
Log在/var/log/mgetty*中。
/etc/securetty設置
因為一般我們都是使用root登陸串口來維護,所以需要設置root可以在COM1和COM2登陸。
在/etc/securetty中添加:
ttyS0
ttyS1
Windows客戶端連接可以用超級終端或者Putty。
注意啟動server的時候,putty就應該去連接串口了,這樣才可以看到所有信息。
本來正常情況下,接下去kernel的boot信息應該也會打到串口的。但是沒有,確定是Xen內核的關系。
系統啟動起來後,過了init,agetty就起來了,這個時候就可以通過串口登陸了。(在/etc/securetty中需要添加ttyS0)
看過「 LINUX控制台怎麼定向到串口終端 」的人還看了:
『貳』 如何在linux上使用串口設備
簡單的運行 dmesg 命令
$ dmesg | grep tty
輸出:
[ 37.531286] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.531841] 00:0b: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.532138] 0000:04:00.3: ttyS1 at I/O 0x1020 (irq = 18) is a 16550A
setserial 命令
setserial 是一個程序用於設定並/或報告某個串口關聯的配置信息。該信息包括串口用到的I/O 埠和中斷號,以及Break鍵是否應被解釋為Secure Attention Key 等等。 僅僅是輸出如下的命令:
$ setserial -g /dev/ttyS[0123]
輸出:
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x1020, IRQ: 18
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
帶-g選項的setserial幫助找到你的Linux板子上的物理串口。
Linux 串口控制台程序
一旦串口被確定了,你就能使用許多的工具來配置Linux板子:
minicom- 用於控制modem和連接到mp 設備的最好的串口通信程序。
wvidial or other GUI dial up networking program - 一個內建智能PPP 撥號器。
getty / agetty - agetty 打開一個 tty 埠, 提示登錄名稱並調用 /bin/login 命令。
grub / lilo configuration - 配置串口為系統控制台。
『叄』 Linux下對串口操作的方法
和文件一樣,open /dev/ttyS0就是串口1 然後設置波特率,停止位 奇偶校驗那些 ,之後read write就可以了 頭文件是<termios.h>
『肆』 Linux普通用戶運行串口
將USB串口設備插入USB口後,會在/dev/目錄下生成/dev/ttyUSB0文件(也可能為/dev/ttyUSB1,/dev/ttyUSB2...),
查看此文件
輸出為:
c說明表明設備為字元設備文件(d表示目族掘錄文件,-表示普通文件,l表示鏈接文件,b表示塊文件),
其中rw-rw----表示root用戶作為文件所有者可以讀和寫,dialout用戶組內的用戶可以讀和搜穗兆寫,其他用戶不允許讀、寫和執行(r表示可讀,w表示可寫世租,x表示可執行)
因此,需要將當前用戶增加到dialout用戶組中
『伍』 linux串口設置時struct termios中各個選項的具體意思是什麼
設置串口
最基本的設置串口包括波特率設置,效驗位和停止位設置。串口的設置主要是設置 struct termios 結構體的各成員值。
struct termio
{ unsigned short c_iflag; /* 輸入模式標志 */
unsigned short c_oflag; /* 輸出模式標志 */
unsigned short c_cflag; /* 控制模式標志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};
設置這個結構體很復雜,我這里就只說說常見的一些設置:
波特率設置 下面是修改波特率的代碼:
struct termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200); /*設置為19200Bps*/
cfsetospeed(&Opt,B19200);
tcsetattr(fd,TCANOW,&Opt);
一般簡單的問題,網路和google都有,搜索一下就有了。