El teu blog de Linux en català

Els «traductors» del nucli Hurd

Fa uns mesos, us vam parlar del Hurd. Si recordeu, és una implementació de nucli desenvolupada pels mateixos responsables de GNU. Quan el sistema GNU havia de veure la llum, el nucli Hurd estava molt endarrerit, i per això van decidir utilitzar un nucli que en aquell moment (i encara ara) estava molt més madur, el Linux. Per això ara mateix tenim sistemes GNU/Linux. Però el nucli Hurd segueix en desenvolupament, i us vam explicar com instaŀlar-vos un sistema GNU/Hurd (més concretament, el Debian GNU/Hurd) en una màquina virtual amb VirtualBox, tant sense entorn d’escriptori com amb entorn d’escriptori. Avui us explicarem un concepte que utilitza el nucli Hurd, els «traductors» (de l’anglès «translators»).

Els traductors

Tal i com us comentàvem en la primera anotació, a diferència del nucli Linux, que és monolític, el Hurd es composa de diversos mòduls que s’interrelacionen entre sí. Bàsicament, un micronucli i uns «servidors». Aquests servidors són el que s’anomenen «traductors». Els traductors es troben en un punt intermig entre l’estructura de fitxers del sistema i l’usuari, i serveixen per interactuar amb aquests. Si ens fixem en Linux, en l’estructura de fitxers hi trobem fitxers i directoris, però també altres elements com enllaços simbòlics, dispositius (per exemple, /dev/sda), etc. O sigui que els traductors ens serviran per a gestionar els diferents tipus de sistemes de fitxers (ext2, ext4, ntfs, nfs, etc.), però també els enllaços simbòlics i els diferents dispositius.

NOTA: Per tal de no confondre’ns, a partir d’aquest moment en aquesta anotació direm «nodes» per referir-nos genèricament a un element de l’estructura de fitxers del sistema (ja sigui un fitxer, directori, enllaç simbòlic, dispositiu o el que sigui). No és una notació correcta, però crec que ajudarà a l’explicació.

Logo del Hurd

Logo del Hurd

Per tant, en Hurd són els traductors qui dialoguen amb els dispositius. Però els traductors no serveixen únicament per a gestionar els diferents sistemes de fitxers i dispositius (targetes de xarxa, webcams, ratolí, etc.), sinó que també se’ls pot donar funcionalitats molt variades. Per exemple, s’està desenvolupant un traductor per poder gestionar l’enviament de correus electrònics des del propi nucli Hurd.

En principi, quan es crea un nou traductor per a una tasca específica, no cal que estigui integrat dins el micronucli del Hurd, ni necessita privilegis especials per a executar-se. Només en necessitarà si ha d’accedir a algun tipus de recurs protegit, però no com a traductor en sí.

Com funcionen

Per al seu funcionament, els traductors utilitzen l’estructura interna que tenen els inodes, fins ara molt desaprofitada. Cada node té associat un inode (bé, els hard links són un cas especial, perquè són dos o més fitxers que comparteixen un inode). En els inodes és on actualment es desa informació com els permisos que té el node, l’usuari i grup associats, etc. Així, quan en Hurd iniciem un traductor sobre un node (més endavant veurem com fer-ho), en el seu inode s’indica quin traductor s’ha d’utilitzar quan s’accedeixi a aquest node concret. Si, quan intentem accedir a un node (un fitxer, directori, dispositiu, etc.), en el seu inode s’indica que té un traductor arrancat, el sistema no accedeix directament al fitxer, sinó que crida al traductor, que sabrà què ha de fer amb el node.

