Questa guida vuole essere un introduzione per i nuovi utenti Linux che incontrano un problema, in genere con qualche periferica, e non sanno dove andare a cercare informazioni che possano aiutare a capire dov’è il problema..

Ancor prima di effettuare una ricerca su internet il problema può essere quello di capire cosa cercare.

Questa guida non ha la pretesa di essere completa, il sottoscritto non ha la presunzione di conoscere qualsiasi metodologia per scovare un problema su Linux🙂 nonostante questo se scoprirò qualcosa di nuovo, o perché mi verrà segnalato, o perché mi ci imbatterò più o meno per caso la aggiungerò alla lista.

Talvolta la risoluzione di un problema dipende semplicemente dal saper dove cercare nel proprio sistema.

Inoltre si possono imparare moltissime cose imparando a leggere i log e cercando informazioni sui significati di quel che si legge.. (sempre se si ha la voglia di farlo…)

Versione 1.2 (06 Gennaio 2009) – comando lsof (cosa occupa la risorsa X?)

Versione 1.1 (23 Settembre 2008) – lista di parole chiave utili ai neofiti

Versione 1.0prima versione

I Log

in qualsiasi installazione Linux viene installato un “logger” del sistema: un log è un file sul disco dove vengono riposti messaggi che indicano cosa ha fatto il sistema, in genere sono informazioni, se c’è qualche problema però è molto probabile nel log ci siano informazioni utili per la risoluzione del sistema.

Comprendere un log non è cosa facile per i nuovi utenti, ma sapere quali possono essere utile ad un utente esperto può essere una buona base di partenza! Senza capire il contenuto possiamo copiare quel file e inviarlo via e-mail a chi è disposto ad aiutarci così da fornirgli informazioni utili!

Il consiglio è comunque quello di provare a leggerlo da soli.. è anche possibile che l’errore salti all’occhio e in genere si finisce con l’imparare qualcosa di utile sul sistema, facendo un piccolo passo per diventare un utente “pro”.

Quasi tutti i servizi mantengono un log che è possibile consultare, cercherò qui di stilare una lista dei più importanti.

molti log li trovate nella cartella /var/log/ alcuni possono essere letti solo da utente root, altri potete leggerli anche da utenti “normali”

Comandi utili

quasi tutto si può fare da modalità grafica.. quasi.. alcune cose vengono meglio fatte da un terminale..

ecco qualche comando utile ( per gli utenti che si vogliono cimentare ):

  • tasto TAB: completamento automatico di comandi, nomi di file e quant’altro, quando siete nel terminale provate a iniziare a scrivere un comando e premere TAB una o 2 volte, vi uscirà una lista dei comandi che cominciano con quelle lettere🙂 lo stesso vale mentre scrivete nomi di file
  • combinazione tasti CTRL+C: per interrompere qualunque comando dalla console e riottenere il “prompt”
  • man <nome-comando> # apre il manuale del comando spiegandone il funzionamento, per i comandi più comuni il manuale è in italiano, per altri potrebbe essere disponibile solo in inglese, i comandi per muoversi all’interno sono come quelli del comando “less” spiegato qui sotto (es. man tail vi apre il manuale del comando “tail”)
  • less <nomefile> # permette leggere un file, per navigare il file si possono usare le frecce su / giù o pag-su / pag-giù per scorrere più rapidamente, premendo “/” e scrivendo si può cercare un termine, con il tasto “q” si esce.. ( es. less /var/log/syslog ) per ulteriori informazioni usare “man”
  • zless <nomefile> # stessa cosa del comando less, ma permette di leggere file compressi con gzip (estensione .gz)
  • dmesg # lo vedremo dopo
  • tail <nomefile> # questo comando mostra la “coda” del file, ovvero le ultime righe.. in realtà questo comando è molto utile se si lancia così: tail -f <nomefile> che vuol dire apri la coda del file e non lo chiudere, scrivimi tutto ciò che viene inserito nel file man mano che viene inserito.. è più facile provarlo che spiegarlo.. farò un esempio dopo ( per uscire premere CTRL+C)
  • cp <nomefileorigine> <nomefilecopiato> # questo serve a copiare un file, nel caso non riusciste a farlo per via grafica, per qualunque motivo, se non vi dice nulla è andato tutto bene
  • chown nomeutente:nomeutente <nomefile> # questo serve a cambiare il proprietario del file, sostituire “nomeutente” con il nome del vostro utente.. (es. chown daniele:daniele /home/daniele/copia-del-file-di-sistema ), anche questo vi serve se per caso non avete la possibilità di farlo in modalità grafica
  • grep <stringa-di-ricerca> <nomefile> # questo comando serve per “filtrare” un file mostrando solo alcune righe, ad esempio: grep error /var/log/syslog vi restituisce solo le righe di /var/log/syslog che contengono la parola “error”, consiglio però questa variante: grep -i error /var/log/syslog il comando questa volta dice di non considerare minuscole e maiuscole, così troverete anche le righe che contengono “Error” e “ERROR”.
  • comando-qualunque > nomefile 2>&1 # crea un file che si chiama “nomefile” e mette all’interno tutto quello che avrebbe scritto in console🙂 ad esempio se avete un errore lanciando un programma potete utilizzare questo metodo per copiare tutti gli errori su un file da consultare con calma in un secondo momento

Ulteriore utilità: per scrivere da console nomi di file con caratteri strani o “spazi” usare la barra “\”

esempio:

questo file ha degli spazi

diventa

questo\ file\ ha\ degli\ spazi

il tasto TAB farà da solo questo lavoro🙂 ma se avete due file che iniziano con “questo<spazio>” potrebbe esservi utile

Log di sistema

È ovviamente il primo posto in cui guardare quando si hanno problemi con qualche periferica ( anche se in genere io preferisco usare prima dmesg, trattato al prossimo punto, perché meno incasinato e più immediato )🙂 o quando il sistema si comporta in modo “strano”. Nei rari casi poi in cui potreste sperimentare un crash del sistema è probabile che troverete qui qualche informazione in merito.. in genere sono dovuti a qualche hardware che si è rotto.. il log può aiutarvi a capire quale sia quest’hardware (talvolta)

il posto dove trovare questi log varia in base al programma installato sul vostro sistema, in genere però troverete il log del sistema in questa posizione:

/var/log/syslog

per ragioni di sicurezza tale file è leggibile solo con i privilegi di root, apritelo come più vi aggrada quindi, con l’accortezza di farlo da root (ad esempio con sudo gedit /var/log/syslog o per via grafica cliccando con il destro sulla cartella /var e scegliendo “apri come amministratore”)

il sistema mantiene anche i log passati.. di molto tempo fa

/var/log/syslog <– qui troveremo il log della sessione corrente (cioè quella che stiamo usando in questo momento) e alcune di quelle precedenti

/var/log/syslog.0 <– qui troveremo quelle un po’ più datate

/var/log/syslog.1.gz <– qui troveremo quelle ancora più vecchie, compresse con gzip, sono quindi archivi.. per leggerle è necessario scompattarle

/var/log/syslog.2.gz <– ancora più vecchi..

… e così via …

Se la grafica non dovesse funzionarvi, per qualunque ragione è possibile consultare questi log con il comando less /var/log/syslog ( o zless /var/log/syslog.1.gz per quelli compressi) da root e da terminale/console, oppure potete usare “nano” o “vim“, due editor da console🙂 che consiglio di imparare (almeno uno dei 2), può sempre servire (io adoro “vim” per esempio, e lo uso spesso al posto di gedit)…

May 11 13:46:17 localhost kernel: klogd 1.4.1#20, log source = /proc/kmsg started.
May 11 13:46:17 localhost kernel: Linux version 2.6.18-k8-crypt (2.6.18-k8-crypt-10.00.Custom) (root@mastro) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Sat Jan 13 12:11:04 CET 2007

all’interno del log troveremo qualcosa di simile, come vedete ogni riga ha una data ed un orario, il che può aiutarvi in diverse occasioni.. queste sono le prime righe che troverete dopo un avvio del vostro sistema (o qualcosa di simile)

se proprio non ci capite nulla.. semplicemente copiate il file (da root copiatelo da qualche parte e cambiate il proprietario in modo da poterlo usare liberamente, NON cambiate il proprietario direttamente sul file originale!) e mandatelo a qualcuno che sappia cavarne fuori qualcosa spiegandogli con vostre parole il problema😀

dmesg

altro log di sistema, qui dentro trovate spesso informazioni più utili che in /var/log/syslog (secondo me)

potete consultare i file

/var/log/dmesg

/var/log/dmesg.0

/var/log/dmesg.1.gz

oppure potete usare il comando “dmesg” per avere lo stesso risultato (usando il comando non è necessario essere root) (CONSIGLIATO)

qui dentro ad esempio ci sono informazioni “in tempo reale” su cosa collegate al vostro computer..

ad esempio.. avete collegato una chiavetta usb o uno scanner, o un altra periferica e non sapete se è stata rilevata o se ha avuto qualche problema?

lanciate dmesg e guardate le ultime righe..

può essere utile il comando:

dmesg | tail

che dice: tutto ciò che “esce” da dmesg dallo al comando “tail”, in poche parole vi fa vedere l’ultima parte di dmesg (quel simbolo “|” si chiama “pipe” per chi volesse cercare qualche info in proposito)

a questo punto inserite la periferica e rilanciate dmesg.. vedrete comparire diverse scritte, se qualcosa è andato storto in quelle poche righe ci sarà sicuramente qualcosa di utile per capire cos’è andato storto.. può essere utile passarle ad un amico esperto (come al solito) o inserirle in un motore di ricerca e vedere cosa salta fuori🙂

NOTA: questo è vero solo per periferiche come l’USB, periferiche che usano la porta parallela (es. vecchi scanner e stampanti) non vengono rilevate in automatico ma solo quando “cercati”

prendo la mia chiavetta usb e la attacco..

qui qualcosa è andato storto

usb 2-2: new full speed USB device using ohci_hcd and address 4
usb 2-2: device descriptor read/64, error -110
usb 2-2: device descriptor read/64, error -110
usb 2-2: new full speed USB device using ohci_hcd and address 5
usb 2-2: device descriptor read/64, error -110
usb 2-2: device descriptor read/64, error -110
usb 2-2: new full speed USB device using ohci_hcd and address 6
usb 2-2: device not accepting address 6, error -110
usb 2-2: new full speed USB device using ohci_hcd and address 7
usb 2-2: device not accepting address 7, error -110

e infatti il mio sistema non fa nulla… in questo caso mi è bastato staccarla e riattaccarla, a volte capita (anche in windows)

rilancio dmesg, ecco cosa è accaduto (in questo caso tutto ha esito positivo), tanto per darvi un idea

usb 3-4: new high speed USB device using ehci_hcd and address 5
usb 3-4: configuration #1 chosen from 1 choice
Initializing USB Mass Storage driver…
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 5
usb-storage: waiting for device to settle before scanning
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
Vendor: USB 2.0 Model: Flash Disk Rev: 0.00
Type: Direct-Access ANSI SCSI revision: 02
usb-storage: device scan complete
SCSI device sda: 512000 512-byte hdwr sectors (262 MB)
sda: Write Protect is off
sda: Mode Sense: 00 00 00 00
sda: assuming drive cache: write through
SCSI device sda: 512000 512-byte hdwr sectors (262 MB)
sda: Write Protect is off
sda: Mode Sense: 00 00 00 00
sda: assuming drive cache: write through
sda: sda1
sd 0:0:0:0: Attached scsi removable disk sda

in questo caso mi si è aperta la cartella con i dati della mia chiavetta

come vedete posso vedere che il mio sistema è riuscito a rilevare la chiavetta, la dimensione e varie altre caratteristiche, se siete curiosi potete cercare cosa sono su un motore di sicurezza.. imparerete così un sacco di cose😀 altrimenti potete vivere comunque abbastanza bene senza saperlo..

IMPORTANTE: dmesg può essere impostato su diversi livelli di dettaglio ognuno con il suo significato

il comando per modificare il livello di dettaglio è: “dmesg -n7” che va dato da utente root! Il numero 7 è il livello di dettaglio che vogliamo… Ogni livello definisce la “criticità” minima che vogliamo conoscere, il livello 1 è quello minimo, il livello 8 quello con più dettagli! Ma eccovi i significati di ogni livello

  • 1: KERN_EMERG, errori che rendono il sistema inutilizzabile
  • 2: KERN_ALERT, errori per cui va fatto qualcosa immediatamente
  • 3: KERN_CRIT, errori critici
  • 4: KERN_ERR, condizioni di errore
  • 5: KERN_WARNING, avvertimenti
  • 6: KERN_NOTICE, notifiche di qualcosa di significativo ma normale
  • 7: KERN_INFO, informazioni
  • 8: KERN_DEBUG, informazioni di debug del kernel

Io consiglio di impostare un livello 6 o 7!

Se poi voleste avventurarvi in quel che succede nei minimi dettagli potete provare un level 8!

Una volta cambiato il livello il sistema dovrebbe iniziare a registrare le condizioni successive che lo caratterizzano (in altre parole se lanciate dmesg quindi cambiate livello e lo rilanciate non vedrete cambiamenti immediati)

Log delle installazioni (sistemi Debian, come Ubuntu)

le altre distro avranno sicuramente i propri log..🙂 basta sapere che esistono e come si chiama il sistema per pacchettizzare (Debian = apt, Gentoo = emerge, RedHat = yum ecc..)

in /var/log/dpkg.log potete trovare tutto il log di dpkg (programma usato da apt per installare e disinstallare software), qui potete vedere tutti i programmi che avete installato, quando (data e ora), quelli rimossi ecc…

se dopo un aggiornamento è spuntato qualche problema qui potete vedere quali pacchetti sono stati aggiornati/installati, il che può aiutare voi ( o qualcuno per voi ) a trovare il colpevole e quindi a risolvere temporaneamente il problema ( ad esempio reinstallando la versione precedente che non aveva i problemi )

Log del server grafico X

pensavate che X non lasciasse un log?😀

X è quello che viene chiamato “server grafico”, ovvero quel programma (servizio) che crea l’ambiente grafico, gestisce la scheda video, le periferiche di interfaccia uomo-macchina (tastiera, mouse, tavoletta grafica ecc…), i font (caratteri) ecc.. ecc..

se l’interfaccia grafica non vi parte o avete problemi con il driver i vostri amici più grandi sono “dmesg” e il log di X

ecco dove si trova:

/var/log/Xorg.0.log

qui trovate l’ultimo log

nelle prime righe troviamo una legenda

Markers: (–) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.

come da qui si evince.. cercando “(EE)” troveremo gli errori, cercando “(WW)” gli avvertimenti..

una lettura completa comunque se il problema non è immediatamente identificato non farà male🙂

qui potremmo in genere trovare informazioni utili per capire perché non abbiamo accellerazione 3D, o perché il mouse non funziona, o perché il server grafico non è riuscito a partire in generale

file utili:

/etc/X11/xorg.conf

file da cui il server X (Xorg) prende tutte le configurazioni per partire, prima di fare modifiche è sempre consigliato farsi una copia di backup

