Sessió 7 dia 18/04

Enllaços
Muntar i desmuntar
Nivells d'execució (Runlevels)

Enllaços

Perquè serveixen els enllaços?

Els enllaços serveixen per donar a un fitxer múltiples noms (no confongueu els que veniu del món de Windows amb accessos directes). Internament per al sistema els fitxers són identificats per un nombre que es diu inode, el que vol dir que el nom d'un fitxer està associat a un inode que és el que usa realment el sistema operatiu, el qual és l'únic identificador per al sistema. Amb això podríem dir que simplement els noms aquests que veiem al fer un 'ls' són enllaços a inodes. I com podreu deduir un directori no és més que una llista de inodes amb els seus respectius noms de fitxers.

Enllaços durs


Un enllaç dur consisteix a assignar un nom de fitxer a un inode, amb la qual cosa podem referenciar a un mateix fitxer amb diversos noms i un canvi en un d'ells implica un canvi en la resta ja que es tracta del mateix fitxer realment. Per a això usem l'ordre:

ln [Opcions] Origen Destinació

On l'origen és el nom del fitxer al que volem fer un enllaç dur, i per veure el nombre d'inode usarem l'opció '-i' de 'ls'. Perquè tot quedi clar un exemple:

ramon@portatil:/curs$ ls -i
261358 e1  261476 e2
ramon@portatil:/curs$ ln e2 e3
ramon@portatil:/curs$ ls -i
261358 e1  261476 e2  261476 e3
ramon@portatil:/curs$

El primer que fem és mirar tots els inodes dels fitxers continguts en el nostre directori, creem un enllaç a e2 anomenat e3 i comprovarem que efectivament tenen el mateix inode.

Suposo que ja us ho esteu preguntant: què passa si esborro un d'ells? Doncs si esborres un d'ells simplement el comptador disminueix en 1, i quan no hi ha més enllaços és esborrat realment. Vegem-lo millor amb un exemple:

ramon@portatil:/curs$ ls -l
total 24
-rw-r--r--  1 ramon ramon 13475 2005-04-19 00:56 e1
-rw-r--r--  2 ramon ramon   792 2005-04-19 00:57 e2
-rw-r--r--  2 ramon ramon   792 2005-04-19 00:57 e3
ramon@portatil:/curs$ rm e3
ramon@portatil:/curs$ ls -l
total 20
-rw-r--r--  1 ramon ramon 13475 2005-04-19 00:56 e1
-rw-r--r--  1 ramon ramon   792 2005-04-19 00:57 e2
ramon@portatil:/curs$

Podem observar amb el primer 'ls -l' que e2 i e3 tenen ambdós un 2 ja que a l'inode al que apunten té 2 enllaços, i com ambdós apunten al mateix doncs ambdós mostren que tenen 2. I a l'esborrar un d'ells simplement s'elimina l'enllaç i disminueix el comptador. Fàcil, veritat?

Cal ressaltar que els enllaços durs tenen una limitació i és que només es poden fer enllaços d'aquest tipus en un mateix sistema de fitxers. Amb això vull dir que si tens per exemple dues particions no pots fer enllaços durs entre particions. Si intentes fer un enllaç dur entre particions reps un missatge d'error més o menys així:

