1. 程式人生 > >將x86平臺的Linux控制檯重定向到串列埠

將x86平臺的Linux控制檯重定向到串列埠

一般地,安裝在PC的Linux是使用滑鼠、鍵盤作為輸入源,顯示器作為輸出顯示,但有些X86的裝置,如工控機等,為了節省成本,會去掉認為無用的外設介面,以致熟悉了PC的人不習慣。一個裝置,沒有滑鼠、鍵盤、顯示器,但只要還有串列埠,還是可以控制的。本文將在一個具備串列埠的裝置上配置Linux系統,以便將控制檯重定向到串列埠。Linux使用ubuntu14.04發行版本。

需要改動的地方有2處,一是grub配置,二是登陸配置。當然,還有一個重要前提,就是串列埠能正常工作。

說來慚愧,由於板子不具備一般人所認為的SDK,——我們覺得板子自帶有資料、SDK開發包是理所當然的,但實際上,有些卻不然。為了測試哪個串列埠裝置可用,我使用串列埠口除錯助手逐一發送資料到指定的串列埠裝置檔案(命令如echo "latelee" > /dev/ttyS0),幸好只測試到第3個裝置檔案即能成功,否則,還有一直測試下去(在/dev/目錄下有32個ttyS裝置,啟動資訊看到共有6個裝置)。因此找到正確、正常能用的串列埠裝置是最關鍵的。實際中,可能ttyS0可用,也可能ttyS2可用。下面以ttyS0為例說明。

通常情況下,波特率等引數是115200n8,有些配置核心時好像看到過,但沒什麼印象。

使用root許可權,先備份好已有檔案。
/etc/default/grub:配置
update-grub:
/boot/grub/grub.cfg:

1、建立登陸配置檔案

建立/etc/init/ttyS0.conf檔案(如是其它串列埠,所有的ttyS0都改為ttySx,檔名也是ttSx.conf),下面是ttyS2.conf檔案的內容如下:

# ttyS2 - getty
#
# This service maintains a getty on ttyS2

description     "Get a getty on ttyS2"

start on stopped rc RUNLEVEL=[2345] and (
            not-

Container or
            container CONTAINER=lxc or
            container CONTAINER=lxc-libvirt)

stop on runlevel [!2345]

respawn

# no one will auto login(不自動登陸)
exec /sbin/getty -L 115200 ttyS2

# auto login as root or latelee
#exec /sbin/getty -a root -L 115200 ttyS2
#exec /sbin/getty -a latelee -L 115200 ttyS2

2、修改核心啟動引數

ubuntu說不能直接修改/boot/grub/grub.cfg檔案(實際上我改過,也沒什麼事情),而是改/etc/default/grub檔案,然後執行命令update-grub,即會自動更新grub.cfg檔案。修改的地方有幾個。

啟動引數:

GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"

配置串列埠控制檯:

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=console

# my add
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

完整的檔案如下:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
# this is for vga text
#GRUB_CMDLINE_LINUX_DEFAULT="quiet text"
#GRUB_CMDLINE_LINUX=""

# my serial console
GRUB_CMDLINE_LINUX_DEFAULT="consol=tty0 console=ttyS2,115200n8"
GRUB_CMDLINE_LINUX=""


# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=console

# my add
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

說明:

GRUB_DISABLE_LINUX_UUI是指在指定根分割槽時,不使用該分割槽的UUID,而是直接用如/dev/sda2的格式。

3、更新grub

直接執行命令update-grub即可


修改後的grub.cfg檔案如下:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e5b19d4d-199f-4426-bab9-0b0c02b54317' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  a5c5a770-5bae-453c-a888-f83781fcaa1f
        else
          search --no-floppy --fs-uuid --set=root a5c5a770-5bae-453c-a888-f83781fcaa1f
        fi
        linux   /vmlinuz-3.13.0-32-generic root=/dev/sda1 ro  console=tty0 console=ttyS2,115200n8
        initrd  /initrd.img-3.13.0-32-generic

可以看到,核心啟動引數已經配置成功。


另外,為了防止系統掛掉,可以執行update-grub後再手動改/boot/grub/grub.cfg檔案,不要所有的啟動項都是串列埠控制檯,實際上有恢復模式可選,不改也行。我是把Advanced options for Ubuntu裡面的配置改回原來的。

重新啟動系統,檢視啟動引數

# cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-3.13.0-32-generic root=/dev/sda1 ro console=tty0 console=ttyS2,115200n8

# who
latelee ttyS2

存疑:上面的grub配置,有2個console,分別是tty0和ttyS2,它們不匹配,但啟動後也沒什麼問題,看到的終端還是ttyS2,不知道是什麼原因。估計和啟動引數的tty0關係不大,主要看ttyS2.conf配置。

說明:如果還是接有顯示器,顯示器依然有輸出,Alt+Ctrl+1還是tty1,Alt+Ctrl+2還是tty2,原來是什麼樣子,還是什麼樣子。

遺留問題:串列埠控制檯只能顯示24x80(用secureCRT測試所得),有些命令太長則會回滾到一行的開始,雖然也是成功的,但影響了資訊的提示,目前還不知道怎麼改,在哪裡改。