comandi utili:

riavviare il server grafico.. ( serve essere root)

per chi ha gnome ( es. ubuntu ) e quindi, in genere, usa gdm per gestire i login
/etc/init.d/gdm restart

per chi ha KDE ( es. kubuntu) e quindi, in genere, usa kdm per gestire i login

/etc/init.d/kdm restart

oppure da utente normale il comando: startx

inoltre se X parte ma non riuscite ad accedere a Gnome o KDE ( o altro desktop manager ) nella cartella dell’utente il file .xsession-errors (nascosto) può dare qualche informazione utile ulteriore..

Informazioni sul sistema

Questo comando

uname -a

che nel mio sistema dà questo risultato:

Linux mastro 2.6.18-k8-crypt #1 SMP Sat Jan 13 12:11:04 CET 2007 i686 GNU/Linux

indica il nome del sistema, la versione del kernel ( e qualche info su come è compilato) nonché la data a cui è stato compilato, fornitelo sempre e comunque quando chiedete

altro comando utile:

lspci

fornisce la lista delle periferiche connesse al bus PCI (quasi tutte) con il loro nome rilevato..

quando fornite i nomi di una periferica che da problemi è utile usare questo comando per fornirne il nome dato da Linux, o comunque usare tale nome per cercare informazioni su internet

per avere più informazioni su una periferica potete prendere il primo numero

00:06.1 Modem: nVidia Corporation nForce3 Audio (rev a2)

questo è il mio winmodem

quindi dare il comando lspci -v e cercare la parte con quel numero (questo comando dato da root da più informazioni, quindi datelo da root)

00:06.1 Modem: nVidia Corporation nForce3 Audio (rev a2) (prog-if 00 [Generic])
Subsystem: ASUSTeK Computer Inc. Unknown device 1856
Flags: 66MHz, fast devsel, IRQ 185
I/O ports at e800 [disabled] [size=256]
I/O ports at ec00 [disabled] [size=128]
Memory at febff000 (32-bit, non-prefetchable) [disabled] [size=4K]
Capabilities: [44] Power Management version 2

ancora più utile il comando lspci -nv che sostituisce il nome ( Modem: nVidia Corporation nForce3 Audio ) con il codice marca/modello come vedete lo possiamo identificare tramite il codice 00:06.1, il codice in grassetto ci dice il “vendor” (produttore) e il codice del modello, questo codice è quasi univoco e mi ha permesso ad esempio di trovare quale fosse il driver giusto per il mio winmodem

00:06.1 0703: 10de:00d9 (rev a2) (prog-if 00 [Generic])
Subsystem: 1043:1856
Flags: 66MHz, fast devsel, IRQ 185
I/O ports at e800 [disabled] [size=256]
I/O ports at ec00 [disabled] [size=128]
Memory at febff000 (32-bit, non-prefetchable) [disabled] [size=4K]
Capabilities: [44] Power Management version 2

un comando simile a lspci ma per l’usb è il seguente:

lsusb

anche questo disponibile nella versione lsusb -v

talvolta i nomi “commerciali” (che trovate sulla scatola) delle periferiche non aiutano a capire di cosa si tratti, questi comandi possono aiutare di più chi sta cercando di aiutarvi

e ancora…

lsmod

fornisce la lista dei moduli ( o driver ) caricati in memoria

con modprobe <nomemodulo> (da root) possiamo caricare un modulo in memoria

con modprobe -r <nomemodulo> (da root) possiamo rimuoverlo (se questo non è utilizzato da qualcosa)

con modinfo <nomemodulo> abbiamo informazioni sul modulo🙂

i moduli si trovano tutti in /lib/modules/2.<versione-del-kernel>/

Se non vi lascia smontare la chiavetta o estrarre un CD/DVD

In genere questo accade perché c’è qualche programma che sta utilizzando la risorsa. (device is busy)

ecco i comandi utili per capire che cosa blocca la nostra risorsa!

fuser -mav /dev/cdrom

che darà come risultato qualcosa tipo:

               USER      PID       ACCESS    COMMAND

/dev/cdrom:    daniele   4938      f....     cat

               daniele   5376      ..c..     bash

in pratica otterrete una lista di cosa sta occupato la risorsa che vi interessa

in questo caso ho riprodotto manualmente una situazione poco probabile solo a scopo di esempio.. il programma che blocca la risorsa /dev/cdrom (cioè il cdrom) è “cat”, il PID (Process ID: ogni processo che gira sul vostro sistema ha un PID che lo identifica e che potete usare per diverse cose se sapete come). Vi viene in oltre segnalato qual’è l’utente che ha lanciato quel comando (daniele) e il tipo di accesso alla risorsa

  • f = file aperto
  • c = directory corrente (un terminale si trova in quella directory)
  • e = eseguibile in esecuzione (c’è un programma dentro a quella risorsa che sta “girando”)
  • r = root directory (la risorsa contiene la directory di root.. non vi capiterà praticamente mai)
  • m = un file è mappato in memoria o c’è una libreria condivisa

NOTA: il comando fuser -mav /media/cdrom non avrebbe dato lo stesso effetto.

