venerdì 24 dicembre 2010

Tabella di instradamento

route è il comando in grado di manipolare la tabella di instradamento del kernel (routing table). Cos'è una tabella di instradamento? Niente di complicato, si tratta di una tabella con indirizzi ip usata dall'interfaccia di rete per stabilire l'instradamento dei pacchetti.


Se usato senza opzioni, il comando route stampa sullo standard output la tabella di instradamento in uso. La colonna Destination indica un gruppo di indirizzi ip, quelli cioè che appartengono all'intervallo individuato dall'and logico con la maschera di rete, descritta nella colonna Genmask. La colonna Gateway indica all'interfaccia di rete dove instradare i pacchetti.
Vediamo con un esempio come viene usata la tabella di instradamento: supponiamo che una nostra applicazione generi un pacchetto la cui destinazione sia l'host all'indirizzo ip 93.238.238.124. La prima riga della tabella di instradamento dice che i pacchetti appartenenti all'intervallo 93.238.238.1-93.238.238.255 (ottenuto mediante and logico fra l'indirizzo Destination della tabella di instradamento, 93.238.238.1, e la maschera di rete Genmask, 255.255.255.0, il cui risultato è un qualunque indirizzo ip del tipo 93.238.238.*) non vanno instradati verso nessun gateway. In tal caso i pacchetti dovranno essere instradati all'interno della rete locale!
Supponiamo adesso che una nostra applicazione generi un pacchetto la cui destinazione sia l'host all'indirizzo ip 94.238.238.124. Questa volta il pacchetto non sembra rientrare nell'instradamento (locale) previsto dalla prima riga della tabella di instradamento. Analizziamo pertanto la seconda riga: qui nella colonna Destination non leggiamo nessun indirizzo ip da mettere in and logico con la maschera di rete Genmask, che in tal caso è 0.0.0.0. Il motivo è molto semplice, qualsiasi indirizzo ip messo in and logico con la maschera di rete 0.0.0.0 genera un indirizzo ip del tipo *.*.*.*, in altre parole qualsiasi indirizzo ip! Pertanto se il pacchetto da instradare non rientra nella prima regola (quella locale analizzata in precedenza) occorre instradare lo stesso pacchetto all'indirizzo presente nella colonna Gateway, il router della mia rete con ip 93.238.238.1.
La tabella di instradamento stampata da route, come potete vedere nell'immagine sopra, ci fornisce altre informazioni. Nella colonna Flags ci viene indicato lo stato e/o la tipologia della rotta. Ogni lettera, dunque, ha un suo significato: U, significa che quella rotta è attiva; H, significa che la rotta è verso un host; G, indica che la rotta usa il gateway; R, indica che la rotta per l'instradamento dinamico è stata ripristinata; D, indica che la rotta è stata aggiunta dinamicamente da qualche daemon; M, indica che la rotta è stata modificata dinamicamente da qualche daemon; A, indica che la rotta è stata aggiunta da addrconf; C, indica che la rotta è una voce della cache; !, indica che l'instradamento è respinto. La colonna Metric indica il numero di salti per i pacchetti, mentre la colonna Iface indica l'interfaccia di rete che usa quell'instradamento (le altre colonne non vengono utilizzate dal kernel).
Le opzioni add e del consentono (all'utente root), rispettivamente, di aggiungere e cancellare le rotte per l'instradamento dei pacchetti.
Quando aggiungiamo una nuova rotta dobbiamo fornire tutti i parametri necessari a popolare la riga della tabella di instradamento (se alcuni valori non saranno presenti il comando userà dei valori di default). Vi elenco le opzioni più comuni da usare con add:
  • netmask indirizzo: specifica la maschera di rete;
  • gw indirizzo: specifica l'indirizzo del gateway;
  • metric n: specifica il numero di salti (se conoscete questo valore inseritelo, potrebbe essere usato da qualche daemon che applica un algoritmo di instradamento ottimale);
  • dev nome_dispositivo: specifica il dispositivo che userà la rotta;
  • -net indirizzo: indica che l'obiettivo dell'instradamento è una rete;
  • -host indirizzo: indica che l'obiettivo dell'instradamento è un host;
Ad esempio, il comando sudo route add -host 93.238.238.124 netmask 255.255.255.0 dev wlan0 aggiunge l'instradamento locale, per l'interfaccia di rete wlan0, per tutti i pacchetti nell'intervallo di indirizzi 93.238.238.0-93.238.238.255 verso l'host con indirizzo ip 93.238.238.124. Per cancellare una rotta di instradamento fate seguire all'opzione del l'indirizzo Destination della riga da cancellare. Ad esempio, il comando sudo route del 93.238.238.124 cancella la rotta aggiunta in precedenza.

giovedì 23 dicembre 2010

Seguire i pacchetti con traceroute

Com'è possibile? Il sito web che ho visitato qualche ora fa adesso non è più accessibile! Vi è mai capitata una situazione come quella appena descritta? Prima ancora di iniziare a indagare sul nostro computer vi consiglio di seguire il percorso fatto dai vostri pacchetti per giungere a destinazione con il comando traceroute. Passate al comando traceroute il nome o indirizzo dell'host irraggiungibile e osservate bene l'output prodotto dal comando. Ad esempio, traceroute luca-petrosino.blogspot.com:


Il comando traceroute sfrutta il campo TTL (time to live) assegnato ad ogni pacchetto trasmesso. Quando la nostra interfaccia di rete immette nella rete un pacchetto assegna a quest'ultimo un valore per il TTL (di default pari a 30 salti, da router a router). Tutto ciò viene fatto per evitare loop e cammini senza meta all'interno della rete e per non aggiungere un inutile carico di lavoro per i router che devono indirizzare il pacchetto verso la destinazione. Quando un pacchetto transita per un router (che lo indirizza verso un router più vicino all'host di destinazione, oppure, se il prossimo salto lo permette, all'host finale) il campo TTL del pacchetto viene diminuito di un'unità. Se il TTL di un pacchetto si annulla il router che lo riceve non effettua più l'instradamento a destinazione e invia al mittente un messaggio di errore, notificando l'impossibilità a raggiungere l'host di destinazione.
traceroute mostra i router attraversati dai pacchetti, la prima richiesta passa per l'interfaccia di rete del nostro computer. Nell'output vengono mostrati i nomi degli host e gli indirizzi ip delle interfacce attraversate. Nell'immagine sopra, allora, per nascondere il mio indirizzo ip ho coperto la prima riga con un rettangolo rosso. Tutti i successivi salti sono invece visibili.
Il comando traceroute invia pacchetti UDP (protocollo di trasporto dati) con TTL crescente, generalmente tre pacchetti (simultaneamente), e ne attende la ricezione dei rispettivi messaggi di errore ICMP (internet control message protocol, il protocollo usato per inviare i messaggi di errore), segnandone i tempi (quelli visibili in corrispondenza della riga che fa riferimento all'host attraversato). Un pacchetto con TTL pari a 1 attraverserà pertanto un solo router! Se i pacchetti ICMP in risposta ai pacchetti UDP inviati da traceroute tardano ad arrivare (il comando li attende per almeno 5 secondi) leggeremo sulla riga dell'host da raggiungere il simbolo *. Si tratta di un evento molto importante per stabilire il punto esatto della rete in cui i nostri pacchetti si perdono! In tal caso il problema risiede in uno dei router attraversati in fase di instradamento (oppure dall'eccessivo numero di salti compiuti dal pacchetto, che ne annullano il TTL). Se invece traceroute ci mostra che i pacchetti UDP vengono persi già dopo il primo salto è evidente che il problema risiede nel gateway usato dalla nostra rete.
Attenzione, non tutti i pacchetti inviati seguono lo stesso percorso! Questo influenza sia i tempi di risposta che i router visitati per ogni salto, non dimenticatelo.

mercoledì 22 dicembre 2010

Altre informazioni per le interfacce wireless

In precedenza, quando vi parlavo di come configurare una scheda di rete wireless con iwconfig, ho indicato il comando iwlist come quel comando utile a scoprire quanti canali (e quali frequenze) supporta la nostra scheda di rete wireless. In realtà il comando iwlist ci permette di ottenere anche altre informazioni dell'interfaccia wireless. La sintassi da usare è la seguente: iwlist nome_interfaccia informazione, dove nome_interfaccia (l'etichetta assegnata dal sistema operativo alla scheda di rete wireless) può essere trovata con il comando iwconfig e il parametro informazione fa riferimento all'informazione che vogliamo cercare.
Ecco l'elenco delle informazioni più comuni, per un'interfaccia di rete, che possiamo chiedere al comando iwlist:
  • scanning: ritorna una lista degli acces point rilevati (compresi quelli delle interfacce di rete impostate sulla modalità di funzionamento ad-hoc) dalla scheda di rete wireless;
  • frequency oppure channel: stampa l'elenco dei canali e delle frequenze supportate dalla scheda di rete wireless;
  • keys: lista (codificata) e dimensione delle chiavi salvate per il dispositivo interrogato;
  • event: lista degli eventi supportati dal dispositivo wireless;
  • auth: lista degli algoritmi di codifica supportati (ad esempio WPA, WPA2 etc...) dal dispositivo wireless;

Per una lista completa delle informazioni consultate la pagina del manuale relativa al comando, con man iwlist. Non tutte le informazioni elencate nella pagina del manuale sono disponibili, sta al driver che interagisce con la periferica wireless implementarle. Le informazione elencate sopra sono comunque implementate nella maggior parte dei driver.

martedì 21 dicembre 2010

Attivare/disattivare una connessione di rete

I comandi ifup e ifdown permettono, rispettivamente, di attivare e disattivare una connessione di rete. Sono solitamente usati da ifconfig e iwconfig e svolgono un importante compito, l'avvio (oppure la fine) di una connessione. ifup corrisponde in altre parole a ifconfig nome_interfaccia up, così come ifdown corrisponde a ifconfig nome_interfaccia down. Il comando ifup wlan0, ad esempio, attiva la connessione di rete configurata per il dispositivo wlan0, ifdown wlan0 chiude la connessione. Con ifup -a (all) avviamo tutte le connessioni delle schede di rete mentre con ifdown -a effettuiamo l'operazione inversa.
Per eseguire i comandi ifup e ifdown bisogna possedere i permessi e i privilegi dell'amministratore del computer, l'utente root.

lunedì 20 dicembre 2010

Configurare le interfacce di rete wireless con iwconfig

Il comando ifconfig non è in grado di restituire all'utente tutte le informazioni disponibili sulle schede di rete wireless. Se dovete configurare la vostra schede di rete wireless è preferibile usare il comando iwconfig. La sintassi prevista dal comando è la seguente: iwconfig nome_dispositivo opzione valore. Se eseguiamo nel terminale il comando iwconfig, senza nessun nome e opzione, il comando stampa sullo standard output l'elenco dei dispositivi wireless e per ognuno di questi un bel po di informazioni:


Nell'immagine mostrata sopra ho coperto i dati sensibili relativi alla mia rete con dei rettangoli rossi. Sulla prima riga possiamo leggere lo standard utilizzato dal dispositivo e l'ESSID (extended service set identifier) che identifica il nome della rete. Per conoscere l'indirizzo mac dell'access point dobbiamo guardare sulla seconda riga, subito dopo la voce Access Point. Mode e Frequency ci informano, rispettivamente, sulla modalità di funzionamento del dispositivo e della frequenza usata per le comunicazioni. Altre informazioni disponibili nell'output del comando iwconfig sono: il massimo numero di ritrasmissioni per un pacchetto (Retry long limit), la qualità del segnale (Link quality), il livello del segnale (Signal level) etc... Le interfacce di rete prive delle estensioni di rete e marcate con l'etichetta no wireless extension non dispongono delle informazioni dette sopra. Se siamo interessati alle informazioni di un solo dispositivo wireless dobbiamo allora passare al comando iwconfig il nome del dispositivo.
E' evidente che per impostare il dispositivo wireless occorre passare al comando l'opzione da modificare e il relativo valore. Vi elenco le opzioni più usate (altre informazioni sono disponibili nella pagina del manuale dedicata al comando, man iwconfig):
  • essid: con questa opzione possiamo impostare l'access point per la scheda di rete wireless. Ad esempio, il comando iwconfig wlan0 essid "MyRouter" assegna al dispositivo wlan0 l'ESSID di nome MyRouter;
  • mode: specifica una delle possibili modalità di funzionamento per la scheda di rete wireless il cui valore da passare al comando dipende dalla topologia della rete che abbiamo in mente. Fra le tante configurazioni a nostra disposizione le più usate sono: managed (l'access point crea una rete identificata dall'ESSID e i dispositivi wireless si collegano ad essa), ad-hoc (più dispositivi sfruttano la propria interfaccia wireless per formare una rete, collegandosi fra di loro), master (la scheda wireless impostata con questo valore diventa l'access point per altri dispositivi wireless), repetear (la scheda di rete wireless inoltra i pacchetti ricevuti a un altro dispositivo wireless);
  • freq/channel: imposta la frequenza del canale per la scheda di rete wireless. Attenzione, ogni valore intero inferiore a 1800 viene inteso dal comando come un numero di canale, ogni valore intero superiore a 1800 viene invece interpretato come frequenza per il canale. Possiamo eventualmente utilizzare i prefissi K, M e G (per conoscere il numero di canali della scheda di rete wireless usate il comando iwlist). I valori off e/o auto lasciano scegliere alla scheda wireless il canale e la frequenza migliore;
  • ap: costringe la scheda di rete wireless a registrarsi presso l'acces point il cui indirizzo MAC è quello indicato sulla riga di comando (iwconfig wlan0 ap 00:11:22:33:44:55);
  • retry: modifica il massimo numero di ritrasmissioni per i pacchetti (iwconfig wlan0 retry 5);
  • key: se l'access point a cui ci si vuole collegare è protetto da una password occorre allora indicare la stessa sulla riga di comando. La chiave usata per la connessione è solitamente un valore esadecimale, se essa è invece una stringa di caratteri va preceduta dal suffisso s:, ad esempio iwconfig wlan0 key s:password. Se l'access point non usa nessuna chiave per la connessione dobbiamo usare il valore open, ad esempio iwconfig wlan0 key open;
Finora abbiamo visto come modificare le impostazioni della scheda di rete wireless con un comando alla volta. Ovviamente possiamo modificare le stesse impostazioni anche con un unico comando: iwconfig wlan0 essid "MyRouter" ap 00:11:22:33:44:55 key s:mypassword.

sabato 18 dicembre 2010

Accesso remoto a un computer, con telnet

L'accesso remoto a un computer, per la gestione di file e l'uso di particolari servizi di rete, è sempre stata una prerogativa principale dei sistemi operativi GNU/Linux. Non a caso l'elenco dei comandi e dei tool messi a disposizione dell'utente per la gestione delle connessioni di rete è assai lungo. Il comando telnet, che realizza l'interfaccia all'omonimo protocollo di rete (definito nelle RFC 854 e 855), è uno dei comandi più utilizzati. Se il comando telnet viene invocato senza alcun parametro si accede alla modalità a comando prevista dal client (nel terminale dovrebbe comparire un nuovo prompt, telnet>). L'utente può allora impartire al client i comandi necessari all'accesso dei servizi e delle risorse di rete. Alcuni di questi sono:
  • status: ritorna lo stato di telnet;
  • open host porta: apre una connessione di rete verso l'host indicato, e alla porta indicata. Se nessuna porta viene indicata, telnet ne utilizza una di default;
  • mode type: permette, a seconda dello stato di telnet, l'impostazione di una delle modalità previste dal comando (character, line etc...);
  • close: chiude la sessione telnet e ritorna alla modalità a comandi;
  • quit: chiude il client di telnet;
Per un elenco completo vi rimando alle pagine del manuale dedicate al comando (man telnet). Il secondo utilizzo di telnet permette un accesso rapido alle risorse di rete, in tal caso è sufficiente passare al comando l'indirizzo ip dell'host da contattare.
In tutti i servizi di rete è indispensabile definire ruoli ben precisi ai vari host che partecipano alla connessione. L'host che offre un servizio viene detto server, quello che ne richiede i servizi è invece detto client. A seconda dei ruoli, quindi, per realizzare l'accesso remoto a un computer, va installata la parte client e/o la parte server dell'applicazione. Nel caso di telnet l'installazione del client e del server si risolve, rispettivamente, con sudo apt-get install telnet e sudo apt-get install telnetd. Quest'ultimo corrisponde al daemon (disk and execution monitor) di telnet: il servizio di rete, su protocollo telnet, che si pone in attesa di eventuali connessioni (in altre parole il server).
La connessione a un host avviene, dunque, solo se su quest'ultimo è in esecuzione il server di telnet, telnetd. Se su un host possono essere disponibili più servizi chi si preoccupa, allora, della loro gestione? La risposta è molto semplice: inetd (internet services daemon), un daemon che controlla i servizi Internet! Tale servizio, a causa di alcune sue limitazioni, è stato recentemente sostituito da xinetd. In ogni caso, per avviare il servizio telnet cercate il daemon sulla vostra distribuzione GNU/Linux a cui è stato assegnato questo compito.
Il file di configurazione /etc/inetd.conf associa l'esecuzione di un programma non appena giunge una richiesta di connessione all'host. All'interno di questo file viene dedicata una riga per ogni servizio di rete, con la seguente sintassi: service_name sock_type proto flags user server_path args. Le righe vuote e quelle che iniziano con il carattere # sono ignorate da inetd (commentate una riga se volete quindi disabilitare un servizio di rete). In questa immagine potete vedere il file /etc/inetd.conf presente sul mio Aspire One:


Per avviare il servizio appena configurato ho installato openbsd-inetd, con il comando sudo apt-get install openbsd-inetd. Il servizio telnet (prima configurato in /etc/inetd.conf, avete controllato questo file?) è stato quindi avviato con il comando sudo /etc/init.d/openbsd-inetd start.
Con il comando netstat possiamo conoscere le connessioni in corso sul nostro computer, sia in entrata che in uscita. Il comando in realtà fornisce altre informazioni, in questo contesto è stato tuttavia utilizzato per rilevare la presenza del daemon di telnet. Digitate il comando netstat -a | grep telnet, se tutto è andato per il verso giusto ci verrà ritornata una riga (quella che fa riferimento al servizio telnet, il cui stato, come riporta l'ouput è su LISTEN, in ascolto).
Tutti i comandi fin qui visti sono stati ripetuti su due computer: un netbook (Aspire One) il cui indirizzo ip nelle prossime immagini è stato ricoperto con un rettangolo rosso e un PC desktop, il cui indirizzo ip nelle prossime immagini è stato invece ricoperto con un rettangolo blu. Sul netbook era installata Xubuntu 10.04 (Lucid Lynx), sul PC desktop Xubuntu 9.10 (Karmic Koala). Ho quindi creato sui due computer un file con lo stesso nome (NEW_FILE.txt) ma dal contenuto differente. Per realizzare una connessione remota all'host occorre passare a telnet l'indirizzo ip dell'host da contattare: telnet indirizzo_ip. Se la connessione riesce vi verrà chiesto il nome utente e la password in uso presso l'host remoto. Se il login riesce senza nessun errore possiamo allora interagire con l'host contattato, come se fossimo seduti davanti al computer remoto! Nelle immagini che seguono potete vedere la connessione dal PC verso il netbook:



In queste immagini, invece, potete vedere la connessione dal netbook al PC:



Qui, infine, la connessione remota è stata realizzata su un PC dotato di sistema operativo Windows XP, sempre verso il netbook:


Usare telnet è davvero semplice ma allo stesso tempo poco sicuro poiché la connessione creata non è protetta in alcun modo. La trasmissione dei pacchetti avviene in chiaro, le informazioni non sono cioè codificate. La password digitata in fase di login, ad esempio, è allora facilmente intercettabile! Per questo motivo è preferibile usare ssh (secure shell) al posto di telnet, oppure telnet-ssl (la versione con protocollo SSL di telnet).

venerdì 17 dicembre 2010

Configurare le interfacce di rete con ifconfig - seconda parte

Con ifconfig, oltre a rimediare le informazioni sullo stato delle interfacce di rete, possiamo impostare i parametri che ne determinano il funzionamento.
La nostra scheda di rete (sia wifi che su cavo ethernet) riceve i pacchetti che transitano sulla rete locale (ad esempio quelli trasmessi da un router oppure diffusi da uno switch). In un normale scenario di funzionamento il dispositivo prende in considerazione i pacchetti che sono effettivamente indirizzati verso l'interfaccia di rete dell'utente. In alcuni casi, ad esempio per attività di sniffing, è essenziale impostare in modalità promiscua l'interfaccia di rete da utilizzare.
Quando un'interfaccia di rete è in modalità promiscua il dispositivo si pone in ascolto di tutti i pacchetti che transitano sulla rete (locale)! Ad esempio, con il comando sudo ifconfig eth0 promisc impostiamo l'interfaccia di rete eth0 sulla modalità promiscua.


Con il comando sudo ifconfig eth0 -promisc, invece, viene disattivata la modalità promiscua all'interfaccia di rete eth0. L'indirizzo broadcast è l'indirizzo ip usato dall'interfaccia di rete per trasmettere i pacchetti a tutti gli host della stessa sottorete. Tale indirizzo può essere impostato con il comando sudo ifconfig eth0 broadcast INDIRIZZO_IP. Per abilitare l'uso del protocollo ARP (address resolution protocol) sull'interfaccia di rete, passata come argomento al comando, va usata l'opzione arp (ad esempio sudo ifconfig eth0 arp). Con -arp, invece, disabilitiamo il protocollo ARP.
L'mtu può essere regolato con l'omonima opzione mtu, a cui deve seguire la dimensione massima in byte dei pacchetti da trasmettere (che su ethernet può essere al massimo 1500 byte).
Infine, se l'interfaccia di rete lo permette, possiamo variare l'indirizzo hardware MAC con l'opzione hw, a cui deve seguire il tipo o classe del dispositivo e il nuovo indirizzo. Ad esempio, il comando sudo ifconfig eth0 hw ether AA:BB:CC:DD:EE:FF assegna all'interfaccia di rete eth0 un nuovo indirizzo MAC (le classi supportate sono: ether, ax25, ARCnet e netrom). Infine, l'indirizzo ip per l'interfaccia di rete può essere specificato con l'opzione address, il comando sudo ifconfig eth0 address 192.168.0.101 assegna l'ip 192.168.0.101 all'interfaccia di rete eth0!

giovedì 16 dicembre 2010

Configurare le interfacce di rete con ifconfig - prima parte

Le interfacce di rete rilevate all'avvio dal kernel di Linux sono configurate attraverso il comando ifconfig. La maggior parte dei comandi associati a ifconfig, soprattutto quelli dedicati alle impostazioni delle interfacce di rete, richiedono i privilegi dell'utente root. Le informazioni prodotte dal comando sono invece accessibili a tutti gli utenti.
Se scriviamo nel terminale il comando ifconfig senza ulteriori opzioni riceviamo una lista delle interfacce di rete attive e riconosciute dal kernel. Per un elenco completo occorre passare al comando l'opzione -a (all). Pertanto, il comando ifconfig -a ritorna una lista di tutte le interfacce di rete, sia quelle attivate che quelle disattivate (molto spesso lo stato di una periferica di rete viene detto up se la scheda di rete è attivata, altrimenti è down).
L'output di ifconfig raggruppa diverse informazioni sotto l'etichetta associata al nome del dispositivo di rete. Se siamo interessati alle informazioni di un solo dispositivo possiamo allora passare ad ifconfig il suo nome. Per modificare lo stato di un'interfaccia di rete va indicato al comando il nome del dispositivo e una delle due opzioni: up per attivare il dispositivo, down per disattivarlo. Ad esempio, il comando sudo ifconfig eth0 down spegne l'interfaccia di rete eth0, la porta ethernet della scheda di rete.
Attenzione, i nomi dati alle periferiche di rete rilevate possono variare in base alla distribuzione GNU/Linux usata. Osservate le informazioni prodotte dal comando sul mio Aspire One:


Vengono riconosciute tre interfacce di rete: eth0 (la porta ethernet), lo (l'indirizzo di loopback) e wlan0 (la scheda wifi). Per ognuna di queste vengono indicati il numero e i byte (preceduti eventualmente dai prefissi K,M e G) di pacchetti trasmessi e ricevuti. Se un dispositivo di rete è collegato a Internet, ifconfig riporta in corrispondenza della riga inet addr l'indirizzo ip del dispositivo. In corrispondenza della riga HWaddr possiamo invece leggere l'indirizzo MAC (medium acces control) della periferica.
L'mtu (maximum transmission unit) è la dimensione in byte dei pacchetti inviati attraverso il protocollo di rete utilizzato dal dispositivo (che per pacchetti trasmessi con ethernet può essere al massimo 1500 byte). Su una delle righe generate da ifconfig, per ogni dispositivo, viene inoltre riportato lo stato e il tipo di setup applicato all'interfaccia di rete. Notate, ad esempio, la riga UP BROADCAST RUNNING MULTICAST per l'interfaccia wlan0. La scheda di rete wifi del mio Aspire One è attiva (up) ed è configurata alla modalità broadcast, per l'invio di dati a più host, e in modalità multicast, per l'invio di dati agli host interessati (che si registrano a un servizio).

mercoledì 15 dicembre 2010

Come caricare (automaticamente) un modulo del kernel all'avvio del S.O.

Come ben sappiamo il kernel di Linux ha una struttura modulare. Nuovi moduli possono essere aggiunti alla configurazione di base del kernel per estenderne le funzionalità e garantire il supporto all'hardware appena inserito. Un modulo può essere aggiunto con i comandi modprobe o insmod. Se vogliamo evitare di scrivere ogni volta il comando per l'aggiunta di un modulo nel kernel possiamo allora affidarci (se state usando una distribuzione Ubuntu) al file /etc/modules. Attraverso questo file possiamo indicare i moduli da caricare nel kernel all'avvio del sistema operativo. Potete leggere il contenuto di questo file con il comando less /etc/modules. Aggiungete in questo file, su una nuova riga, il nome del modulo da caricare all'avvio del sistema operativo. Le righe vuote e quelle che iniziano con il simbolo # vengono ignorate. Potete aprire il file in scrittura con il comando sudo mousepad /etc/modules (l'utente semplice non ha infatti i permessi in scrittura su questo file), se avete Mousepad fra le vostre applicazioni. Altrimenti sostituite la stringa mousepad nel comando con quella che esegue il vostro editor preferito (sudo nome_editor /etc/modules). Se vi trovate su Linpus lite o Fedora il file che si occupa di caricare i moduli all'avvio è /etc/modules.conf.

martedì 14 dicembre 2010

Palm Treo 650: sincronizzazione con Ubuntu

La sincronizzazione di un dispositivo Palm può avvenire senza troppi problemi anche sui sistemi operativi GNU/Linux, dove HotSync Manager (il software in dotazione con il dispositivo Palm per la sincronizzazione con i PC Windows) non è disponibile. Le applicazioni più usate su GNU/Linux sono generalmente: J-Pilot, KPilot, GnomePilot etc...
Il corretto funzionamento delle suddette applicazioni viene garantito dalla libreria pilot-link, che raccoglie numerosi comandi all'interno dell'omonimo pacchetto pilot-link. Scegliete voi il front-end per dialogare con il vostro dispositivo Palm, fra un po vi mostrerò come è possibile fare le stesse operazioni attraverso semplici comandi!
Per l'installazione del pacchetto in questione su Ubuntu (ho testato tutti i comandi in questo articolo sul mio Aspire One, con Xubuntu) possiamo affidarci al comando sudo apt-get install pilot-link. Per Linpus lite l'installazione avviene, invece, con il comando sudo yum install pilot-link.
Se l'installazione del pacchetto pilot-link è riuscita senza problemi disponiamo, adesso, di un nuovo set di comandi per sincronizzare file, installare e rimuovere applicazioni, salvare file multimediali etc...
Prima di iniziare a vedere la sintassi dei comandi più usati è meglio fare un'importante precisazione su come passare agli stessi il riferimento al dispositivo collegato. Come ben sappiamo, nei sistemi operativi GNU/Linux ogni dispositivo è rappresentato da un file. Nel caso dei dispositivi Palm tale file viene creato solo dopo aver premuto il tasto che avvia la sincronizzazione (quello disposto sotto la presa del cavo che usiamo per collegare la periferica al computer).
Se infatti eseguite il comando lsusb prima e dopo la pressione del suddetto tasto, noterete nell'output del comando il riconoscimento del palmare. Durante la prova da me effettuata non ho dovuto aggiungere nessun modulo al kernel (2.6.32-21-generic).


In molte guide sparse nella rete viene usato il file /dev/ttyUSB1 per mappare il dispositivo (creato sempre in fase di sincronizzazione). Altri, invece, creano nella cartella dei dispositivi (/dev) il file pilot, collegandolo simbolicamente a /dev/ttyUSB1. Qui trovate una descrizione della procedura più usata. Tutti i comandi della suite pilot-link permettono di indicare sia il nome del dispositivo che la porta usata dallo stesso. Un modo più semplice, quindi, per direzionare i comandi verso un dispositivo Palm è l'uso dell'opzione -p (port).
Il comando più usato è pilot-xfer:
  • Per installare un programma: pilot-xfer -p usb: -i file.prc;
  • Per effettuare il backup del dispositivo: pilot-xfer -p usb: -b backup_dir;
  • Per ripristinare un backup sul dispositivo: pilot-xfer -p usb: -r backup_dir;
  • Per ottenere una lista del software installato sul dispositivo: pilot-xfer -p usb: -l;
Un altro comando particolarmente utile è pilot-foto, che permette di aggiungere, prelevare e cancellare immagini e video dal palmare:
  • Per prelevare tutti i file dal palmare: pilot-foto -p usb: -F;
  • Per prelevare un singolo file dal palmare: pilot-foto -p usb: -f file;
  • Per ottenere una lista dei file: pilot-foto -p usb: -l;
  • Per aggiungere un file: pilot-foto -p usb: -i file;
  • Per cancellare un file: pilot-foto -p usb: -d file;
  • Per cancellare tutti i file: pilot-foto -p usb: --delete-all;
Con alcuni di questi comandi a volte mi viene ritornato nell'output un errore relativo al database dei file (Unable to open PhotosDB-Foto), riproverò alla prossima formattazione del dispositivo.
Se avete come me un palmare Palm Treo 650 meglio usare un comando dedicato, pilot-foto-treo650:
  • Per copiare tutti le immagine e video nella directory di lavoro: pilot-foto-treo650 -p usb: -w;


lunedì 13 dicembre 2010

Aggiungere nuovi moduli al kernel

Per l'aggiunta di nuovi moduli nel kernel l'utente dispone di due comandi: insmod e modprobe. insmod aggiunge un modulo senza fare tanti controlli e questo non è proprio efficiente. Talvolta il caricamento del modulo può fallire se il modulo che stiamo cercando di aggiungere nel kernel dipende da altri moduli. Per questo motivo se aggiungiamo nuovi moduli al kernel con insmod dobbiamo farlo nell'ordine giusto! La sintassi per usare insmod è davvero molto semplice, con insmod NOME_MODULO aggiungiamo il modulo di nome NOME_MODULO al kernel. In alcuni casi occorre specificare a insmod il path per il modulo da aggiungere al kernel (che altrimenti verrà cercato in altre cartelle di sistema). Tale path va eventualmente passato al comando anteponendo un trattino (-) al path stesso (ad esempio: insmod -/home/Downloads/new_module.ko).
modprobe permette sia l'aggiunta che la rimozione di moduli nel kernel. I moduli vengono cercati nella cartella di sistema /lib/modules/VERSIONE_DEL_KERNEL.
Ogni eventuale dipendenza con altri moduli viene risolta mediante l'uso di un albero delle dipendenze, costruito da depmod (che riassume nel file modules.dep tutte le dipendenze fra moduli). Alcune distribuzioni GNU/Linux eseguono il comando depmod -a (all) all'avvio, in questo modo l'intero l'albero delle dipendenze dei moduli viene aggiornato. Se si fa seguire a modprobe il nome del modulo da caricare, verranno allora caricati prima tutti i moduli necessari al modulo indicato sulla riga di comando, quindi, per ultimo, verrà caricato il modulo che abbiamo richiesto.
Se uno dei moduli di supporto al modulo richiesto non viene caricato (in tal caso vi consiglio di cercare eventuali messaggi di errori con dmesg) modprobe provvede alla rimozione dei moduli nel kernel fin li inseriti!
La sintassi, come potete intuire, è nella sua forma base davvero semplice. Con il comando modprobe NOME_MODULO vengono caricati tutti i moduli di supporto al modulo di nome NOME_MODULO, quindi il modulo stesso.
Il comando modprobe prevede diverse opzioni, con -r (remove) il comando rimuove dal kernel il modulo il cui nome viene passato come argomento. Se i moduli di supporto precedentemente caricati per l'avvio di un modulo non servono più verranno anch'essi rimossi dal kernel. Un utile opzione è -l (list) che stampa l'elenco di tutti i moduli disponibili sul sistema! Per filtrare l'output possiamo usare il carattere * per descrivere la base per un nome. Senza dimenticare grep! Con l'opzione -t (type), infine, possiamo caricare nel kernel tutti i moduli di una certa tipologia. L'opzione fa riferimento alle rispettive cartelle di sistema che ospitano i moduli del kernel, come ad esempio: net, sound, drivers. Ad esempio, con il comando modprobe -t net vengono installati tutti i moduli della cartella net. Anche in questo caso possiamo essere più precisi se dopo la tipologia di moduli indichiamo anche una base per i nomi. Ad esempio, modprobe -t net installa tutti i moduli della cartella net. Quest'ultima opzione può essere usata assieme all'opzione -l per limitare la stampa dei moduli disponibili a quella con i moduli del tipo selezionato. Ad esempio, modprobe -l -t drivers elenca tutti i moduli della cartella drivers.
La rimozione di un modulo può avvenire anche con rmmod, che elimina solo il modulo specificato. Meglio allora affidarsi a modprobe -r che, come abbiamo già visto, svolge un ottimo lavoro!

sabato 11 dicembre 2010

ScummVM su Xubuntu

ScummVM (Script Creation Utility for Maniac Mansion Virtual Machine) è un emulatore che permette l'esecuzione di vecchi giochi punta e clicca come: Monkey Island (e tutti i giochi LucasArts), Broken Sword, Discworld etc... ScummVM è disponibile per diverse piattaforme: Windows, GNU/Linux, PalmOS, PocketPC etc... In questo articolo vi mostrerò l'installazione di ScummVM su Xubuntu.
L'installazione sui sistemi Ubuntu si risolve con il comando sudo apt-get install scummvm. Se non viene trovato nessun pacchetto software con questo nome provate, allora, ad aggiornare la lista dei software con sudo apt-get update.
Trovate altre informazioni sul sito di riferimento dell'applicazione, alcune particolarmente interessanti nella sezione dedicata al download. Al termine dell'installazione troverete l'emulatore ScummVM nel menu "Giochi" del vostro sistema operativo Ubuntu. All'avvio l'applicazione si presenta con una schermata simile a quella che segue:


Per la configurazione di un nuovo gioco occorre cliccare sul bottone "Add Game" e indicare il path alla directory con i file del gioco. Se disponete già di tale cartella potete procedere all'avvio del gioco. Per la prova di questo emulatore ho scelto di installare Discworld.
Sul sito dedicato a ScummVM trovate un'interessante wiki con un elenco dei file utili all'avvio dei giochi. Se state provando ad avviare un gioco non dimenticate di consultare quell'elenco! Per procurarmi la cartella di installazione del gioco sono stato costretto a installarlo dal mio vecchio cd su un computer con sistema operativo Windows. Al termine dell'installazione ho quindi copiato la cartella del gioco sul file system del mio Aspire One (dove in precedenza ho installato ScummVM). Questo passaggio è indispensabile se vogliamo far riconoscere all'emulatore i file del gioco:


Selezionate la cartella del gioco cliccando sul bottone "Chose". Se l'emulatore riconosce i file del gioco vi sarà data la possibilità di configurarlo per l'avvio:


La maggior parte delle impostazioni di default è sufficiente ad avviare il gioco senza problemi. Assicuratevi di selezionare sempre la giusta piattaforma del gioco da emulare. Durante la prova ho sperimentato diversi filtri video che potete selezionare attraverso la scheda "Graphics":


Dopo aver impostato i vari parametri per la configurazione del gioco non dimenticate di cliccare sul bottone "Ok". In questo modo ritornerete alla schermata principale di ScummVM. Questa volta, però, il gioco che abbiamo precedentemente aggiunto sarà presente nell'elenco! Selezionatelo e cliccate sul bottone "Start" per avviarlo:


Il gioco verrà caricato in breve tempo. L'emulatore si comporta molto bene sull'Aspire One senza impegnare eccessivamente il processore e la memoria ram (la cui occupazione si aggira mediamente intorno ai 12MB, ovviamente dipende dal gioco e dalle fasi di gioco).



Buon divertimento!

venerdì 10 dicembre 2010

Come cercare informazioni su un modulo del kernel

Avete provato a eseguire il comando lsmod sul vostro sistema operativo GNU/Linux? Siete curiosi di sapere cosa fa ogni modulo elencato nell'output di lsmod?
Esiste una risposta anche a questo. Il comando da usare è modinfo NOME_MODULO, dove NOME_MODULO è il nome del modulo di cui vogliamo ricevere spiegazioni. L'output ci ritornerà informazioni preziose come: il nome del file, il nome dell'autore, una descrizione breve, eventuali dipendenza con altri moduli, la versione del modulo e i parametri che è possibile passare al modulo.

giovedì 9 dicembre 2010

Come ottenere la lista dei moduli nel kernel

Il comando lsmod (list of moule) stampa la lista dei moduli presenti nel kernel. L'output viene disposto su tre colonne: nella colonna Module viene riportato il nome del modulo; nella colonna Size, invece, è possibile leggere l'occupazione in memoria (in byte) del modulo; nella colonna Used by, infine, viene indicato il numero di moduli che utilizzano il modulo (se il numero è piccolo vengono indicati anche i singoli moduli).
L'output, a seconda della vostra configurazione, può essere più o meno lungo. Se dovete verificare la presenza di un modulo non dimenticate allora di usare il comando grep! Ad esempio, se voglio stabilire la presenza del modulo acerhdf (che si occupa della gestione della ventola di raffreddamento sui portatili Acer) userò questo comando: lsmod | grep acerhdf.

martedì 7 dicembre 2010

Il kernel e i moduli

Quante cose deve saper fare il nostro sistema operativo all'avvio?
Non mi riferisco al software di base che solitamente accompagna una distribuzione GNU/Linux. La mia domanda non era riferita allo strato software solitamente usato dall'utente, quello applicativo. Il supporto alla rete oppure a una periferica può sembrare banale. L'hardware, però, varia da sistema a sistema e non tutto può funzionare al primo colpo. Il kernel realizza una virtualizzazione dell'hardware, favorendone l'interazione (mediante chiamate di sistema). E’ proprio questa estensione che consegna nelle mani del programmatore (e dell'utente) una realtà molto più semplice, fatta di operazioni astratte per l’interazione con i dispositivi di I/O (periferiche) e per l’esecuzione contemporanea di più programmi. Una classificazione dei kernel può essere fatta proprio in base al grado di astrazione dell'hardware. Esistono varie tipologie di kernel, fra queste abbiamo: kernel monolitici, micro kernel, kernel ibridi e exokernel.
Il kernel usato nei sistemi operativi GNU/Linux è di tipo monolitico, l'accesso all'hardware avviene attraverso l'uso di un set di chiamate, dette system calls. Il kernel si occupa della gestione dell'hardware, dei processi in esecuzione, dell'allocazione delle risorse etc... Pensate a unico blocco capace di svolgere tutte le operazioni citate sopra (la lista è assai più lunga). Tale blocco, allora, può crescere a dismisura se il kernel deve favorire il supporto a una infinità di dispositivi!
Attraverso l'uso dei moduli l'immagine del kernel in memoria può essere ridotta a dimensioni ragionevoli. La cosa bella del kernel di Linux è la sua modularità. Un modulo può estendere le funzionalità del kernel e può essere caricato in memoria solo quando occorre realmente! Per questo motivo, se un dispositivo appena collegato non sembra funzionare al primo colpo molto probabilmente il vostro kernel non ha in memoria il modulo capace di gestirne le funzionalità.
La nostra distribuzione GNU/Linux si affida a una configurazione base del kernel. Durante la compilazione del kernel possiamo indicare i moduli che devono essere presenti in memoria e quelli, invece, che verranno caricati all'occorrenza. Alcuni utili comando per la gestione dei moduli sono: lsmod, modinfo, insmod, modprobe ed rmmode.

lunedì 6 dicembre 2010

Messaggi del kernel

All'avvio di un sistema operativo GNU/Linux vengono mostrate numerose informazioni sullo standard output, il monitor. Non sempre riusciamo a leggerle tutto. Man mano che il kernel viene caricato in memoria vengono generati questi messaggi informativi, utili in molti casi alla diagnostica del nostro computer. Vengono notificate le risorse hardware riconosciute e configurate, i moduli caricati, gli errori verificati. Vi consiglio di allegare sempre l'output generato da dmesg a una vostra richiesta di aiuto nei tanti forum che si occupano di Linux. Il comando dmesg produce una lista con gli eventi che si sono verificati a partire dall'avvio del sistema operativo.
Per scorrere l'output vi consiglio di usare dmesg con una pipe ai comandi less o more. Ad esempio, con dmesg | more scorriamo l'output una pagina alla volta. Con dmesg | less, invece, possiamo eventualmente tornare dietro (con i tasti freccia). Possiamo direzionare l'output su un file con il comando dmesg > boot_messages.txt e leggerlo in un secondo momento, oppure allegarlo alla nostra richiesta di aiuto.
Vi ricordate ancora del comando grep? Perché non utilizzarlo per cercare il testo all'interno dell'output generato da dmesg? E' semplice! Ad esempio, per la stampa delle righe di testo con la stringa usb date il comando dmesg | grep usb (oppure dmesg | grep -i usb). I messaggi del kernel vengono salvati nel file dmesg della cartella /var/log/. Provate il comando less /var/log/dmesg, troverete nel file lo stesso output generato dal comando dmesg (voi, però, utilizzate il comando che vi ho appena presentato).

sabato 4 dicembre 2010

Mouse da dito


Nell'immagine sopra potete vedere il mouse da dito (finger mouse) che ho provato qualche giorno fa. In rete sono disponibili diversi modelli, esteticamente tutti uguali fra loro. Il modello da me provato (sulla confezione c'era scritto "The lord of the rings") prevedeva un sensore ottico da 1200 dpi (altri modelli usano sensori da 800 dpi) con una fascia elastica (regolabile, a strappo). Il filo, come si vede nella foto, è invece rivestito. Sulla confezione viene garantito il funzionamento con tutti i sistemi operativi Windows. L'ho provato su Xubuntu (una distribuzione GNU/Linux), il mouse da dito viene riconosciuto senza problemi. Non poteva essere diversamente, trattandosi di un semplice mouse ottico più piccolo. Come si usa?
Il mouse va allacciato alla seconda falange dell'indice, con il pollice si riesce tranquillamente a premere i bottoni e far ruotare la rotellina al centro. Dosate la forza che date al pollice quando cliccate uno dei due bottoni, un clic troppo forte potrebbe spostare il mouse e quindi il puntatore sul desktop. Possiamo usare il mouse su molte superficie, non necessariamente piane. Funziona davvero bene, provate ad esempio sulla gamba. Evitate superfici lucide e/o riflettenti, in tal caso il sensore ottico vi ritorna un puntatore del mouse instabile (e mai fermo, quasi tremante). Il mouse rileva lo scorrimento solo se è in prossimità di una superficie (a qualche centimetro), potete quindi scrivere con la tastiera senza far impazzire il puntatore.
Personalmente preferisco il mouse classico, quando non ho piani di appoggio ripiego sul pad del portatile. Per adesso l'unica comodità che ho riscontrato in questo dispositivo sta nella lettura di documenti, quando cioè occorre solo scorrere la pagina in alto o in basso con la rotellina. Se pensate di scrivere per un po meglio allora sfilarlo dalla mano. Il fascio di luce generato dal sensore può essere fastidioso, soprattutto quando non utilizziamo il mouse (ad esempio quando scriviamo sulla tastiera). L'ingombro del dispositivo è davvero minimo, se vi occorre non avete, allora, problemi a metterlo nella borsa.

venerdì 3 dicembre 2010

Monitorare i processi in esecuzione con top

top (task of process) è un vero e proprio task manager eseguibile da riga di comando e funzionante all'interno del terminale. top è diverso da ps poiché realizza una vista dinamica sui processi in esecuzione sul sistema operativo. L'utente può interagire con il programma, modificare l'ordine dei processi e richiedere informazioni.
Nella parte superiore della schermata viene mostrato all'utente un resoconto sullo stato attuale del sistema operativo con svariate informazioni, fra queste troviamo: il numero di processi in esecuzione (e conteggio dei vari processi negli stati running, sleeping, stopped e zombie), la percentuale di utilizzo del processore e lo stato della memoria (utilizzata, disponibile).
Nella parte inferiore della schermata l'output è uguale a quello che solitamente ci propone il comando ps. La differenza con quest'ultimo è la dinamicità della lista dei processi, ordinati di default in base all'utilizzo del processore. Con h (help) riceviamo istruzioni su come interagire con il programma.
L'applicazione viene eseguita con delle impostazioni di default che possono essere modificate in un secondo momento. La schermata viene aggiornata ogni 3 secondi, possiamo variare questo valore premendo il tasto d (delay). Ci verrà chiesto un nuovo valore per l'operazione di refresh. Premendo il tasto Invio, oppure la barra spaziatrice, forziamo l'aggiornamento della schermata di top. Con q (quit) terminiamo il programma. Il numero di processi da monitorare è di default illimitato, dovrebbe cioè adattarsi alla dimensione della vostra finestra di terminale. Premendo il tasto n (number) possiamo dire al programma di limitare l'output al numero di processi che indicheremo (dopo la pressione del tasto il programma ci chiederà quanti processi visualizzare).
Una delle operazioni più utili e semplici da realizzare con top è la chiusura di un processo. In tal caso è sufficiente premere il tasto k (kill) e indicare il pid del processo da terminare! Possiamo ordinare i processi secondo molti criteri: con A i processi sono ordinati in base alla colonna START TIME, con M in base alla colonna %MEM (che indica la percentuale di memoria ram usata), con N in base alla colonna PID, con P in base alla colonna %CPU (che indica la percentuale di utilizzo del processore) e con T in base alla colonna TIME.

giovedì 2 dicembre 2010

Pidgin: nuova versione

La nuova versione di Pidgin, rilasciata qualche giorno fa (sia per Windows che per GNU/Linux), corregge l'errore descritto qui. Il problema relativo alla validazione del certificato omega.contact.msn.com è stato quindi risolto. Invito gli utenti Linux (in particolare quelli di Ubuntu) a installare la nuova versione con queste istruzioni:
  • Aggiungere l'indirizzo del repository per Pidgin con il comando sudo add-apt-repository ppa:pidgin-developers/ppa;
  • Aggiornare il database locale dei pacchetti software disponibili con il comando sudo apt-get update (dopo aver eseguito questo comando potrebbe comparire una notifica, l'Update Manager notifica la disponibilità di due aggiornamenti);
  • Disinstallare la vecchia versione di Pidgin con sudo apt-get purge pidgin;
  • Installare la nuova versione di Pidgin con sudo apt-get install pidgin;
L'esecuzione di quest'ultimo comando vi segnalerà la disponibilità di due pacchetti o aggiornamenti. Confermate, quindi, l'installazione dei pacchetti, non occorre molto tempo. Avviate Pidgin, adesso non dovrebbero esserci più problemi!

Monitorare i processi in esecuzione con ps

ps (process snapshot) è un utile programma per monitorare i processi in esecuzione sul nostro sistema operativo GNU/Linux. Se usato, nella sua forma base, il comando non torna molte informazioni. Ecco, allora, che è necessario passare allo stesso una o più opzioni.
Per ottenere una lista di tutti i processi in esecuzione occorre passare al comando l'opzione -A (all), ps -A, oppure l'opzione -e. Con l'opzione x si ottiene una stampa dei processi in esecuzione posseduti e/o comunque eseguiti dallo stesso utente che invoca ps. Con l'opzione a viene prodotta una lista assai più lunga, contenente tutti processi di tutti gli utenti. Pertanto, combinando le opzioni fin qui viste, con ps -ax otteniamo una stampa di tutti i processi in esecuzioni. Se siamo invece interessati ai processi eseguiti da un utente (GNU/Linux è multi utente, ricordate) l'opzione da passare al comando è -U nome_utente, dove nome_utente è il nome utente da cercare nella lista dei processi. Ad esempio, con il comando ps -AU light-kun viene stampata la lista di tutti i processi posseduti dall'utente light-kun.
Le informazioni ritornate nell'output del comando sono davvero preziose. Fra queste, nelle tante colonne stampate, troviamo: USER, l'utente che ha eseguito il comando; PID, il process id assegnato al processo (utile se vogliamo chiudere un applicazione che non ci risponde da tempo); %CPU e %MEM le percentuali che indicano, rispettivamente, l'occupazione del processore e della memoria ram da parte del processo; START, l'orario di esecuzione del processo; TIME, l'ultima misura del tempo di esecuzione del processo; COMMAND, il comando che ha eseguito il processo (utile se stiamo cercando le opzioni passate a un'applicazione); STAT, indica lo stato del processo.
ps ricava le informazioni sui processi in esecuzione nella cartella di sistema /proc. All'interno di questa esiste una cartella per ogni processi il cui nome è proprio il PID del processo. Ora, però, usate ps per ricevere informazioni sui processi. E non dimenticate di filtrare l'output, se troppo lungo, con grep!

mercoledì 1 dicembre 2010

La gestione dei processi

La gestione dei processi è sicuramente un argomento delicato ma allo stesso tempo utile. Solitamente, quando un programma non risponde ai nostri comandi ci piacerebbe chiuderlo ed eventualmente riprovare. La maggior parte delle distribuzioni GNU/Linux prevede un task manager per la gestione dei processi. Qui però ci occuperemo della gestione dei processi attraverso la riga di comando. Con kill e killall possiamo chiudere uno o più processi.
Il comando kill chiude il processo legato al PID passato come parametro. Il comando killall, invece, chiude tutti i processi generati dallo stesso programma (o eseguibile).
In realtà i comandi kill e killall inviano ai processi dei segnali. Alcuni di questi segnali possono essere ignorati dai processi (i programmi in esecuzione), altri invece non possono essere ignorati. Il segnale inviato di default per entrambi i comandi è il segnale TERM (valore numerico 15), che dice al processo di chiudersi. Ogni segnale ha un codice sicché possiamo dire ai comandi il segnale da inviare attraverso quest'ultimo, oppure indicare il segnale da inviare attraverso il nome. Ad ogni segnale corrisponde un'azione. Per un elenco dei segnali e delle azioni associate consultate le pagine del manuale in linea, con il comando man kill oppure man killall. La sintassi usata dal comando è kill -segnale PID , oppure killall -segnale NOME_PROCESSO. Dove segnale può essere sia il codice che il nome del segnale da inviare. Ecco i segnali più usati:
  • 15, TERM: chiude il processo offrendo al programma la possibilità di chiudere tutti i file e le applicazioni aperte;
  • 9, KILL: a differenza di TERM è più istantaneo dal momento che non aspetta il programma;
  • 1, HUP: se il processo è legato a un servizio che non sta funzionando come dovrebbe meglio inviare questo segnale. Il servizio, in questo caso, viene interrotto e successivamente riavviato.
Se con il comando killall mousepad chiudo tutti i processi generati dall'eseguibile e quindi tutte le finestre di mousepad aperte, come faccio a chiuderne una sola? E' evidente che mi serve il PID del processo della finestra che vorrei chiudere (in maniera tale da usare, poi, il comando kill). Per cercare un PID bisogna affidarsi a ps, cosa che vedremo prossimamente.