Linux bàsic
Mostrarem en aquest capítol quatre directrius per iniciar-se a explorar Linux.
Tots els exercicis i comandes s'han realitzat amb la distribució Ubuntu Linux versió 10.04 (Lucid Lynx).
Aclarirem alguns conceptes i entrarem de ple a utilitzar les comandes del sistema operatiu.
Contingut
Sistema operatiu
Segons la wikipedia: un sistema operatiu és un conjunt de programes que corre sobre un ordinador, administrant els recursos de hardware i proveint serveis per l'execució eficient de les aplicacions.
Dit d'una altra manera: el sistema operatiu és el primer programa que s'executa en un PC. Bé, per ser exactes primer el precedeixen l'arranc de la BIOS (Basic Input Output System) i el bootloader contingut en el MBR del disc dur (veure Arrencada_del_PC). Però un cop arrencat el PC el sistema operatiu és l'amo de la màquina.
Acaba sent un intermediari entre el hardware i les aplicacions. Si un programa vol executar alguna funció que impliqui el hardware, no ho pot fer directament: ha de demanar-li al sistema operatiu (crida de sistema) i aquest realitza la tasca i retorna el resultat a l'aplicació. El programes no poden, doncs, accedir al hardware directament, només a través del sistema operatiu.
Exemples: el Firefox no controla la targeta de xarxa, sinó que demana al S.O. que envii un determinat paquet a una determinada adreça IP i el sistema ho fa. O per exemple, per enviar l'àudio a la targeta un programa com el VLC pot descomprimir les dades del mp3 però les ha de posar a disposició del S.O. el qual realitza la transferència final cap al buffer de sortida de la targeta d'àudio.
Parts del sistema operatiu
Un S.O. és un conjunt força ample de programes, no un de sol. Els elements més importants que volem distingir son:
- Kernel o nucli del sistema operatiu: és l'element central i s'encarrega d'engegar i controlar l'execució de les aplicacions i d'administrar l'accés a la memòria d'aquestes.
- Device drivers (o controladors): son programes que enllacen el kernel amb els diferents dispositius electrònics. El nucli no pot conèixer tots els dispositius del mercat, pel que es carreguen només aquells mòduls del hardware que disposem. Així, un driver és específic del hardware utilitzat. És el programa que coneix exactament com està fet cada dispositiu.
El sistema operatiu "mana" sobre els fabricants de hardware, indicant com el sistema operatiu ha d'utilitzar un tipus de hardware determinat. El driver traduirà aquestes directives en instruccions concretes cap el xip particular que el fabricant ha dissenyat.
Per suposat, això no és tot: un S.O. ha de disposar de moltíssimes aplicacions per poder tenir un mínim d'operativitat:
- Shell o consola: programa que permet interactuar amb el S.O. a través de comandes.
- Editor de text: programa que permet crear axius de text.
- Per consola (vi, nano, emacs, ...)
- Per entorn gràfic (notepad, gedit, geany, ...)
- Mòdul d'autenticació (en Linux: PAM): és un subsistema que s'encarrega de validar l'entrada d'usuaris i d'autoritzar les operacions que l'usuari demana.
- Filesystem o sistema d'arxius: subsistema encarregat de l'emmagatzematge, és a dir, l'organització de dades en sistemes persistents com els discs durs, pendrives o CD/DVDs.
- Sistema d'entorn gràfic i escriptori: subsistema que gestiona com es mostren i organitzen les quotidianes finestres. El sistema bàsic d'entorn gràfic de GNU son les X-windows i els sistemes típics d'escriptori son el Gnome i el KDE.
- ... i un llarg etcètera...
Estructura d'arxius del Linux
El Linux ha copiat el model del Unix, pel que ha heretat d'aquest el nom dels directoris que el conformen. Si mirem l'arrel del sistema:
$ ls /
Trobarem aquests directoris (entre d'altres):
- /home: directoris d'usuari amb preferències, descàrregues, dades, documents, imatges, etc. Equival al "Documents and settings" del Windows.
- /var: directoris per emmagatzemar dades d'aplicacions (bases de dades MySQL, Apache, etc.)
- /tmp: arxius temporals, per exemple els vídeos del YouTube que estem veient en aquest moment.
- /boot: sistema gestor d'arrencada (LILO/GRUB).
- /etc: arxius de configuració del sistema (IP de la xarxa, carpetes compartides, usuaris amb accés permès, coontrassenyes, etc.)
- /bin: aplicacions (programes, comandes, etc.)
- /sbin: aplicacions d'administrador (superuser)
Aquests dos casos son especials i NO son arxius normals al disc:
- /dev: accés directe als DEVices (dispositius). NO conté arxius, sinó enllaços als dispositius hardware. Podem així dirigir-nos a un dispositiu mitjançant la línia de comandes.
- Per exemple, els discs durs estan a /dev/sda, /dev/sdb, etc. (i les seves particions serien /dev/sda1, /dev/sda2, etc.).
- /proc: ens permet accedir a algunes funcions del KERNEL i la configuració del sistema.
- Per exemple, una instrucció cat /proc/cpuinfo ens mostraria la informació que el kernel té sobre les CPUs que ha trobat.
enric@pepino:/proc$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz stepping : 11 cpu MHz : 1600.000 cache size : 4096 KB [...etc...]
Directori d'usuari
El nostre directori d'usuari està a /home. Per exemple, si el meu usuari és "enric", el meu home directory seria /home/enric. Per abreujar es sol posar com la "tilde" de la "ñ", és a dir això: ~
El símbol "~" es pot fer amb el ALTGR+ñ, i si no us funciona el podeu fer mantenint apretada la tecla ALT i posant el número 126 al teclat numèric (el símbol ~ és el número 126 del joc de caràcters ASCII).
Si vull anar al meu directori d'usuari només cal que faci "cd" a seques:
enric@pepino:/var$ cd enric@pepino:~$
Però si estic "lluny" del meu directori d'usuari i vull anar a dins d'un directori (per exemple, l'Escriptori), ho puc fer així:
enric@pepino:/var/www$ cd ~/Escriptori enric@pepino:~/Escriptori$
Com podeu veure, al prompt (el què hi ha abans del signe del dòlar de la consola) hi figura sempre la informació més bàsica: el nom d'usuari, el nom de la màquina i el directori on estic, per poder saber on soc en tot moment.
Comandes bàsiques del Shell
La shell és una aplicació que ens permet interactuar amb el kernel i executar comandes. Hi ha molts tipus de shell (Korn shell, C shell, etc.) però la més extesa amb el sistema Linux és la Bourne-Again Shell (bash).
IMPORTANT: per saber més sobre una comanda podem utilitzar en tot moment la comanda man (manual). Per avançar premem ENTER (1 línia), espai (1 pàgina) i per sortir premem la tecla "q". Per exemple:
enric@pepino:~$ man ls LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabeti‐ cally if none of -cftuvSUX nor --sort. [...etc...]
Com hem pogut veure, el primer que ens surt és el prompt amb el nom d'usuari, màquina i directori. Les primeres comandes que cal que sapiguem son:
- pwd : ens diu en quin directori som (tot i que ja apareix en el prompt).
enric@pepino:~$ pwd /home/enric
- ls : ens mostra els continguts d'un directori (equival al DIR del MS-DOS o Windows).
enric@pepino:~$ ls / bin dev initrd.img lib32 media proc scripts sys var boot etc initrd.img.old lib64 mnt root selinux tmp vmlinuz cdrom home lib lost+found opt sbin srv usr vmlinuz.old
- ll : igual que el ls però afegeix més informació dels permisos (rwx: lectura, escriptura, execució), propietari de l'arxiu, data de creació, etc.
enric@pepino:~$ ll / total 136 drwxr-xr-x 24 root root 4096 2011-02-03 18:33 ./ drwxr-xr-x 24 root root 4096 2011-02-03 18:33 ../ drwxr-xr-x 2 root root 4096 2010-12-29 11:00 bin/ drwxr-xr-x 3 root root 4096 2010-12-29 11:06 boot/ drwxr-xr-x 2 root root 4096 2010-06-28 19:18 cdrom/ drwxr-xr-x 18 root root 4220 2011-02-03 21:44 dev/ drwxr-xr-x 163 root root 12288 2011-02-03 21:44 etc/ [...etc...]
Fixeu-vos en els dos primers directoris: el punt (.) significa el mateix directori on estic, i els doble punt (..) al directori pare. Per "pujar" un directori, faria:
enric@pepino:/var/www$ cd .. enric@pepino:/var$
- cat ens mostraria el contingut d'un arxiu de text. Per exemple, per mostrar els contingut de l'arxiu resolv.conf dins la carpeta /etc fariem:
enric@pepino:~$ cat /etc/resolv.conf # Generated by NetworkManager nameserver 192.168.1.1 enric@pepino:~$
- more ens mostra un arxiu de text molt llarg a poc a poc. Per avançar podem fer-ho amb el ENTER (1 línia), amb l'espai (1 pàgina) i podem sortir prement la "q". Per exemple:
enric@pepino:~$ more /etc/samba/smb.conf # # Sample configuration file for the Samba suite for Debian GNU/Linux. # # # This is the main Samba configuration file. You should read the # smb.conf(5) manual page in order to understand the options listed # here. Samba has a huge number of configurable options most of which # are not shown in this example --Més--(7%)
- head ens mostra les primeres línies d'un arxiu de text. Per exemple, per mostrar les 5 primeres línies d'un arxiu:
enric@pepino:~$ head -n 5 /etc/samba/smb.conf # # Sample configuration file for the Samba suite for Debian GNU/Linux. # # # This is the main Samba configuration file. You should read the
- tail ens mostra les darreres línies d'un arxiu de text. Per mostrar les darreres 4 línies faríem:
enric@pepino:~$ tail -n 5 /etc/samba/smb.conf [musica] path = /media/newmedia/musica read only = yes guest ok = yes
- top : ens mostra els processos més actius del sistema i la ocupació de les CPUs i memòria. Molt important per administrar un sistema com un servidor. Es refresca cada 3 segons per defecte. OJU, per sortir premeu "q".
- grep: permet filtrar les línies d'un arxiu de text que continguin la paraula que vulguem. En el següent exemple volquem una sola execució del top a l'arxiu top.txt. Després filtrem les línies en què apareix "enric" (usuari):
enric@pepino:~$ top -n 1 > top.txt enric@pepino:~$ grep enric top.txt 4460 enric 20 0 212m 16m 10m S 2 0.4 0:06.38 gnome-terminal
El què estem veient, doncs, son el(s) procés(sos) de l'usuari enric que està(n) entre els més actius del sistema (top).
Algunes funcions de la shell
La bash shell disposa d'alguns mètodes molt útils per manipular les comandes:
- Redirecció de la sortida estàndard (text de pantalla)
- Pipe: encadenament de comandes.
Redirecció de la sortida estàndard
Hi ha 2 tipus de redirecció:
- ">": crea un fitxer de text. Si ja existia l'esborra i el crea de nou.
- ">>": afegeix el text al fitxer indicat.
Podem redirigir el text de pantalla a un arxiu mitjançant el símbol ">". Per exemple, si faig:
enric@pepino:~$ ls > directori.txt enric@pepino:~$
No ha sortir res per la línia de comandes. En canvi, s'ha generat un arxiu directori.txt (hi conté el que hauria hagut de sortir per la línia de comandes). Amb la comanda següent veurem tots els arxius que comencen per "dir" (utilitzant l'asterisc):
enric@pepino:~$ ls dir* directori.txt
Apareix el nostre arxiu directori.txt. Si volem veure què hi ha a dins podem utilitzar la comanda que hem vist abans (cat):
enric@pepino:~$ cat directori.txt Baixades blowhorn.jpg cacahuet.jpg [...etc...]
Això pot resultar molt útil quan apareix una comanda amb un text llarguíssim. Això és el què passa amb dmesg (informació del hardware del sistema enregistrat pel kernel a l'arrencar la màquina):
enric@pepino:~$ dmesg
Com que surt tanta info no la mostrem. En canvi, podem enviar-la a un arxiu de text i després obrir-la amb un editor de text més còmode com el gedit:
enric@pepino:~$ dmesg > dmesg.txt enric@pepino:~$ gedit dmesg.txt
També haguéssim pogut obrir el gedit des de l'escriptori del Gnome a Aplicacions -> Accessoris -> Editor de text gedit. Un cop dins d'aquest podriem "obrir" i triar l'axiu "dmesg.txt". Tot això ho hem fet amb una sola comanda (gedit dmesg.txt).
Afegint text a un arxiu
Si al nostre arxiu li volem afegir una línia més de text es pot fer amb el símbol ">>":
enric@pepino:~$ ls > directori.txt enric@pepino:~$ echo "DARRERA LINIA" >> directori.txt enric@pepino:~$ tail -n 3 directori.txt vlc-log.txt www DARRERA LINIA enric@pepino:~$
Pipe "|"
Pipe significa "tub" en anglès. En la shell és el signe que és com un pal vertical (|) i de vegades està dividit per la meitat. El podem escriure amb ALTGR+1.
Ens permet encadenar comandes i reenviar el resultat d'una d'elles a la següent comanda.
Per exemple, si volem filtrar (amb la comanda grep) totes les línies del dmesg que continguin la paraula "cpu" podem fer-ho així:
enric@pepino:~$ dmesg | grep CPU [ 0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs [ 0.000000] NR_CPUS:64 nr_cpumask_bits:64 nr_cpu_ids:4 nr_node_ids:1 [ 0.000000] PERCPU: Embedded 30 pages/cpu @ffff880028200000 s91544 r8192 d23144 u524288 [ 0.000000] Initializing CPU#0 [ 0.000000] SLUB: Genslabs=14, HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 [ 0.013585] CPU: L1 I cache: 32K, L1 D cache: 32K [ 0.013587] CPU: L2 cache: 4096K [...etc...]
Com podeu comprovar, la meva màquina "pepino" disposa de 4 CPUs (Intel Quad Core).
Si volem que el grep no distingeixi majúscules de minúscules podem afegir-li el paràmetre "-i":
enric@pepino:~$ dmesg | grep -i cpu
Executeu les dues comandes i veureu que el resultat és diferent.
Si no disposéssim del pipe hauríem de redirigir el text del dmesg a un arxiu i despreś filtrar-ho amb el grep. D'aquesta manera ho fem tot en una sola línia.