/media/cdrom è la posizione dove il cdrom viene “montato”. La risorsa è /dev/cdrom. In questo esempio il comando “cat” non sarebbe stato rilevato con il secondo comando!

quindi che fare?

se avete capito dal comando qual’è il programma aperto e sapete come chiuderlo, magari salvando il lavoro, potete procedere e quindi smontare/ejectare il dispositivo come al solito.altrimenti potete “uccidere” i processi che bloccano la risorsa.

Nel caso di CD/DVD talvolta è sufficiente dare il comando

eject /dev/cdrom

o eject /dev/dvd

ma non sempre funziona… Proseguite la lettura

una versione leggermente modificata del comando precedente dovrebbe fare al caso vostro:

fuser -mavk /dev/cdrom

che richiede la lista di processi che occupano la risorsa e richiede di “ucciderli” (Killarli) tutti.

Questo comando può però uccidere solo i processi generati dal vostro utente (nel mio caso “daniele”). Se il processo appartiene a “root” (amministratore di sistema) o ad un altro utente dovete dare questo comando dagli altri utenti.. o più semplicemente darlo da root🙂

in questo caso quindi

sudo fuser -mavk /dev/cdrom

o se sudo non è impostato nel vostro sistema date il comando “su“, quindi inserite la password di root e date il comando fuser -mavk /dev/cdrom

Se anche questo non dovesse funzionare o volete “uccidere” solo alcuni processi piuttosto che chiedere loro di terminare normalmente anziché ucciderli potete seguire un altra strada:

il comando kill fa al caso nostro:

kill -15 5376

riprendendo l’esempio sopra questo comando chiede di terminare normalmente (-15) il processo con il PID 5376. Nell’esempio sopra si trattava del terminale (bash).

Se non ne vuol sapere di chiudersi potete ucciderlo con quest’altro comando:

kill -9 5376

Unica differenza il parametro -9 che significa: uccidi il processo.

Come prima questi comandi devono essere dati dall’utente proprietario del processo oppure da root (che può uccidere o terminare qualunque processo di qualunque utente)

Esempi di risorse

/dev/cdrom è la risorsa “cdrom”, ma le chiavette e i DVD?

  • /dev/cdrom
  • /dev/dvd
  • /dev/sda
  • /dev/sdb
  • /dev/sdc
  • ecc..

sono alcuni esempi: le chiavette sono in genere /dev/sda. Se /dev/sda è già un disco o un altra chiavetta sarà /dev/sdb quindi /dev/sdc e così via

come lo scoprite?

dal comando dmesg che ho spiegato prima per esempio

