linux linux serial rs232 usb console terminal screen

Linux serial console usb

Queste nuove schede madri... non ci mettono più la porta seriale!

Sembrerebbero inutili, ma a noi hacker questa vetusta porta serve più spesso di quanto si possa immaginare.

Mettiamo per esempio di avere un sistema senza monitor e non funzioni più la rete...

Oppure, come spesso mi succede, un sistema con proiettori al posto dei monitor e magari il proiettore non funziona più o è in posizioni improbabili.

Quando non abbiamo la rete, come si fa? Vorrei un login, magari anche i messaggi di debug del kernel, i messaggi di boot, meglio ancora se posso comandare il bootloader!

Infatti in questo caso la porta seriale mi torna utilissima!

Linux supporta login e messaggi di boot su porta seriale ttyS0. Anche grub, il bootloader, si può configurare per essere comandato da porta seriale!

Ma se nella scheda madre non c'è? Si può utilizzare un convertitore usb rs232, che si trova abbastanza a buon mercato. Ma le cose si fanno un po' più complicate....

Premesse

Non avendo la porta seriale, utilizziamo un convertitore seriale usb, tipo questo:

usb-rs232.jpg

La maggior parte di questi dispositivi hanno chip Prolific oppure FTDI, supportati nel kernel linux rispettivamente con il modulo pl2303 e ftdi_sio.

Io ho utilizzato un Prolific, quindi il modulo pl2303.

Per quanto riguarda Linux, al solito, uso la mia distro preferita Gentoo, che ha già tutto pronto per compilare il kernel. Per altre distribuzioni forse c'è la necessità di installare pacchetti aggiuntivi, come gcc e i sorgenti del kernel, ma per queste cose ci sono tante guide in giro...

Kernel

Attacchiamo il convertitore e vediamo se viene riconosciuto dal sistema.

Prima controlliamo con lsusb se è collegato. Nell'output di lsusb dovremmo vedere qualcosa del genere:

Bus 003 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Quindi controlliamo se linux lo ha associato ad un file dispositivo tty.

ls -l /dev/ttyUSB0
crw------- 1 root tty 188, 0 Jun 18 14:56 /dev/ttyUSB0

Non trova niente? Allora bisogna compilare il kernel per abilitarlo. Più sotto è spiegato come.

L'ha riconosciuto! Probabilmente pl2303 è configurato come modulo, non integrato direttamente nel kernel. Vediamo cosa ci dice lsmod.

lsmod | grep pl2303
pl2303                 17993  1 
usbserial              47077  3 pl2303

Pensavi fosse finita qui? Per avere i messaggi di debug del kernel abbiamo bisogno di averlo dentro al kernel, non come modulo. Quindi...

Compiliamo il kernel!

Attenzione: l'ultimo comando, quello che copia il kernel, potrebbe essere diverso a seconda della distro linux.

cd /usr/src/linux
echo "CONFIG_USB_SERIAL_CONSOLE=y" >> .config
echo "CONFIG_USB_SERIAL=y" >> .config
echo "CONFIG_USB_SERIAL_PL2303=y" >> .config
make -j4 all
cp arch/x86/boot/bzImage /boot/vmlinuz

Ecco a cosa servono le tre opzioni:

  • CONFIG_USB_SERIAL_CONSOLE=y abilita l'utilizzo di console seriali
  • CONFIG_USB_SERIAL=y abilita il supporto usb seriale
  • CONFIG_USB_SERIAL_PL2303=y abilita il driver prolific direttamente nel kernel

Riavviamo per caricare il nuovo kernel!

Dopo il riavvio dovremmo avere il solito dispositivo in /dev/ttyUSB0, ma il modulo non dovrebbe apparire con lsmod.

Tiriamo un sospiro di sollievo, per oggi non si tocca più il kernel.

printk: i messaggi di boot

I messaggi di boot sono utilissimi per vedere cosa succede in una macchina senza schermo che non si avvia.

Dobbiamo modificare le configurazioni di grub, il bootloader. Aggiungiamo console=ttyUSB0,115200n8 alla riga con le impostazioni del kernel.

kernel (hd0,2)/boot/vmlinuz console=ttyUSB0,115200n8

115200n8 è il baudrate seguito dal parity none e da bit, cioè la configurazione per la nostra seriale.

Ok, è il momento di collegare la seriale da qualche parte, per esempio ad un altro computer, per esempio il portatile. Il modo più semplice (a mio avviso) è usare il programma screen.

Nel portatile, a cui è collegato un altro convertitore usb seriale:

screen /dev/ttyUSB0 115200

Non dovremmo vedere niente per il momento. Possiamo uscire in ogni momento: CTRL+A, quindi scrivere ":quit" e battere invio. Ma per ora, rimaniamo collegati.

Torniamo all'altro computer e riavviamolo... magia! Nel terminale screen aperto nel portatile stanno scorrendo i messaggi di boot dell'altro computer! Ma... quando finisce l'avvio... niente login :(

Login via seriale

Niente paura, semplicissimo, modifichiamo il file /etc/inittab aggiungendo questo alla fine:

s0:12345:respawn:/sbin/agetty 115200 ttyUSB0 vt100

Riavviamolo per l'ennesima volta... alla fine del boot abbiamo il login!

Anche senza schermo e senza rete, possiamo ancora accedere al computer!

Ma perché la password non funziona? Stai forse cercando di entrare come root?
Non funziona perché solitamente queste porte non sono abilitate per accesso come superutente. Per abilitare root, basta modificare il file /etc/securetty, aggiungendo ttyUSB0 alla fine.

ttyUSB0

Ora riusciamo ad entrare anche come root. Grande!

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus