Serial Login

From YobiWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Inspired by http://www.rajeevnet.com/linux/grub_serial_console.html but the Debian way.

Support in BIOS

I use 57600 as this is the speed set in my BIOS (yes, even BIOS management via serial!)

Support in Grub

Add to /boot/grub/menu.lst

# Setup serial (COM1) here with baudrate 57600
# use --unit=1 (for COM2) and so on
serial --unit=0 --speed=57600
#
# Now setup terminal as both Serial Line(/dev/ttyS0) and
# Monitor Console(/dev/tty0) depending upon where you press key
# with in timeout (15 sec) period. Otherwise first entry
# (console(Monitor)=>tty0) is selected here.
terminal --timeout=15  console serial

Then

update-grub

Support in Kernel

To get messages on both consoles, use "console=ttyS0,57600" and "console=tty0", modify these lines (but let them commented!) in /boot/grub/menu.lst to change kernel options

# defoptions=console=ttyS0,57600 console=tty0
# altoptions=(recovery mode) console=ttyS0,57600 console=tty0 single
# altoptions=(recovery mode via serial) console=tty0 console=ttyS0,57600 single

Then

update-grub

Support in console

Uncomment in /etc/inittab and change speed

T0:23:respawn:/sbin/getty -L ttyS0 57600 vt100

check if ttyS0 is well present in /etc/securetty to be able to login directly as root

Usage

You can use

  • minicom
  • socat (man pages of stty and termios can help understanding the tweaks of terminals
socat -,icanon=0,echo=0 /dev/ttyUSB2,raw,echo=0,b9600

With that socat command:

  • echo is ok, colors are supported, arrows also, ctrl-d
  • ctrl-c is local -> exit socat
  • To get ctrl-c working remotely instead of locally
    But then socat must be killed externally to quit:
socat -,icanon=0,echo=0,isig=0 /dev/ttyUSB2,raw,echo=0,b9600
  • If F1..F10 don't work in mc or other problems, this is probably because of a mismatch of terminfo.
    • You can use instead esc-1..esc-9, esc-0 (for F10) in mc
    • You can also simply fix the TERM variable according to your local terminal, which means sth like:
    • export TERM=xterm # if you are in an xterm
    • export TERM=linux # if you are in a text console

Here is a simple bash script to launch serial consoles in an easy and explicit way:

#!/bin/bash

# Usage:
#  -c to get ctrl-c working remotely instead of locally
#     this means you'll have to kill socat by other means!

DATA=$0
DATA=${DATA/*%/}
PORT=/dev/tty${DATA/@*/}
SPEED=${DATA/*@}
if [ "$SPEED" == "$DATA" ]; then
    echo "Error, this script must be called by a symlink with a proper name" >&2
    echo "Example: machine1%USB0@9600" >&2
    echo "to connect to machine1 via local port /dev/ttyUSB0 at 9600bps" >&2
    exit 1
fi

ISIG=""
echo "============================================================================"
if [ "$1" == "-c" ]; then
    ISIG=",isig=0"
    echo "CTRL-C will be active remotely but not locally!"
else
    echo "CTRL-C will be active locally but not remotely!"
    echo "Use \"$0 -c\" if you want the other way"  
fi
echo
echo "Once you are logged, you'd better fix the terminfo to your current settings:"
echo "        >>>>>>>>>>>>>>>>>>>> export TERM=$TERM <<<<<<<<<<<<<<<<<<<<"
echo "   You have to do it manually as i've no idea in which state the port is"
echo
echo "       And, of course, don't forget to logout! CTRL-D works remotely" 
echo
echo " Press enter to get a login or CTRL-L if there is already a running session"
echo "============================================================================"
echo
socat -,icanon=0,echo=0${ISIG} ${PORT},raw,echo=0,b${SPEED}