1. 程式人生 > >linux平臺實現多個console控制檯

linux平臺實現多個console控制檯

linux的啟動階段分為核心載入、根檔案系統載入,在核心載入時可以通過命令列支援多個控制檯,而在根檔案系統裡可以在/etc/inittab表裡新增多個控制檯,這樣就實現了多控制檯監控。

具體步驟如下:
1. 核心命令列配置雙控制檯,如ttyS0、ttyUSB0,注意命令列裡這兩個裝置的順序,ttyUSB0的優先順序要比ttyS0高。

Kernel command line: root=/dev/mtdblock4 rootfstype=cramfs rootflags=inband-tags console=ttyS0 console=ttyUSB0,115200n8 rdinit=/sbin/init mem=32M quiet

2. 在第1.執行完後,將會在根檔案系統內部建立/dev/console裝置,假如終端在上電時就在usb口上插入了usb-232,那麼從核心跨度到根檔案系統時/dev/console指向的是ttyUSB0裝置,反之指向的是/dev/ttyS0。這裡會引發另外一個問題,usb-232在usb口上熱插拔,將導致/dev/ttyUSBx的序號增加,如ttyUSB0、ttyUSB1、ttyUSB2...所以需要修改驅動,
    核心驅動路徑:drivers\usb\serial\usb-serial.c

static struct usb_serial *get_free_serial(struct usb_serial *serial,
				int num_ports, unsigned int *minor)
{
	unsigned int i, j;
	int good_spot;

	dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports);

	*minor = 0;
	
	mutex_lock(&table_lock);
	//-------------------------------------------------------
	//這裡修改主要是為了實現USB作為控制檯使用,強制
	//serial_table[0]=NULL,為了防止usb-232熱插拔,
	//導致裝置號增加(如/dev/ttyUSB0-->拔插-->/dev/ttyUSB1...), 
	//-------------------------------------------------------
	serial_table[0] = NULL;
	for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
	...

3.修改根檔案系統檔案/etc/inittab,需要遮蔽console作為控制檯來引導/bin/sh,原因是如果上電時就插入了usb-232,那麼核心將選擇ttyUSB0控制檯傳送給根檔案系統,建立1號程序init,以此來載入我們的應用程式...如果此時拔掉了usb-232,那麼/dev/ttyUSB0裝置將被釋放,init=1號程序將退出,導致根檔案系統崩潰,所以要改為下面兩種方式來啟動控制檯,這樣兩個控制檯可以同時工作

#console::respawn:-/bin/sh
ttyS0::respawn:-/bin/sh
ttyUSB0::respawn:-/bin/sh

4. 在第3.步執行兩個控制檯後最終都會呼叫/bin/sh,通過busybox檢視ash.c原始碼知道最終會呼叫/etc/profile檔案,而我要執行的應用程式卻在/etc/profile檔案裡啟動,這裡兩個控制檯將啟動兩個應用程式,很明顯這不滿足要求,所以需要修改profile檔案,即在根檔案系統裡需確定ttyS0、ttyUSB0哪個為主,哪個為輔,由於ttyS0裝置是一直存在,ttyUSB0裝置插入時才可以生成,所以這裡以ttyS0為主,即只在控制檯為ttyS0才載入應用程式,其它控制檯都跳過,修改profile檔案如下

if [ $(tty) = "/dev/ttyS0" ]; then
	#載入執行的應用程式
fi	

5. 實測,ok!