scsi1 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 7
usb-storage: waiting for device to settle before scanning
Vendor: USB 2.0 Model: Flash Disk Rev: 0.00
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sdb: 512000 512-byte hdwr sectors (262 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 00 00 00
sdb: assuming drive cache: write through
SCSI device sdb: 512000 512-byte hdwr sectors (262 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 00 00 00
sdb: assuming drive cache: write through
sdb: sdb1
sd 1:0:0:0: Attached scsi removable disk sdb
usb-storage: device scan complete

In questo esempio vi mostro che è successo collegando la mia chiavetta… le aree in grassetto mostrano dove viene assegnato un “device” (dispositivo). Cioè /dev/sdb è un file che rappresenta la mia chiavetta! Si potrebbe dire che per Linux /dev/sdb È la mia chiavetta!

Poco più sotto viene rilevata una partizione nel mio device e viene numerata /dev/sdb1

Nel mio caso la chiavetta ha una sola partizione, se la vostra (o il vostro disco esterno) ne ha più di una verranno numerate in ordine crescente sda1, sda2, ecc…

un altro modo per scoprirlo?

Se la vostra chiavetta è stata montata (potete accedere ai file e scriverci sopra) scrivete nel terminale

mount

semplicemente

/dev/sdb1 on /media/NOMECHIAVETTA type vfat (rw,nosuid,nodev,shortname=lower,uid=1000)

nella lista avrò anche questo…
vedete il nome della risorsa e dov’è stata montata, quindi il tipo di filesystem (vfat) e le opzioni di montaggio… Se siete curiosi man mount risponderà alle vostre domande.

Sicuramente ci sono altri modo per scoprire quali sono i nomi dei device assegnati da Linux, io ve ne ho dati 2🙂

Cosa occupa la risorsa X?

Il comando “fuser -mav” va bene per qualunque risorsa di sistema ma talvolta non è di alcun aiuto: quando ad esempio la risorsa è occupata da qualche servizio e risulta aperta da moltissimi programmi, anche di sistema! In questi caso se agiamo come per il lettore CD dovremmo praticamente spegnere il computer per liberare la risorsa, il che ha ovviamente poco senso.

Un comando più preciso di “fuser” è “lsof” che elenca tutti i file aperti (in Linux ogni risorsa è un file) ed il programma che lo ha aperto. In genere la lista prodotta è piuttosto lunga ma conoscendo il nome della risorsa è facile scovare quel che ci serve.

Supponiamo ad esempio che la nostra webcam sia utilizzata da qualche programma. Il “device” associato alla webcam è in genere /dev/video0 quindi con il comando:

lsof | grep video0

sapremo qual’è il software che sta bloccando quella risorsa.

In generale

lsof | grep nome_risorsa

Una volta scoperto cosa blocca la risorsa possiamo fare ricerche sul web per capire di che si tratta e se ci serve o meno. In ogni caso sapremo dove orientarci a cercare una soluzione.

Processore al 100% e non sapete che cosa lo provoca?

Ci sono programmi appositi su ogni Desktop Manager per gestire questa cosa (corrispondenti al programma che su Windows si ottiene premendo la combinazione di tasti CTRL+ALT+CANC). Su Linux non c’è una combinazione del genere: esistono diversi programmi, grafici e non, per fare la stessa cosa🙂. Su gnome c’è gnome-system-monitor per esempio.

Io però qui vi mostro come fare da terminale per 2 motivi:

  • Il terminale è sempre comunque disponibile, anche se l’ambiente X non dovesse funzionare
  • Questi comandi sono presenti in TUTTE le distribuzioni Linux perché parte di GNU (ricordate? È GNU/Linux non “solo” Linux)

allora

comando ps

o meglio

ps ax

ci da una lista dei processi in esecuzione sul nostro pc.. lista piuttosto lunga in genere😀 (se volete vedere anche le dipendenze tra processi… cioè se il processo X ha lanciato il processo Y aggiungete “l”, di Livorno, ai parametri)

L’ordine in cui la lista dovrebbe essere presentata è quello di esecuzione, alla fine troverete gli ultimi comandi eseguiti🙂

Questo comando (aprite un terminale ed eseguitelo) ci presenta diverse informazioni

PID   TTY     STAT   TIME   COMMAND

5010  ?       SNs    1:45   /usr/sbin/cupsd

8242  ?       S      0:00   /bin/sh /usr/bin/icedove

8246  ?       S      0:00   /bin/sh /usr/lib/icedove/run-mozilla.sh /usr/lib/iced

8251  ?       Sl     0:53   /usr/lib/icedove/icedove-bin

4470  pts/1   Ss+    0:00   bash

5376  pts/2   Ss     0:00   bash

6699  pts/2   R+     0:00   ps ax

L’esempio sopra mostra la “coda” del comando, cioè le ultime righe sul mio sistema in questo momento

Le informazioni che ci interessano sono il PID (che identifica ogni processo), il comando e volendo lo “stato”. Time se non sbaglio è il tempo effettivo di occupazione del processore dall’accensione del PC.

Gli stati di un processo sono

  • R = Runnable (il processo può essere messo in esecuzione/è in esecuzione)
  • S = Sleeping (dormiente)
  • D = sta “dormendo” ma non può essere interrotto
  • T = sTopped ( è stato fermato ma esiste ancora)
  • Z = Zombie (Lo stato Zombie avviene quando un processo termina, “muore”, ma resta nella lista processi perché chi lo ha lanciato possa vedere che ha terminato. Se il chiamante non verifica e fa sparire tale processo questo rimane nello stato di zombie finché non viene terminato il processo che lo aveva lanciato)
  • W = se non sta occupando in alcun modo la memoria di sistema
  • N = processo ad alta priorità (Nice è il programma per gestire le priorità dei processi)

un altro comando è “top”

top

provate a lanciarlo.. questo programma resta aperto e vi mostra i processi attivi in continuo aggiornamento: in alto ci saranno quelli che occupano più processore a scendere verso chi ne occupa meno. Con il tasto “M” possiamo far comparire/scomparire le informazioni sull’utilizzo della memoria del sistema. Tasto Q per uscire.

Per ulteriori informazioni su questi due comandi rimando come al solito ai loro manuali (man ps e man top). Questo vale in realtà per qualunque comando🙂 anche man man volendo (il manuale del manuale)

ora che ce ne facciamo di queste informazioni?

come spiegato nella sezione precedente possiamo ad esempio terminare i programmi o ucciderli dal loro PID con i comandi kill -15 PID e kill -9 PID (rimando alla sezione precedente per i dettagli, oppure un bel man kill anche qui)

NOTA: non potete uccidere (kill) i processi zombie perché sono già “morti”😀 macabro? naaa.. son solo processi non sentitevi in colpa!😛

Identificato il processo che ci sta consumando il processore o la ram possiamo ucciderlo in questo modo!

Problemi di rete?

Ci sono diverse cose da sapere:

il comando ping può essere usato per verificare se un computer della rete “risponde” o meno:

ping 192.168.1.1

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=1.58 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=1.20 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=1.20 ms

prova a mandare un messaggio al computer con l’indirizzo 192.168.1.1 per vedere se risponde, nell’esempio qui sopra il computer ha ovviamente risposto (tempo di risposta 1.58 millisecondi al primo messaggio). Per interrompere il ping potete premere la combinazione di tasti Control+C.

oppure potete provare a “pingare” un server su internet  (ping http://www.google.com)

il comando, dato da root, ifconfig può darvi le informazioni su tutte le interfacce di rete nel vostro sistema  (eventualmente ifconfig -a per vedere anche quelle spente)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:353 errors:0 dropped:0 overruns:0 frame:0
TX packets:353 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:91475 (89.3 KiB)  TX bytes:91475 (89.3 KiB)

è l’interfaccia di rete chiamata “loopback” esiste su tutti i computer, è un interfaccia virtuale (fittizzia).. il vostro indirizzo di rete fittizzio è 127.0.0.1

eth1      Link encap:Ethernet  HWaddr 00:12:34:ab:cd:xz
inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
inet6 addr: fe80::1234:abcd:feac:39cb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:190496 errors:0 dropped:0 overruns:0 frame:0
TX packets:189107 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:139792725 (133.3 MiB)  TX bytes:82725746 (78.8 MiB)
Interrupt:17 Base address:0x6000

ci sono parecchie informazioni qui sulla vostra scheda di rete.. intanto Linux la chiama “eth1”, ha il mac address “00:12:34:ab:cd:xz” e l’indirizzo ip è “192.168.1.2” il resto per ora potete ignorarlo..

wlan0     Link encap:Ethernet  HWaddr 00:ab:cd:12:34:xz
UP BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

questa invece è la scheda wireless, anche qui potete leggere il mac address… ma non c’è altro di interessante sulla scheda wireless

con il comando ifconfig potete provare a forzare l’accensione della scheda (ifconfig eth1 up, per accendere la scheda che si chiama eth1) o spegnerla (ifconfig eth1 down), potete impostare manualmente un indirizzo ip associato alla scheda (ifconfig eth1 192.168.1.10)

Per le schede wireless ci sono altri 2 comandi utili: iwconfig e iwlist. Il primo è una sorta di “ifconfig” specializzato per schede wireless:

iwconfig

wlan0     IEEE 802.11g  ESSID:”nome_della_rete_a_cui_siete_collegati”
Mode:Managed  Frequency:2.412 GHz  Access Point: Not-Associated
Retry min limit:7   RTS thr:off   Fragment thr=2346 B
Encryption key:off
Link Quality:0  Signal level:0  Noise level:0
Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
Tx excessive retries:0  Invalid misc:0   Missed beacon:0

potete leggere il nome della rete a cui siete collegati, se siete associati a qualche access point o meno, se è attiva la criptografia per la connessione in atto, la qualità del collegamento, livello del segnale ecc…

potete usare lo stesso comando per associare la scheda wireless ad un particolare essid (iwconfig wlan0 essid NOME_DELLA_RETE) e anche se non è forse il metodo più semplice potete impostare usando iwconfig molti altri parametri della scheda.. vi rimando al manuale (man iwconfig)

iwlist invece serve per mettere la vostra scheda in ricerca di reti wireless nella zona (iwlist wlan0 scan),vi darà informazioni quali nomi (essid) delle reti trovate, potenza del segnale ecc…

le impostazioni delle interfacce di rete sono mantenute in un file /etc/network/interfaces

auto lo
iface lo inet loopback

imposta l’interfaccia virtuale di loopback, non preoccupatevene

allow-hotplug eth1
iface eth1 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1

questa è una tipica impostazione statica per la scheda di rete… la prima istruzione dice di permettere di “staccare/riattaccare il cavo di rete”. Come vedete tra le impostazioni c’è anche l’indirizzo ip del gateway

auto eth1

questo invece direbbe di rilevare automaticamente le impostazioni di rete, quindi può andare bene per sfruttare il dhcp del vostro router di casa per esempio. Attenzione perché quest’impostazione talvolta resetta le impostazioni manuali decise da voi.. quindi sembra funzionare tutto e invece dopo un po’ smette di funzionare.. quella simpatica opzione è entrata in azione reimpostandovi l’ip e i DNS (vedi sotto per info su questi ultimi)

Queste istruzioni vengono utilizzate all’avvio del computer ma potete richiamarle manualmente se occorre con i comandi ifdown e ifup.

ifdown eth1 spegne la scheda di rete “eth1” mentre ifup eth1 la riaccende impostandola com’è indicato nel file appena visto.

ci sono un altro po’ di cose da conoscere sulle reti.. ma è necessario avere qualche conoscenza di reti per comprenderle a fondo! Comunque le vediamo perché sono essenziali per una connessione di rete completa…

la prima è la tabella di routing: definisce in sostanza le regole per smistare i pacchetti di rete

il comando route -n vi stampa la routing table

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth1
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1

a parte l’impaginazione approssimativa… vediamo di capire questa routing table:

gli indirizzi del tipo 192.168.1.x vengono mandati attraverso l’interfaccia eth1 (la scheda di rete), il “gateway” è “0.0.0.0” in sostanza non è definito alcun gateway..

gli indirizzi del tipo 169.254.x.x vengono anch’essi mandati alla scheda di rete e non è definito alcun gateway..

infine tutti gli altri indirizzi (0.0.0.0) vengono mandati alla scheda di rete e in particolare all’indirizzo 192.168.1.1 che è il nostro gateway, di solito questo è l’indirizzo del router!

NOTA BENE: se esistono 2 gateway solo il primo verrà considerato perché la tabella è consultata dal kernel partendo dall’alto e fermandosi appena trova una regola che soddisfa il pacchetto.

si può modificare e manipolare questa tabella con il comando route, leggetevi il manuale (man route) o cercate informazioni su internet se vi serve  cambiarla manualmente

infine i DNS: molti non sanno neppure cosa sono eppure senza questo servizio (Domain Name Server) mettendo “www.google.com” o qualunque altro indirizzo nella barra di navigazione non capiterebbe proprio nulla! Il compito dei DNS è proprio quello di tradurre il “nome” di un dominio (es. http://www.google.com) con un indirizzo ip (es. 64.233.183.104) che viene utilizzato per collegarsi effettivamente con “www.google.com”.

Se i DNS non sono impostati correttamente sarete connessi alla rete ma non potrete navigarla usando i nomi. In questo caso alcuni programmi potrebbero funzionare (es. skype perché non usa i nomi ma direttamente gli indirizzi ip) mentre altri no…

ad esempio:

ping http://www.google.com

ping: unknown host http://www.google.com

significa che non è stato possibile “risolvere” il nome “www.google.com” con un indirizzo ip: il che può essere perché non siete connessi a internet oppure perché, anche se siete connessi a internet, i DNS non sono impostati correttamente.

il file con le impostazioni sui DNS è /etc/resolv.conf

nameserver 192.168.1.1
nameserver 208.67.222.222
nameserver 208.67.220.220

in questo caso sono impostati 3 indirizzi DNS, il primo è l’indirizzo che io (penso) essere il mio router, gli altri 2 sono quelli del servizio di DNS gratuito di opendns ma in genere i DNS vengono forniti dal vostro provider in modo automatico, e se il vostro non è un router farlocco dovrebbe “passarveli” se utilizzate il DHCP, se invece usate un impostazione ad IP statico dovete impostarli voi… I server dns in questo file vengono interrogati uno dopo l’altro finché non se ne trova uno che risponde…

appena salvate le modifiche a questo file saranno immediatamente attive e quindi potete riprovare il ping:

ping http://www.google.com
PING http://www.l.google.com (66.249.91.147) 56(84) bytes of data.
64 bytes from ik-in-f147.google.com (66.249.91.147): icmp_seq=1 ttl=241 time=64.7 ms
64 bytes from ik-in-f147.google.com (66.249.91.147): icmp_seq=2 ttl=241 time=103 ms
64 bytes from ik-in-f147.google.com (66.249.91.147): icmp_seq=3 ttl=241 time=66.7 ms

come vedete stavolta l’indirizzo è stato risolto: “PING http://www.l.google.com (66.249.91.147) 56(84) bytes of data.” E se voi mettete quell’indirizzo nella barra del browser al posto di “www.google.com” vi ritroverete sul sito di google🙂

Ecco la “base” dei comandi per debuggare la vostra configurazione di rete…

in genere si procede facendo un ping a un qualche server web che si sa rispondere ai ping (come google) o all’indirizzo della macchina che si vuole raggiungere, poi se non funziona si prova a pingare il router (se ce n’è uno) o un altra macchina che si sà essere in rete.. quindi si comincia a guardare le varie impostazioni e chiedersi se sono corrette…

Quasi tutto questo si può fare con tool grafici ma è utile sapere cosa accade sotto, specialmente quando i tool grafici non ci permettono di capire cosa non va…

Parole chiave utili ai neofiti

Sei nuovo di GNU/Linux e non sai dove girarti? Leggi qui…

Hai un problema con l’audio? (microfono compreso)? la parola chiave è alsa: il componente del kernel linux che si occupa di gestire il driver. Se il tuo è un problema di codec prova a cercare gstreamer.

Problema video? cerca il nome del tuo driver (a seconda della scheda grafica) e xorg o xorg.conf seguito da una breve descrizione del problema (possibilmente in inglese) (es. black screen, no 3d ecc…) o meglio ancora andate a vedere il log di xorg (come spiegato nella sezione precedente) e copiate l’errore:

  • scheda Intel: intel
  • scheda ATI: (driver Open) ati , radeon; (driver chiusi) fglrx [che trovi su http://www.ati.com]
  • scheda nVidia: (driver Open) nv [niente 3D], nouveau [sperimentali con supporto 3D, molto instabili/poco supportati]; (driver chiusi) nvidia [che trovi su http://www.nvidia.com, vanno bene per tutti i tipi di nvidia, anche le quadro]

[work in progress]

Altre cose utili

potete trovare la configurazione del kernel che state usando in /proc/config.gz (non sempre)

oppure nel file /boot/config-<versione-del-kernel>

se lanciate un programma ma non parte

talvolta capita che lanciando un programma non capiti nulla..

apriamo un terminale e lanciamolo da lì.. ( in genere basta scrivere il nome del programma, aiutatevi con il tasto TAB )

con buona probabilità tra i messaggi che vedremo ci sono anche gli errori che gli hanno impedito di partire

come già detto se mi dovesse venire in mente altro, o avete suggerimenti sarà lieto di rendere più completa la lista ( segnalatemi anche eventuali errori ortografici, sono solito modificare le frasi diverse volte nel tentativo di renderle più leggibili, così talvolta ci restano in mezzo dei pezzi)