ramon@portatil:/curs$ ln e2 /etc/e3
ln: creant l'enllaç dur `/etc/e3' a `e2': Enllaç creuat entre dispositius no permès
ramon@portatil:/curs$

Enllaços simbòlics


Aquests són altres tipus d'enllaços bastant diferents i sense les limitacions anteriorment explicades. Aquest tipus d'enllaços permeten donar a un fitxer el nom d'un altre, però no enllaça el fitxer amb un inode. El que fa en aquest cas és realment apuntar al nom del fitxer amb qui enllaça, per la qual cosa tindran inodes diferents i si un s'elimina no s'elimina l'altre (això és ja més semblat al que és un accés directe de Windows, encara que no ho és per res).

Per realitzar aquest tipus d'enllaços usem l'opció '-s' de 'ln' i per a entendre'l millor com sempre un exemple:

ramon@portatil:/curs$ ls -li
total 20
261358 -rw-r--r--  1 ramon ramon 13475 2005-04-19 00:56 e1
261476 -rw-r--r--  1 ramon ramon   792 2005-04-19 00:57 e2
ramon@portatil:/curs$ ln -s e2 e3
ramon@portatil:/curs$ ls -li
total 20
261358 -rw-r--r--  1 ramon ramon 13475 2005-04-19 00:56 e1
261476 -rw-r--r--  1 ramon ramon   792 2005-04-19 00:57 e2
261477 lrwxrwxrwx  1 ramon ramon     2 2005-04-19 01:05 e3 -> e2
ramon@portatil:/curs$

Podem veure en aquest exemple com els inodes són totalment distints (vermell), i com e3 és un enllaç a e2 d'una manera molt senzilla (verd). I per veure que l'anteriorment dit és cert eliminarem e2 i quedarà e3

ramon@portatil:/curs$ rm e2
ramon@portatil:/curs$ ls -l
total 16
-rw-r--r--  1 ramon ramon 13475 2005-04-19 00:56 e1
lrwxrwxrwx  1 ramon ramon     2 2005-04-19 01:05 e3 -> e2
ramon@portatil:/curs$

I endevineu ja què passa si fem 'cat' a e3, o fa falta un exemple? ;)

Muntant unitats

Què necessitem saber i repassar?

Quant a les unitats d'emmagatzematge com són discos durs, disqueteres, unitats òptiques, pen usb i altres, ja siguin locals o de forma remota (a través de la xarxa per exemple), sapigueu que no s'accedeix directament a elles pel seu dispositiu.

En els sistemes Unix no existeixen les unitats com en Windows (A:, B:, C: ...). Existeix un directori '/' a partir del qual penja tot. Per accedir a una unitat (com una partició) cal muntar-la en un directori dintre del nostre arbre de directoris. Amb això aconseguim un 'tot' uniforme i accedim a tot de la mateixa manera, ja siguin particions FAT, les pròpies de GNU/Linux, o una targeta de memòria o la memòria d'una càmera digital, estiguin dintre del teu ordinador o en la Xina. És important entendre això i el perquè es munten i es desmunten unitats, que no és més que enllaçar i desenllaçar amb l'arbre de directoris, per no escoltar coses tan absurdes com que "Linux està molt endarrerit perquè cal muntar unitats".

Per conveni, consens o costum, els dispositius són muntats en un directori dintre '/mnt', i en moltes distribucions els dispositius removibles com disqueteres i dispositius òptics dintre de '/media'. Encara que realment podem muntar-los en qualsevol altre directori que no sigui '/', si bé és completament absurd muntar unitats en llocs del sistema com '/boot' , '/bin', '/usr' i similars.

I finalment, un dispositiu es munta en un únic directori per a ell sol, res de muntar tot en el mateix lloc. Si s'us ocorre muntar en un directori que no estigui buit observareu que l'anterior desapareix, realment el que succeeix és que queda ocult i inaccessible fins que es desmunti el dispositiu.

Per muntar unitats tenim una ordre molt interessant i útil:

mount [-o Opcions] [-t tipus] [dispositiu] [directori]

Evidentment aquesta no és l'única forma d'utilitzar mount ja que existeixen més opcions i paràmetres, però sí la que ens serà d'utilitat per a nosaltres que estem aprenent. El primer que veurem és l'ús de mount sense paràmetres:

ramon@portatil:/curs$ mount
/dev/hda7 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda1 on /mnt/windows/c type vfat (rw,umask=000)
/dev/hda5 on /mnt/windows/d type vfat (rw,umask=000)
/dev on /.dev type unknown (rw,bind)
none on /dev type tmpfs (rw,size=5M,mode=0755)
usbfs on /proc/bus/usb type usbfs (rw)
ramon@portatil:/curs$

El que aquí se'ns mostra és el que tenim muntat actualment en el nostre sistema, de la forma:

Dispositiu on Directori type Tipus Opcions

on el Tipus indica el sistema de fitxers que usa, i Opcions ens indica les opcions amb les quals va ser muntat, més endavant veurem què signifiquen.

Si esteu atents us adonareu que existeixen Directoris als quals no hi ha assignats un dispositiu real, com per exemple "proc on /proc type proc (rw)":

ramon@portatil:/curs$ ls /dev/proc
ls: /dev/proc: No existeix el fitxer o el directori
ramon@portatil:/curs$

Això és degut al fet que existeixen sistemes de fitxers que no estan associats a un dispositiu real, és més, en el cas '/proc' d'aquest exemple ni tan sols existeix físicament, és una representació en memòria dels processos que corren pel sistema i més informació útil que ens proporciona el kernel. Però de moment donarem de costat això i ens centrarem en el que ens interessa.

El kernel de GNU/Linux és capaç de reconèixer molts sistemes de fitxers, i entre ells els que més ens interessen són els següents:

vfat Per a particions pròpies de Windows tipus FAT ja sigui FAT16, FAT32 o FAT12 dels disquets
ntfs Per a particions pròpies dels Windows NT/2000/XP
ext2 Particions de GNU/Linux corresponents a l'antic estàndard, però àdhuc molt en ús
ext3 Particions de GNU/Linux corresponents al nou estàndard
swap Per a particions swap de GNU/Linux
reiserfs Particions de tipus ReiserFs molt utilitzades en GNU/Linux
iso9660 Un sistema de fitxers local usat per discos CDROM
ufs Un sistema de fitxers local usat per discos CDROM

Però hi ha més com poden ser minix, ext, xiafs, hpfs, msdos, umsdos, proc, nfs, smbfs, ncpfs, affs, ufs, romfs, sysv, xenix, coherent ... Com veieu, una gran quantitat de possibilitats impossibles d'aconseguir amb un Windows.

I ara queda la gran prova: muntar un dispositiu, i encara que la majoria de vosaltres tindreu ja facilitat la forma de muntar-lo ho farem manualment. Per a això usarem l'opció '-t' que serveix per indicar el tipus de sistema a usar, jo per referenciar al cdrom ho faré com /dev/hdXY, encara que pots usar /dev/cdrom:

root@portatil:/home/ramon # mount -t iso9660 /dev/hdc /home/ramon/curs
mount: dispositiu de blocs /dev/hdc està protegit contra escriptura; es munta com només lectura
root@portatil:/home/ramon #

Com veieu només root pot muntar unitats, i ara podrem veure el contingut:

root@portatil:/home/ramon # cd curs
root@portatil:/home/ramon/curs # ls
dists  install   md5sum.txt  pool     README.diskdefines  ubuntu
doc    isolinux  pics        preseed  tools
root@portatil:/home/ramon/curs #

I ara com trec el meu CD? No em deixa!


Una unitat muntada mai ha de desconnectar-se o retirar-se sense abans desmuntar-la, i això és molt important ja que GNU/Linux usa un sistema de buffers (memòria intermèdia entre el dispositiu i el processador, ja que els sistemes d'emmagatzematge són moltíssim més lents que la memòria principal) en memòria que pot no estar actualitzat pel que fa a la unitat (encara que en aquest cas sigui de només lectura), cada cert temps el contingut d'aquests buffers és sincronitzat amb el dispositiu i al desmuntar-se el que es fa és descarregar tots aquests buffers per poder retirar de forma segura el dispositiu (o apagar la màquina sense perdre dades).

Perquè això és així? Per raons d'eficiència, encara que això suposi pèrdua de facilitat (cosa que actualment no és així, ja que les distribucions més amigables estan preparades per no haver de muntar i desmuntar, tal com una Mandriva per posar un exemple).

L'ordre que necessitem és:

umount dispositiu | directori

I aquesta ordre és ben senzilla, per desmuntar-lo simplement executem 'umount' i li indiquem o bé el dispositiu que volem desmuntar o bé el directori.

root@portatil:/home/ramon # umount /dev/hdc
root@portatil:/home/ramon #

No em desmunta la unitat, què faig?


Algunes vegades ens ocorre que no es desmunten les unitats, cosa que pot arribar a desesperar-nos, el primer que cal mirar és que no estigui executant-se res que usi el que tenim muntat, la major part de les vegades ho solucionem amb això (és evident que si alguna cosa està en ús no ho podrem llevar). Altre problema i més gros és que un procés camini per aquí bloquejat i no alliberi el dispositiu. Aquest problema és més complicat, ja vam veure a la sessió 5 com gestionar i eliminar processos.

Si apareix aquest problema contem amb una ordre bastant útil que ens pot solucionar la papereta, i el seu ús bàsic és:

eject [dispositiu|directori]

No és necessari en aquest cas ser root, per defecte si no se li indica res es referirà a '/dev/cdrom' així que ho executarem per al nostre exemple:

root@portatil:/home/ramon # eject hdc
root@portatil:/home/ramon #

Com veieu és tan amable que fins i tot ens expulsa el CD, i no és necessari posar abans '/dev/'. Per cert, no sigueu il·lusos i espereu que us expulsi un disquet ;).


copyleft © 2014 ramon lopez
última actualització 16/09/14 17:23