Per exemple, hi ha un traductor molt «tonto» (i, per què no dir-ho, una mica friki) que es diu «hello», perquè simula el típic «Hello, world!». Si iniciem el traductor «hello» sobre un fitxer, quan fem un «cat» d’aquest fitxer ens respondrà «Hello, world!», i si li fem un «ls -l» veurem que té una mida de 14 bytes (el que ocupa un fitxer amb el text «Hello, world!»). En canvi, quan desassignem el traductor del fitxer, hi tornarem a veure la informació i mida que tenia anteriorment. Què ha passat? Quan hem fet el «cat» del fitxer, el sistema ha mirat el seu inode. Aquest indica que té assignat el traductor «hello» i, per tant, el crida. El traductor «hello» té com a única funció mostrar el missatge «Hello, world!», i això és el que fa, sense accedir ni modificar la informació interna del fitxer. Per això, quan desassignem el traductor, el sistema ja no passa pel «hello» quan intentem mirar el fitxer i hi veu el mateix que tenia abans d’iniciar-hi el traductor.

Un altre exemple és el traductor «symlink» que crea un enllaç simbòlic a un altre fitxer. Vaja, el mateix que podem fer amb un «ln -s». I llavors, per a què serveix aquest traductor? Hi ha alguns sistemes de fitxer que no admeten nativament els enllaços simbòlics, però sí que n’hi podem utilitzar en Hurd per mitjà del traductor «symlink». En intentar accedir a un fitxer que tingui assignat aquest traductor, el sistema el cridarà i serà el traductor qui li dirà que ha d’accedir al fitxer a que està enllaçat.

Traductors actius i passius

Hi ha dos tipus de traductors, els actius i els passius. El seu comportament és diferent.

Els traductors actius s’inicien com a procés tan bon punt els arranquem sobre algun node, però es perden quan es cau o s’atura el procés del traductor. Per exemple, un traductor actiu es perd en reiniciar l’equip perquè en aquell moment s’atura el seu procés associat.

En canvi, quan iniciem un traductor passiu sobre un node, de moment no fa res, però hi queda en espera que algú el vulgui utilitzar. És quan intentem accedir a un node que té un traductor passiu assignat que s’executa pròpiament dit aquest traductor. A més, si reiniciem l’ordinador el traductor passiu segueix assignat a aquell node i, per tant, si hi intentem accedir tornarà a utilitzar el traductor. Per aquest motiu, no cal mantenir els traductors passius en cap fitxer de configuració.

Per exemple, un traductor que s’assigna com a traductor passiu és el «pfinet», que gestiona la xarxa. Quan s’inicia l’ordinador, el node (en aquest cas un dispositiu, el de xarxa) on s’assigna «està marcat» en el seu inode com que utilitza aquest traductor, però el pfinet no s’engega directament com a procés sense més. És quan intentem accedir per primer cop als serveis de xarxa a través d’aquest node que veu que té assignat el traductor passiu «pfinet», i llavors engega la xarxa. Si reiniciem l’ordinador, el traductor es tornarà a iniciar quan intentem accedir al mateix dispositiu, sense haver de tornar-lo a assignar.

Arranc i aturada de traductors

Els traductors s’engeguen (s’assignen a un node) i s’aturen (es desassignen d’un node) mitjançant l’ordre «settrans». L’estructura bàsica d’una ordre «settrans» és la següent:

settrans  acció  fitxer  [traductor]  [opcions_traductor]

En aquesta ordre tenim els següents elements:

  • acció: Què s’ha de fer amb el traductor. Una opció molt habitual és «-fgap», que atura el traductor en el fitxer especificat, i el torna a engegar, tant de forma activa com passiva. Amb «-cfgap» també l’engega, però a més crea el fitxer si no existeix. També s’utilitza l’opció «-fg», que atura el traductor.
  • fitxer: El fitxer (o dispositiu) on s’ha de fer l’acció.
  • traductor: El traductor que s’ha d’utilitzar. Normalment, els traductors estan a «/hurd/xxxx». Per tant, per al traductor «hello» hi posarem «/hurd/hello».
  • paràmetres_traductor: Cada traductor té els seus paràmetres específics, i s’han d’indicar al final de l’ordre settrans. Per exemple, no cal passar cap paràmetre al traductor «hello». En canvi, al «symlink» li hem d’indicar amb quin node ha de fer l’enllaç simbòlic, i al «pfinet» li hem de passar diversos paràmetres de xarxa.

Per posar un exemple senzill, si estem en un directori que té un fitxer anomenat «fitxer.txt», li podem assignar el traductor «hello» amb l’ordre següent:

settrans -fgap fitxer.txt /hurd/hello

Com veieu, el traductor «hello» no té cap paràmetre assignat (després del text «/hurd/hello» no hi hem posat res). Per a desassignar-hi el traductor, executarem l’ordre següent:

settrans -fg fitxer.txt

Un exemple per al traductor symlink seria el següent, que crea un enllaç al fitxer1.txt anomenat fitxer2.txt:

settrans -cfgap fitxer2.txt /hurd/symlink fitxer1.txt

El següent exemple el vam veure quan explicàvem com instaŀlar el Hurd en una màquina virtual. Serveix per assignar el traductor de xarxa:

settrans -fgap /servers/socket/2 /hurd/pfinet -i eth0 -a 10.0.2.15 -g 10.0.2.255 -m 255.255.255.0

Conclusió

No sabem si algun dia tindrem una versió estable i realment «utilitzable» del nucli Hurd. En el seu estat actual, encara no té suport per a moltes de les tecnologies més utilitzades actualment. Per exemple, no té suport per a dispositius SATA, entre altres. Manllevant (i adaptant) una frase que va utilitzar el Pau en una anotació recent:

Hurd és el nucli del futur per als sistemes GNU, i sempre ho serà.

Però això no treu que, per a aquells que ens agrada saber com funcionen els sistemes operatius, ens interessi el seu desenvolupament i com es gestiona internament. Els traductors són una part importantíssima d’aquest funcionament intern del Hurd, i en aquesta anotació hem intentat fer una mica de llum en el seu coneixement.

Si voleu «jugar» una mica amb els traductors, us recomano que us l’instaŀleu en una màquina virtual o, directament, que utilitzeu la nova màquina virtual que us hem preparat amb Debian GNU/Hurd. Bàsicament és idèntica a la que ja us vam preparar anteriorment (sense entorn d’escriptori), però amb el programari actualitzat. També la teniu disponible, com ja és habitual, a la nostra pàgina d’imatges per a VirtualBox. Recordeu que, per tal que funcioni una màquina virtual amb nucli Hurd, en les propietats de la màquina virtual heu de posar el disc dur com a IDE (no com a SATA), i heu d’utilitzar el controlador de xarxa «PCnet-PCI II».

Per més informació

    • Jordi Sayol on 8 de juliol de 2011 at 08:41

    Reply

    Felicitats per aquesta entrada tant interessant. Gràcies!

    Salut,

      • oriolsbd on 8 de juliol de 2011 at 21:03
      • Author

      Reply

      Gràcies. Feia temps que el volia escriure, i al final m’ha sortit més «ampli» (en el bon sentit) del que pensava al principi. 🙂

    • Jordi on 8 de juliol de 2011 at 20:13

    Reply

    Un gran article, molt ben explicat! Jo penso que, a la llarga, sí que tindrem una versió funcional del Hurd. Jo, que ja tinc una edat, recordo els inicis del compilador gcc i de com es comentava que mai podria competir amb els compiladors “de veritat”. Avui en dia pràcticament és el més utilitzat en totes les plataformes… La gent de GNU no seran ràpids, però es marquen objectius, i són persistents.

      • oriolsbd on 8 de juliol de 2011 at 21:10
      • Author

      Reply

      Tan de bo tinguis raó. Però en aquest sentit estic una mica desanimat, perquè el seu desenvolupament va mooolt lent (tot i que no s’atura mai), i cada dia hi ha noves tecnologies que al Hurd de moment encara no s’estan ni plantejant. A més, s’estan trobant que la comunicació dels traductors amb el micronucli alenteix molt el sistema.
      D’altra banda, és cert que precisament gràcies a la seva modularitat, quan tinguin el «gruix central» prou estable la resta de feina serà crear nous traductors o modificar els ja existents. Amb això estic simplificant molt, eh? No us ho preneu al peu de la lletra… 🙂

  1. Reply

    Oriol, una passada! Felicitats. Desconeixia tot plegat!

Respon a oriolsbd Cancel·la les respostes

Your email address will not be published.