Tanquem el mòdul 3 amb una constatació incòmoda: portàvem tres mòduls escrivint /var/lib/meteora/lectures/2026-08-31.dat com si aquella cadena de text fos una cosa evident, quan al mòdul 2 vam deixar l'emmagatzematge en un punt molt diferent. Allà, un SSD NVMe era un vector de blocs numerats de 0 a N, adreçables per LBA, sense noms, sense carpetes, sense mides i sense propietaris. Un array gegantí de 512 o 4.096 bytes per casella. Res més.

Entre aquell vector de blocs i el camí /var/lib/meteora/lectures/2026-08-31.dat hi ha una de les abstraccions més ben resoltes de la informàtica: el sistema de fitxers. És la peça que converteix «el bloc 8.394.271» en «el fitxer de lectures d'ahir», que recorda qui el va crear i quan, que sap que ocupa 17 MB repartits en milers de blocs dispersos, i que aconsegueix que un programa en C el pugui llegir sense saber absolutament res d'LBA, sectors ni geometria.

Aquesta lliçó construeix aquesta abstracció des de baix. Definirem amb precisió què és un fitxer, veurem quines metadades porta i on viuen, disseccionarem l'inode —l'estructura central de tot sistema UNIX—, recorrerem la disposició física d'un sistema de fitxers sobre el dispositiu, calcularem per què la mida de bloc és un compromís i no una casualitat, i acabarem comparant les famílies de sistemes de fitxers que existeixen per decidir, amb arguments, quina es mereix /var/lib/meteora.

Contingut

  1. Del bloc cru al fitxer: quin problema resol l'abstracció
  2. Què és un fitxer: contingut, metadades i nom
  3. Els set tipus de fitxer d'UNIX
  4. ls -l i stat interpretats camp a camp
  5. L'inode: què conté i què no conté
  6. Números d'inode, ls -i i l'esgotament amb df -i
  7. Disposició física d'un sistema de fitxers al dispositiu
  8. La mida de bloc i el seu compromís, calculat
  9. Marques de temps: atime, mtime, ctime, crtime i el perquè de noatime
  10. Famílies de sistemes de fitxers comparades
  11. La decisió de Meteora per a /var/lib/meteora

Del bloc cru al fitxer: quin problema resol l'abstracció

Imagina't per un moment que Meteora no tingués sistema de fitxers i treballés directament sobre /dev/nvme0n1, el dispositiu de blocs del mòdul 2. L'ingestor hauria de resoldre, ell tot sol, aquesta llista de problemes:

Problema Què hauria de fer l'ingestor sense sistema de fitxers
Ubicació Recordar en quin LBA comença el dia d'avui, i desar-ho en algun lloc... on?
Creixement Saber quants blocs reservar per endavant, perquè no pot «créixer» sobre un veí
Espai lliure Portar la seva pròpia comptabilitat de quins blocs estan ocupats i quins no
Noms Inventar-se un índex propi que tradueixi «31 d'agost» a un número de bloc
Concurrència Coordinar-se amb l'agregador i amb meteo-api per no trepitjar-se blocs
Permisos No n'hi ha: qualsevol amb accés al dispositiu llegeix i escriu tot
Persistència de la comptabilitat Si es talla la llum mentre actualitza el seu índex, ho perd tot

Cada programa del servidor hauria de resoldre els set, cadascun a la seva manera, i cap no podria cooperar amb els altres. És exactament la situació que vam descriure a 01-01 quan parlàvem del sistema operatiu com a màquina estesa: sense ell, cada aplicació reimplementa el maquinari.

El sistema de fitxers resol els set de cop amb una sola idea:

Un fitxer és una seqüència de bytes amb nom, mida i propietari, que el sistema emmagatzema on vol i el programa llegeix com si fos contínua.

Les quatre paraules clau d'aquesta definició mereixen atenció:

  • Seqüència de bytes. A UNIX un fitxer no té cap estructura interna coneguda pel sistema. No hi ha «registres», ni «camps», ni tipus. Que 2026-08-31.dat contingui 720.000 estructures Lectura de 24 bytes és un acord entre els programes de Meteora, invisible per al nucli. Altres sistemes històrics (els d'IBM, VMS) sí que imposaven estructura de registres, i la indústria va acabar donant la raó al model pla d'UNIX per la seva simplicitat.
  • Amb nom. El nom és l'ansa per la qual l'usuari agafa el fitxer. Veurem a l'apartat 5 la sorpresa: el nom no és dins del fitxer.
  • On vol. El sistema decideix quins blocs fa servir. Això és el que estudiarem a Assignació d'Espai, Journaling i Integritat.
  • Com si fos contínua. Aquesta és la màgia. 2026-08-31.dat ocupa 4.219 blocs que poden estar escampats per tot l'SSD, i tanmateix read() els lliura en ordre com un doll de bytes. És la mateixa mena d'il·lusió que la memòria virtual del mòdul 2: adreces lògiques contigües sobre emmagatzematge físic dispers.

De fet, el paral·lelisme amb la memòria virtual és tan exacte que convé fixar-lo, perquè t'estalviarà esforç en tot el mòdul:

Memòria virtual (02-04) Sistema de fitxers (mòdul 4)
Espai d'adreces virtual del procés El fitxer com a seqüència de bytes 0..N
Pàgina (4 KiB) Bloc lògic (4 KiB)
Marc de pàgina a la RAM Bloc físic al dispositiu
Taula de pàgines Punters/extents de l'inode
La MMU tradueix virtual → físic El sistema de fitxers tradueix desplaçament → LBA
Una fallada de pàgina porta la pàgina del disc read() porta el bloc a la memòria cau de pàgines

És la mateixa idea aplicada dues vegades: una taula de traducció que converteix un espai lògic ordenat en un espai físic desordenat.

Què és un fitxer: contingut, metadades i nom

Un fitxer té tres parts, i viuen en tres llocs diferents. Aquesta separació és la clau de tota la resta:

graph LR
    subgraph DIR["Directori (04-02)"]
        N["nom: 2026-08-31.dat<br/>inode: 1180934"]
    end
    subgraph INO["Inode núm. 1180934"]
        M["tipus, permisos, propietari,<br/>mida, dates, punters"]
    end
    subgraph DAT["Zona de dades"]
        D["4.219 blocs<br/>amb els 17.280.000 bytes"]
    end
    N -->|apunta a| M
    M -->|apunta a| D
  • El contingut: els bytes en si, a la zona de dades del dispositiu.
  • Les metadades: tot el que el sistema sap sobre el fitxer. Viuen a l'inode.
  • El nom: viu al directori que el conté, no al fitxer. Ho desenvoluparem a Estructures de Directoris, però ho has de saber ja per entendre l'inode.

Les metadades típiques d'un fitxer, amb el que significa cadascuna:

Metadada Què és Exemple a Meteora
Tipus Regular, directori, enllaç simbòlic... Regular
Mida Bytes de contingut 17.280.000
Blocs Blocs de 512 B realment ocupats 33.760
Propietari (UID) Usuari propietari meteora (UID 990)
Grup (GID) Grup propietari meteora (GID 990)
Permisos 12 bits de mode 0640
Comptador d'enllaços Quants noms apunten a aquest inode 1
Marques de temps Accés, modificació, canvi, creació vegeu l'apartat 9
Punters a dades On són els blocs extents (04-05)

Fixa't en una cosa que ja s'intueix: el nom no apareix en aquesta llista. No és un oblit; és la decisió de disseny central d'UNIX, i d'ella surten els enllaços durs, l'esborrat diferit i mitja dotzena de comportaments que sorprenen fins que entens això.

Els set tipus de fitxer d'UNIX

A UNIX, la frase «tot és un fitxer» es pren seriosament. La mateixa interfície —open, read, write, close— serveix per a un fitxer de dades, un teclat, una canonada o una connexió de xarxa. El que canvia és el tipus, un camp de 4 bits a l'inode:

Símbol a ls -l Tipus Què és Exemple de Meteora
- Regular Seqüència de bytes al disc /var/lib/meteora/lectures/2026-08-31.dat
d Directori Taula de parells (nom, inode) /var/lib/meteora/lectures/
l Enllaç simbòlic Fitxer que conté un camí /var/lib/meteora/lectures/avui.dat
b Dispositiu de bloc Accés per blocs, amb memòria cau /dev/nvme0n1, /dev/md0
c Dispositiu de caràcter Accés per bytes, sense memòria cau /dev/null, /dev/random, /dev/tty
p FIFO (canonada amb nom) Canal al sistema de fitxers /run/meteora/lectures.fifo
s Sòcol Punt de comunicació local /run/meteora/api.sock

Els tres últims són vells coneguts del mòdul 3: la FIFO de /run/meteora/lectures.fifo la vam fer servir a Comunicació entre Processos, i els sòcols de domini UNIX també. La diferència és que allà els vam veure com a mecanismes d'IPC i aquí els veiem com a entrades del sistema de fitxers: tenen inode, permisos i nom, però el seu contingut no és al disc —una FIFO té una memòria intermèdia a la memòria del nucli, un sòcol té una cua de xarxa—. Ocupen un inode i zero blocs de dades.

El mateix passa amb els dispositius de bloc i de caràcter, que vam veure a Gestió de Dispositius: el seu inode no guarda punters a dades, guarda el parell (número major, número menor) que identifica el controlador. Un fitxer de dispositiu és, literalment, un inode amb un parell d'enters a dins.

ls -l i stat interpretats camp a camp

Anem a mirar-ho de debò. Aquest és el llistat del directori de Meteora a meteo-01:

$ ls -l /var/lib/meteora/lectures/ /dev/nvme0n1 /dev/null /run/meteora/
-rw-r----- 1 meteora meteora 17280000 ago 31 23:59 2026-08-31.dat
-rw-r----- 1 meteora meteora 17280000 set  1 12:40 2026-09-01.dat
lrwxrwxrwx 1 meteora meteora       14 set  1 00:00 avui.dat -> 2026-09-01.dat
drwxr-x--- 2 meteora meteora     4096 set  1 00:00 arxiu

brw-rw---- 1 root  disk    259, 0 set  1 08:12 /dev/nvme0n1
crw-rw-rw- 1 root  root      1, 3 set  1 08:12 /dev/null

prw-r----- 1 meteora meteora      0 set  1 08:13 /run/meteora/lectures.fifo
srwxr-xr-x 1 meteora meteora      0 set  1 08:13 /run/meteora/api.sock

Els camps, d'esquerra a dreta:

  1. Primer caràcter: el tipus de la taula anterior. -, l, d, b, c, p, s. D'un cop d'ull ja saps què és cada cosa.
  2. Nou caràcters següents: els permisos, que veurem a Seguretat i Permisos de Fitxers.
  3. El número després dels permisos: el comptador d'enllaços. Val 1 als fitxers normals i 2 al directori arxiu (ho explica 04-02).
  4. Usuari i grup propietaris: meteora meteora.
  5. Mida: 17.280.000 bytes per a les lectures. Però mira /dev/nvme0n1: on hi hauria d'haver la mida hi posa 259, 0. Són el major i el menor. Un fitxer de dispositiu no té mida perquè no té contingut; en el seu lloc ls mostra la parella que identifica el controlador. I la FIFO i el sòcol hi posen 0, per la mateixa raó.
  6. Data: per defecte el mtime, no el de creació ni el d'últim accés (apartat 9).
  7. Nom, amb el -> destinació a l'enllaç simbòlic.

ls -l és un resum. Per veure-ho tot es fa servir stat:

$ stat /var/lib/meteora/lectures/2026-08-31.dat
  Fitxer: /var/lib/meteora/lectures/2026-08-31.dat
  Mida: 17280000     Blocs: 33760       Bloc d'E/S: 4096   fitxer regular
Dispositiu: 9,0      Node-i: 1180934     Enllaços: 1
Accés: (0640/-rw-r-----)  Uid: (  990/meteora)   Gid: (  990/meteora)
Accés:        2026-09-01 06:00:11.482913711 +0200
Modificació:  2026-08-31 23:59:58.117204339 +0200
Canvi:        2026-08-31 23:59:58.117204339 +0200
Creació:      2026-08-31 00:00:00.004118220 +0200

Camp a camp, amb el que cal entendre de cadascun:

  • Mida: 17280000. Bytes lògics del fitxer: exactament 720.000 lectures × 24 bytes. És el número que retorna lseek(fd, 0, SEEK_END).
  • Blocs: 33760. Aquí hi ha un parany clàssic: stat compta blocs de 512 bytes, sempre, independentment de la mida de bloc real del sistema de fitxers. 33.760 × 512 = 17.285.120 bytes ocupats al disc, una mica més que els 17.280.000 lògics. La diferència són 5.120 bytes: 4 KiB de l'últim bloc parcialment fet servir més les metadades de l'arbre d'extents. Que «blocs × 512» sigui menor que la mida és la firma d'un fitxer dispers (ho veurem a 04-04).
  • Bloc d'E/S: 4096. La mida de bloc preferida per a les lectures; llegir en múltiples d'aquest número evita feina extra al nucli.
  • Dispositiu: 9,0. Major 9, menor 0: /dev/md0, el RAID 1 que vam muntar a 02-05. Aquest parell identifica en quin sistema de fitxers viu l'inode, i la parella (dispositiu, node-i) és l'única cosa que identifica un fitxer de manera única a tota la màquina.
  • Node-i: 1180934. El número d'inode. L'apartat 6 s'hi dedica.
  • Enllaços: 1. Un sol nom apunta a aquest inode (04-02).
  • Accés (0640). Dotze bits de mode, mostrats en octal i en simbòlic (04-06).
  • Uid/Gid 990. L'usuari i el grup meteora. Ull: l'inode guarda números, no noms; la traducció a meteora la fa stat consultant /etc/passwd.
  • Les quatre dates: apartat 9.

L'inode: què conté i què no conté

L'inode (index node) és l'estructura de dades que és el fitxer. Tota la resta són referències a ell. Viu al disc, en una zona reservada, i té una mida fixa: 256 bytes en un ext4 modern (128 als antics, configurable en formatar).

El seu contingut, agrupat:

Grup Camps Bytes aprox.
Identitat Tipus (4 bits) + permisos (12 bits), UID, GID 8
Mida Mida lògica en bytes (64 bits), blocs ocupats 12
Enllaços Comptador de noms que el referencien 2
Temps atime, mtime, ctime, dtime, crtime (amb nanosegons) 40
Dades 60 bytes de punters/extents (04-05) 60
Extres Indicadors (chattr), versió, checksum, atributs estesos resta

I ara l'important, que és el que no hi ha:

El nom del fitxer no és a l'inode. Tampoc no hi és el camí, ni el directori al qual pertany, ni res que el relacioni amb /var/lib/meteora/lectures/2026-08-31.dat.

L'inode 1180934 no sap com es diu. Sap que és un fitxer regular de 17.280.000 bytes que pertany a l'UID 990, que hi ha 1 nom en algun lloc que hi apunta, i en quins blocs són les seves dades. Res més.

Això no és una limitació: és la decisió de disseny de la qual penja mig mòdul. Les seves conseqüències, que anirem desplegant:

Conseqüència On s'explica
Un mateix fitxer pot tenir diversos noms (enllaços durs) 04-02
Reanomenar és instantani: només canvia una entrada de directori 04-02
Esborrar és unlink: treure un nom, no destruir el fitxer 04-02
Un fitxer obert sense cap nom continua existint 04-02, 04-04
El nom no té permisos; els permisos són a l'inode 04-06
Un fitxer en ús es pot substituir atòmicament amb rename() 04-04

Guarda't aquesta frase: l'inode és el fitxer; el nom és només una etiqueta enganxada des de fora.

Números d'inode, ls -i i l'esgotament amb df -i

Cada inode té un número únic dins del seu sistema de fitxers. Es veu amb ls -i:

$ ls -i /var/lib/meteora/lectures/
1180934 2026-08-31.dat   1180935 2026-09-01.dat   1180936 avui.dat

Dos fitxers del mateix sistema de fitxers amb el mateix número d'inode són el mateix fitxer. Dos fitxers de sistemes de fitxers diferents poden compartir número sense tenir res a veure: per això la identitat real és el parell (dispositiu, inode), st_dev + st_ino a stat. És exactament el que comprova find -samefile i el que fa servir rsync per no copiar dues vegades el mateix contingut enllaçat.

Ara la part pràctica. A ext4, el nombre d'inodes es fixa en formatar i no es pot augmentar després. Es reserven per endavant, amb una relació per defecte d'un inode per cada 16 KiB de capacitat:

$ df -h /var/lib/meteora
Sist. fitxers          Mida   Usat  Disp  Ús% Muntat a
/dev/md0               196G    41G  146G  22% /var/lib/meteora

$ df -i /var/lib/meteora
Sist. fitxers    Nodes-i  NUsats  NLliures NÚs% Muntat a
/dev/md0        13107200    1834  13105366   1% /var/lib/meteora

Interpretació: el volum té 13.107.200 inodes (200 GiB ÷ 16 KiB) i només en fa servir 1.834, perquè Meteora guarda un fitxer gran per dia i porta uns cinc anys funcionant. Amb aquesta política, en 100 anys faria servir 36.500 inodes: el 0,28 %.

A l'inrevés, però, es produeix la fallada més desconcertant de l'administració de sistemes:

$ df -h /var/spool/cache
Sist. fitxers          Mida   Usat  Disp  Ús% Muntat a
/dev/sdb1               50G    12G   36G  26% /var/spool/cache      ← 74 % lliure!

$ df -i /var/spool/cache
Sist. fitxers    Nodes-i  NUsats  NLliures NÚs% Muntat a
/dev/sdb1        3276800 3276800         0 100% /var/spool/cache    ← 0 lliures

$ touch /var/spool/cache/prova
touch: no s'ha pogut fer «touch» sobre 'prova': No queda espai al dispositiu

«No queda espai al dispositiu» amb 36 GB lliures. L'error és ENOSPC i és literal des del punt de vista del nucli: no queda espai d'inodes. Un procés que crea milions de fitxers minúsculs —memòries cau, sessions, cues de correu— esgota la reserva d'inodes molt abans que els blocs. Regla de diagnòstic: davant d'un ENOSPC, executa sempre df -h i df -i; si el primer no explica res, el segon ho farà.

Per localitzar el culpable:

$ sudo find /var/spool/cache -xdev -type f -printf '%h\n' | sort | uniq -c | sort -rn | head -5
2984112 /var/spool/cache/sessions
  12043 /var/spool/cache/tmp

L'ordre compta fitxers per directori: -xdev evita saltar a altres sistemes de fitxers, -printf '%h\n' imprimeix el directori de cada fitxer, i sort | uniq -c | sort -rn agrupa i ordena. Gairebé tres milions de fitxers a sessions: aquí hi ha el problema.

La solució no és engrandir el disc, perquè els inodes no creixen: cal esborrar fitxers o reformatar amb mkfs.ext4 -i 4096 (un inode cada 4 KiB, quatre vegades més) o -N 8000000 (nombre explícit). Aquest és un dels arguments a favor d'XFS i Btrfs, que assignen inodes dinàmicament i no pateixen aquest problema.

Disposició física d'un sistema de fitxers al dispositiu

Ja sabem què és un inode. On és físicament? Anem a obrir el dispositiu per dins. La jerarquia d'unitats, de menor a major:

Unitat Mida típica Qui la defineix
Sector 512 B (lògic) / 4.096 B (físic) El maquinari del disc
Bloc lògic 1, 2 o 4 KiB El sistema de fitxers, en formatar
Grup de blocs 128 MiB a ext4 El sistema de fitxers
Sistema de fitxers La partició sencera L'administrador

El sector és la unitat mínima que el dispositiu sap llegir o escriure; ho vam veure a 02-05. El bloc lògic és la unitat mínima que el sistema de fitxers sap assignar: encara que el disc pugui llegir 512 bytes, ext4 mai no assigna menys d'un bloc a un fitxer.

Un ext4 es divideix en grups de blocs de 128 MiB, cadascun amb la seva pròpia comptabilitat. La raó és de rendiment i ve directament del mòdul 2: mantenir juntes les metadades i les dades que es fan servir juntes redueix els desplaçaments del capçal en un HDD i millora la localitat en un SSD.

graph TB
    subgraph FS["/dev/md0 — ext4 de 200 GiB, 1.600 grups de 128 MiB"]
        BOOT["Bloc 0<br/>1 KiB d'arrencada"]
        subgraph G0["Grup de blocs 0"]
            SB["Superbloc<br/>(1 bloc)"]
            GD["Descriptors de grup<br/>(N blocs)"]
            BB["Mapa de bits<br/>de BLOCS<br/>(1 bloc)"]
            IB["Mapa de bits<br/>d'INODES<br/>(1 bloc)"]
            IT["Taula d'inodes<br/>(512 blocs)"]
            DZ["ZONA DE DADES<br/>(~31.000 blocs)"]
        end
        G1["Grup 1<br/>(mateixa estructura)"]
        GN["... Grup 1.599"]
    end
    BOOT --> SB --> GD --> BB --> IB --> IT --> DZ --> G1 --> GN

Peça per peça:

El superbloc. És la fitxa d'identitat del sistema de fitxers, i ocupa un sol bloc. Conté el nombre total d'inodes i de blocs, quants en queden lliures, la mida de bloc, la mida de l'inode, el nombre de blocs per grup, l'UUID, l'etiqueta, la data de l'últim muntatge, el comptador de muntatges i l'estat (net o brut, que serà decisiu a 04-05). Sense superbloc no es pot muntar res, perquè no se sap ni on comencen els inodes. Per això ext4 en guarda còpies de seguretat en diversos grups:

$ sudo dumpe2fs /dev/md0 | grep -i superblock
Primary superblock at 0, Group descriptors at 1-13
  Backup superblock at 32768, Group descriptors at 32769-32781
  Backup superblock at 98304, Group descriptors at 98305-98317
  Backup superblock at 163840, ...

Si el primari es corromp, es recupera amb sudo e2fsck -b 32768 /dev/md0, que li diu a e2fsck que faci servir la còpia del bloc 32768. És una ordre que convé tenir anotada: salva volums que semblaven perduts.

Els descriptors de grup. Un array amb una entrada per grup, que diu on són els mapes de bits i la taula d'inodes d'aquell grup i quants elements lliures té. És l'índex que permet trobar tota la resta.

El mapa de bits de blocs. Un bit per bloc del grup: 1 = ocupat, 0 = lliure. Amb blocs de 4 KiB, un grup de 128 MiB té 32.768 blocs, que són 32.768 bits = 4.096 bytes: exactament un bloc. No és casualitat; la mida del grup es tria precisament perquè el seu mapa de bits càpiga en un bloc.

El mapa de bits d'inodes. El mateix per als inodes del grup.

La taula d'inodes. L'array d'inodes pròpiament dit. Si un grup té 8.192 inodes de 256 bytes, ocupa 2 MiB = 512 blocs. Aquí és on es calcula la posició d'un inode a partir del seu número, amb aritmètica pura i sense buscar en cap índex:

/* Localitzar l'inode 1180934 en un ext4 amb 8.192 inodes per grup */
unsigned grup    = (1180934 - 1) / 8192;      /* = 144  → grup 144        */
unsigned index   = (1180934 - 1) % 8192;      /* = 1157 → posició 1157    */
off_t    posicio = inici_taula_inodes[144] + (off_t)1157 * 256;

Dues divisions i una multiplicació: això és tot el que costa passar d'un número d'inode a la seva posició al disc. Els inodes es numeren des de l'1, d'aquí el - 1. Aquesta és la raó profunda que l'inode sigui un número i no un nom: buscar un nom exigiria recórrer una taula; un número es resol amb aritmètica en nanosegons.

La zona de dades. Tota la resta: els blocs on són els bytes dels fitxers.

Ho pots veure a la teva màquina amb dumpe2fs:

$ sudo dumpe2fs -h /dev/md0 | head -20
Filesystem volume name:   meteora-dades
Filesystem UUID:          9f3a1c22-7d4e-4a51-b7c8-2e5f0a1d6b93
Filesystem features:      has_journal ext_attr dir_index extent 64bit
Filesystem state:         clean
Inode count:              13107200
Block count:              52428800
Free blocks:              41156923
First block:              0
Block size:               4096
Blocks per group:         32768
Inodes per group:         8192
Inode size:               256

Cada línia és un camp del superbloc real. Block count: 52428800 × 4.096 = 200 GiB. Filesystem state: clean significa que es va desmuntar correctament. I dir_index i extent són característiques que apareixeran a 04-02 i 04-05.

La mida de bloc i el seu compromís, calculat

La mida de bloc es tria en formatar i no es pot canviar després. És un compromís genuí, i es veu amb números.

El cost d'un bloc gran: fragmentació interna. Com que l'assignació és per blocs sencers, l'últim bloc de cada fitxer queda parcialment buit, i aquell espai es perd. De mitjana es malbarata mig bloc per fitxer.

El cost d'un bloc petit: més blocs per gestionar. Més entrades a les metadades, més feina d'assignació, i peticions d'E/S més petites.

Amb els fitxers reals de Meteora (17.280.000 bytes):

Mida de bloc Blocs necessaris Espai ocupat Malbaratament Mapa de bits per a 200 GiB
1 KiB 16.875 17.280.000 B 0 B (exacte) 25 MiB
2 KiB 8.438 17.281.024 B 1.024 B 12,5 MiB
4 KiB 4.219 17.281.024 B 1.024 B 6,25 MiB
16 KiB 1.055 17.285.120 B 5.120 B 1,6 MiB
64 KiB 264 17.301.504 B 21.504 B 0,4 MiB

Per a fitxers de 17 MB el malbaratament és irrellevant en tots els casos: 21 KB sobre 17 MB és el 0,12 %. Però el nombre de blocs a gestionar canvia per un factor de 64.

Ara l'escenari contrari, un directori amb un milió de fitxers de 800 bytes (sessions, no lectures):

Mida de bloc Espai ocupat per 1.000.000 de fitxers Malbaratament
1 KiB 1.024 MB 224 MB (22 %)
4 KiB 4.096 MB 3.296 MB (80 %)
64 KiB 65.536 MB 64.736 MB (99 %)

Amb blocs de 64 KiB, un milió de fitxers de 800 bytes ocuparia 64 GB per emmagatzemar 800 MB. La mateixa mida de bloc que era irrellevant per a les lectures és catastròfica aquí.

Per què 4 KiB és l'estàndard universal, i no és una convenció arbitrària:

  1. Coincideix amb la mida de pàgina (mòdul 2). La memòria cau de pàgines del nucli treballa en pàgines de 4 KiB; si el bloc fes el mateix, un bloc = una pàgina i no cal trossejar ni ajuntar res. Un bloc més gran que la pàgina no es pot mapar amb mmap() de manera directa, que és precisament el que fa l'agregador amb 2026-08-31.dat (02-04). De fet, Linux no admet blocs més grans que la mida de pàgina, així que a x86-64 el màxim és 4 KiB.
  2. Coincideix amb el sector físic dels discos moderns (Advanced Format, 4Kn), així que cap escriptura no provoca el cicle llegir-modificar-escriure.
  3. Equilibra el malbaratament per a la distribució real de mides de fitxers en un sistema típic.

Regla pràctica: fes servir 4 KiB llevat que tinguis una raó mesurada per no fer-ho. La raó per baixar a 1 KiB és un volum dedicat a milions de fitxers minúsculs; per pujar hauries d'anar a XFS en arquitectures amb pàgines més grans, o a sistemes de fitxers amb bigalloc.

Marques de temps: atime, mtime, ctime, crtime i el perquè de noatime

Quatre dates, i tres d'elles es confonen constantment:

Marca Nom S'actualitza quan... Es veu amb
atime access time Es llegeix el contingut ls -lu, stat
mtime modify time Canvia el contingut ls -l (per defecte)
ctime change time Canvia l'inode ls -lc, stat
crtime creation time Es va crear el fitxer stat (ext4, XFS, Btrfs)

L'error més freqüent és creure que ctime és creation time. No ho és: és change time, el moment en què va canviar qualsevol metadada. Canviar els permisos amb chmod, el propietari amb chown o crear un enllaç dur modifica el ctime però no el mtime, perquè el contingut no ha canviat. I com que no es pot alterar cap enrere (ni tan sols touch -d el toca), el ctime és la marca que consulta un analista forense: qui manipula un fitxer pot falsejar atime i mtime, però en fer-ho actualitza el ctime, i es delata. Hi tornarem al mòdul 5.

Una taula de què toca cada operació sobre 2026-08-31.dat:

Operació atime mtime ctime
cat 2026-08-31.dat Sí No No
echo dada >> 2026-08-31.dat No Sí Sí
chmod 640 2026-08-31.dat No No Sí
chown meteora: 2026-08-31.dat No No Sí
mv 2026-08-31.dat vell.dat No No No¹
ln 2026-08-31.dat copia.dat No No Sí²

¹ Reanomenar canvia el directori, no l'inode del fitxer. ² Canvia el comptador d'enllaços, que és a l'inode.

Per què noatime millora el rendiment

Aquí hi ha el problema pràctic. Actualitzar l'atime significa escriure al disc en llegir un fitxer. Sona absurd, i ho és: converteix una operació de només lectura en una de lectura i escriptura.

Els números per a Meteora. meteo-api serveix unes 2.000 consultes per hora, cadascuna llegint el fitxer del dia. Amb atime estricte, això són 2.000 escriptures per hora sobre l'inode d'un fitxer que ningú no ha modificat: 48.000 escriptures diàries de metadades, més la seva entrada corresponent al diari (04-05), sobre un RAID 1 on cada escriptura va als dos discos. I sobre un SSD, cicles d'escriptura gastats per res.

Les opcions de muntatge disponibles, que aplicarem a Particions, Muntatge i Sistema de Fitxers Virtual:

Opció Comportament Cost
strictatime Actualitza l'atime a cada lectura Màxim
relatime Només si l'atime és anterior al mtime/ctime, o té més de 24 h Baix (per defecte des del 2009)
nodiratime Com l'anterior, però sense atime als directoris Baix
noatime Mai no actualitza l'atime Zero

relatime és el compromís que va adoptar Linux: manté la semàntica que necessiten les eines que pregunten «s'ha llegit això des de l'última modificació?» (els clients de correu, sobretot) amb una fracció del cost. noatime l'elimina del tot.

Meteora munta /var/lib/meteora amb noatime, perquè cap programa del sistema no consulta l'atime de les lectures i l'estalvi és real. La regla general: en un volum de dades de servidor, noatime és gairebé sempre correcte; en un volum d'usuaris amb clients de correu antics, queda't a relatime.

Famílies de sistemes de fitxers comparades

N'hi ha desenes. Aquests són els que et trobaràs, amb el que de debò els distingeix:

Sistema Origen Estructura Diari / CoW Suma de verif. dades Màx. fitxer Quan triar-lo
ext4 Linux, 2008 Inodes + extents Diari No (només metadades) 16 TiB Servidor Linux general. L'opció segura
XFS SGI, 1994 Arbres B+ + extents Diari No (només metadades) 8 EiB Fitxers grans, alt paral·lelisme, RHEL per defecte
Btrfs Linux, 2009 Arbres B CoW Còpia en escriure Sí 16 EiB Instantànies, sumes de verificació, RAID integrat
ZFS Sun, 2005 Arbres CoW + pools Còpia en escriure Sí 16 EiB Emmagatzematge seriós. Llicència fora del nucli Linux
F2FS Samsung, 2012 Estructurat en registre Registre Opcional 16 TiB Memòria flaix: mòbils, targetes SD
NTFS Microsoft, 1993 MFT + arbres B Diari No 8 PiB Windows
APFS Apple, 2017 Arbres CoW Còpia en escriure Només metadades 8 EiB macOS, iOS
FAT32 Microsoft, 1996 Taula FAT No No 4 GiB Compatibilitat universal, arrencada UEFI
exFAT Microsoft, 2006 Taula FAT ampliada No No 128 PiB Targetes SD grans entre sistemes
tmpfs Linux Només a la RAM N/A N/A RAM + swap /run, /dev/shm, fitxers temporals
NFS / SMB Xarxa Client-servidor Del servidor Del servidor Del servidor Compartir per xarxa (04-03)

Quatre observacions que valen més que la taula sencera:

FAT32 i el límit de 4 GiB. És el límit real que més gent es troba a la vida: copiar un vídeo de 5 GB a un llapis de memòria falla, i no per falta d'espai. FAT32 guarda la mida en 32 bits, així que 2³² − 1 = 4.294.967.295 bytes és el sostre absolut. I no té diari: un tall de llum a mitja escriptura el pot deixar incoherent sense manera automàtica de reparar-lo. Sobreviu perquè ho llegeix absolutament tot, inclosa la UEFI de la teva placa, que exigeix una partició FAT32 per arrencar.

tmpfs no és un disc. Viu a la memòria cau de pàgines i al swap: rapidíssim i volàtil. És el que hi ha darrere de /dev/shm/meteora-cache (03-03) i de /run/meteora/. Que la memòria cau de Meteora «sigui un fitxer» i alhora sigui a la RAM no és una contradicció: és un fitxer d'un sistema de fitxers que no té dispositiu al darrere. Ho veurem amb detall a 04-03.

Còpia en escriure enfront de diari. Són dues filosofies diferents per al mateix problema —sobreviure a un tall de llum—. El diari anota el que farà abans de fer-ho; la còpia en escriure mai no sobreescriu un bloc viu, escriu una còpia nova i canvia el punter al final. És el tema d'Assignació d'Espai, Journaling i Integritat.

Sumes de verificació de dades. Només Btrfs i ZFS verifiquen que les dades que retornen són les que es van escriure. ext4 i XFS verifiquen les seves metadades i el seu diari, però si un bit de les teves lectures es corromp al plat, te'l lliuren corrupte sense avisar. És la corrupció silenciosa, i també és de 04-05.

La decisió de Meteora per a /var/lib/meteora

Amb tot l'anterior, ja es pot argumentar l'elecció en lloc de copiar-la d'un tutorial. El perfil de càrrega de Meteora:

Característica de la càrrega Valor
Mida de fitxer 17,3 MB, un per dia
Nombre de fitxers ~365 a l'any, uns 1.800 en total
Patró d'escriptura Afegir al final, continu, ~8 lectures/segon
Patró de lectura Seqüencial complet (agregador) i aleatori per mmap (meteo-api)
Dispositiu RAID 1 per programari sobre dos NVMe (02-05)
Requisit d'integritat Alt: les dades no es poden regenerar
Requisit de disponibilitat Alt: meteo-api serveix 24/7

Els candidats i el seu descart raonat:

Candidat Argument a favor Per què no es tria
XFS Excel·lent amb fitxers grans, molt paral·lel, sense límit d'inodes No es pot reduir; el volum podria necessitar ajustos
Btrfs Sumes de verificació de dades, instantànies natives Rendiment irregular amb escriptures contínues; el seu RAID 5/6 no és fiable
ZFS El millor en integritat Fora del nucli; complica el manteniment i les actualitzacions
F2FS Pensat per a flaix Orientat a mòbils; menys rodatge en servidor
ext4 Madur, previsible, extents, eines Sense sumes de verificació de dades

Decisió: ext4, amb aquesta justificació:

  1. Maduresa i previsibilitat. És el sistema de fitxers amb més hores de vol de l'ecosistema Linux. Per a dades irrecuperables, «avorrit i provat» val més que «modern i prometedor».
  2. Extents. Un fitxer de 17 MB contigu es descriu amb un sol extent en lloc de 4.219 punters. Ho mesurarem amb filefrag a 04-05.
  3. Eines. dumpe2fs, debugfs, tune2fs, e2fsck i resize2fs (que sí que redueix, a diferència d'XFS) formen el joc més complet. Quan alguna cosa va malament a les tres de la matinada, això pesa.
  4. El diari en mode ordered garanteix que mai no apareixeran dades d'un altre fitxer dins de les lectures després d'una fallada. Ho justificarem a 04-05.
  5. Els inodes no són cap problema en aquesta càrrega: 1.834 de fets servir de 13 milions.
  6. La manca de sumes de verificació de dades es compensa per una altra via: md verifica el RAID 1 amb un scrub setmanal, i l'ingestor guarda un CRC32 per lectura en el seu propi format.

Els paràmetres exactes del formatatge:

sudo mkfs.ext4 \
    -b 4096 \                    # bloc de 4 KiB = mida de pàgina
    -i 1048576 \                 # un inode per MiB: pocs fitxers i grans
    -m 1 \                       # només 1 % reservat per a root (per defecte 5 %)
    -L meteora-dades \           # etiqueta estable
    -O extent,dir_index,has_journal,metadata_csum,64bit \
    /dev/md0

Què fa cada opció i per què aquí:

  • -b 4096: coincideix amb la pàgina i amb el sector físic de l'NVMe; a més permet mmap() directe.
  • -i 1048576: per defecte hi hauria 13 milions d'inodes, dels quals se'n fan servir 1.834; amb un inode per MiB en queden 200.000, de sobres, i s'estalvien uns 3 GiB de taula d'inodes que passen a ser espai útil. És un ajust segur només perquè coneixem la càrrega.
  • -m 1: ext4 reserva el 5 % per a root, perquè un disc ple no impedeixi iniciar sessió ni operar. En un volum de dades de 200 GiB això són 10 GiB immobilitzats; amb l'1 % són 2 GiB, marge suficient. Ull: a / mai no baixis del 5 %.
  • -O extent: extents en lloc de punters indirectes (04-05).
  • -O dir_index: índexs hash per a directoris grans (04-02).
  • -O metadata_csum: sumes de verificació de metadades, que detecten corrupció de l'inode o del mapa de bits.

I així és com /var/lib/meteora/lectures/2026-08-31.dat deixa de ser una cadena màgica i passa a ser l'inode 1180934 de l'ext4 etiquetat meteora-dades sobre /dev/md0.

Errors Habituals i Consells

Creure que el ctime és la data de creació. És change time: canvia amb chmod, chown o en crear un enllaç dur. La creació real és el crtime, que només mostra stat en sistemes moderns. Confondre'ls porta a conclusions falses en qualsevol anàlisi forense.

Interpretar malament el camp Blocs de stat. Sempre són blocs de 512 bytes, encara que el sistema faci servir 4 KiB. Si multipliques per 4.096 obtindràs una mida vuit vegades més gran que la real.

No mirar df -i davant d'un ENOSPC. Un disc al 26 % que dona «No queda espai al dispositiu» és gairebé sempre esgotament d'inodes. Comprova sempre les dues coses.

Suposar que el nombre d'inodes es pot ampliar. A ext4 es fixa en formatar i no hi ha marxa enrere. Si preveus milions de fitxers petits, decideix -i abans, o fes servir XFS o Btrfs, que els assignen dinàmicament.

Triar un bloc gran «perquè és més ràpid». Amb un milió de fitxers de 800 bytes, un bloc de 64 KiB malbarata el 99 % de l'espai. La mida de bloc depèn de la distribució de mides dels teus fitxers, no d'una intuïció sobre velocitat. I a Linux no pot superar els 4 KiB de la pàgina.

Formatar amb mkfs la partició equivocada. mkfs no pregunta. Confirma sempre amb lsblk i blkid abans de prémer Retorn; ho veurem a 04-03.

Consell: guarda la sortida de dumpe2fs -h dels teus volums. Tenir a mà l'UUID, la mida de bloc i les posicions dels superblocs de còpia converteix una recuperació d'emergència en un tràmit de dos minuts.

Consell: fes servir stat en lloc d'ls -l quan alguna cosa no quadri. Mostra les quatre dates, l'inode, el dispositiu i els blocs reals. La meitat dels misteris amb fitxers es resolen llegint un stat amb calma.

Consell: comprova el tipus abans de donar res per fet. Abans de fer cat sobre alguna cosa desconeguda, mira el primer caràcter d'ls -l. Un cat sobre un dispositiu de bloc de 200 GiB, o sobre una FIFO sense escriptor, no acaba com esperes.

Exercicis

Exercici 1: identificar tipus i llegir un stat

Sense fer servir ls -l, escriu una ordre que classifiqui tot el que hi ha a /dev, /run i el teu directori personal per tipus de fitxer, comptant quants n'hi ha de cadascun. Després agafa un fitxer regular d'almenys 10 MB, executa-hi stat, i respon: (a) quants blocs de 4 KiB ocupa realment?, (b) quant espai es malbarata a l'últim bloc?, (c) coincideixen mtime i ctime, i què significa que coincideixin o que no?

Exercici 2: el compromís de la mida de bloc

Un volum de 500 GiB allotjarà dues càrregues possibles. Càrrega A: els fitxers diaris de Meteora, 17.280.000 bytes cadascun, durant 30 anys. Càrrega B: 20 milions de fitxers de sessió de 600 bytes. Per a mides de bloc d'1, 4 i 64 KiB, calcula en cada càrrega: blocs totals necessaris, espai realment ocupat, malbaratament absolut i percentatge. Després indica quina mida triaries per a cada càrrega i si un sol volum pot servir per a les dues.

Exercici 3: diagnosticar un ENOSPC enganyós

Un company t'avisa: el servei de sessions de meteo-01 falla amb «No queda espai al dispositiu», però df -h mostra el volum al 31 %. Escriu el procediment complet de diagnòstic —quines ordres executes, en quin ordre i què esperes veure a cadascuna—, l'explicació tècnica de per què passa, la solució immediata per restaurar el servei i la solució definitiva perquè no torni a passar. Inclou l'ordre de formatatge que faries servir i justifica'n els paràmetres.

Solucions

Solució 1

Classificar per tipus es fa amb find -type o, millor, amb el format de stat:

for d in /dev /run "$HOME"; do
    echo "=== $d ==="
    find "$d" -maxdepth 1 -printf '%y\n' 2>/dev/null | sort | uniq -c | sort -rn
done

-printf '%y' imprimeix una sola lletra amb el tipus (f regular, d directori, l enllaç, b, c, p, s), i sort | uniq -c els compta. Sortida típica:

=== /dev ===
    198 c        ← dispositius de caràcter: terminals, /dev/null, /dev/random
     42 b        ← dispositius de bloc: discos i particions
     28 d
     18 l
=== /run ===
     34 d
     12 s        ← sòcols dels serveis, inclòs /run/meteora/api.sock
      6 p        ← FIFO, inclosa /run/meteora/lectures.fifo

Per a les preguntes, amb un stat que dona Mida: 17280000 i Blocs: 33760:

(a) stat compta blocs de 512 B: 33.760 × 512 = 17.285.120 bytes. En blocs de 4 KiB són 17.285.120 / 4.096 = 4.220 blocs. Les dades necessiten ⌈17.280.000 / 4.096⌉ = 4.219, així que el bloc extra són metadades de l'arbre d'extents.

(b) 17.280.000 = 4.218 blocs complets + 3.072 bytes. L'últim bloc fa servir 3.072 de 4.096, així que es malbaraten 1.024 bytes: el 0,006 % del fitxer. Irrellevant aquí, decisiu amb fitxers de 800 bytes.

(c) Si mtime i ctime coincideixen, l'última operació va ser una escriptura de contingut (que actualitza tots dos). Si el ctime és posterior, després d'escriure es va modificar alguna metadada: un chmod, un chown o un ln. Un ctime posterior al mtime sense motiu conegut és exactament el que fa sospitar un analista.

Solució 2

Càrrega A — un fitxer de 17.280.000 B, 30 anys × 365 = 10.950 fitxers:

Bloc Blocs/fitxer Ocupat/fitxer Malbaratament/fitxer Malbaratament total
1 KiB 16.875 17.280.000 0 0
4 KiB 4.219 17.281.024 1.024 11,2 MB
64 KiB 264 17.301.504 21.504 235 MB

Sobre 189 GB de dades, fins i tot 235 MB és el 0,12 %. Amb 4 KiB, el malbaratament és del 0,006 %: menyspreable. Aquí mana el nombre de blocs a gestionar, i 4.219 es maneja molt millor que 16.875.

Càrrega B — 20.000.000 de fitxers de 600 B (12 GB de dades reals):

Bloc Ocupat/fitxer Ocupat total Malbaratament % malbaratat
1 KiB 1.024 20,5 GB 8,5 GB 41 %
4 KiB 4.096 81,9 GB 69,9 GB 85 %
64 KiB 65.536 1.310 GB 1.298 GB 99,1 %

Amb 64 KiB no hi cap: caldrien 1,3 TB en un volum de 500 GiB per guardar 12 GB de dades.

Elecció. Càrrega A: 4 KiB, per afinitat amb la pàgina i mmap(), amb malbaratament nul a la pràctica. Càrrega B: 1 KiB, que estalvia 61 GB respecte als 4 KiB. I un advertiment important per a la càrrega B: 20 milions de fitxers necessiten 20 milions d'inodes, i el mkfs per defecte en donaria 32,7 milions —just—, així que cal fixar -i 2048 o fer servir XFS.

Un sol volum per a les dues? Tècnicament sí, però és mala idea: els requisits són oposats (bloc gran i pocs inodes enfront de bloc petit i molts inodes), i a més barrejar càrregues fa que els milions de fitxers petits fragmentin l'espai que necessiten els grans. Dos volums separats, que és justament l'argument del particionament que veurem a 04-03.

Solució 3

Procediment de diagnòstic, en ordre:

df -h /var/spool/cache        # 1. espai: 31 % → no és això
df -i /var/spool/cache        # 2. inodes: 100 % → AQUÍ HI HA
findmnt /var/spool/cache      # 3. confirmar el dispositiu i les opcions
sudo find /var/spool/cache -xdev -type f -printf '%h\n' \
     | sort | uniq -c | sort -rn | head    # 4. qui els ha creat
sudo dumpe2fs -h /dev/sdb1 | grep -E 'Inode count|Free inodes|Inode size'

El pas 2 és el diagnòstic i el 4 identifica el culpable. -xdev és important: sense això, find creuaria a altres sistemes de fitxers i comptaria fitxers que no ocupen inodes d'aquest volum.

Explicació tècnica. A ext4 el nombre d'inodes és fix i es decideix en formatar, amb un inode per cada 16 KiB per defecte. Un volum de 50 GiB té així 3.276.800 inodes. Cada fitxer, per petit que sigui, en consumeix un. Quan s'esgoten, creat() i open(O_CREAT) retornen ENOSPC —«No space left on device»— encara que quedin blocs lliures, perquè el nucli no distingeix entre els dos recursos al codi d'error. Els fitxers de sessió de 600 bytes ocupen un bloc de 4 KiB i un inode cadascun: els inodes s'esgoten quan en portes 3,2 milions, amb només 13 GB fets servir.

Solució immediata (restaurar el servei):

sudo find /var/spool/cache/sessions -type f -mtime +7 -delete
df -i /var/spool/cache          # verificar que ja hi ha inodes lliures
sudo systemctl restart sessions

Esborrar els fitxers de més de 7 dies allibera inodes immediatament. Amb milions de fitxers convé find ... -delete en lloc de rm -rf, que pot desbordar la línia d'ordres.

Solució definitiva, en tres capes:

  1. Purga automàtica: una unitat systemd amb temporitzador (mòdul 7) o una entrada de tmpfiles.d que esborri les sessions caducades cada hora.
  2. Reformatar amb la densitat correcta, amb una còpia de seguretat prèvia:
sudo mkfs.ext4 -b 1024 -i 2048 -m 0 -L sessions /dev/sdb1

-b 1024 perquè els fitxers són de 600 bytes i amb 4 KiB es malbarata el 85 %; -i 2048 dona un inode per cada 2 KiB, és a dir 26 milions d'inodes, molt per sobre dels 3,2 originals; -m 0 perquè és un volum de dades temporals on no cal reserva per a root.

  1. Vigilància: alertar quan df -i superi el 80 %, exactament igual que es vigila l'espai. Gairebé cap sistema de monitoratge no ho fa per defecte, i per això aquesta fallada continua apareixent.

Alternativa raonable: muntar /var/spool/cache com a tmpfs, ja que les sessions són volàtils per naturalesa. S'acaben els dos problemes de cop, a canvi de RAM i de perdre-les en reiniciar (04-03).

Conclusió

Un fitxer és una seqüència de bytes amb nom, mida i propietari que el sistema col·loca on vol i el programa llegeix com si fos contínua. Aquesta abstracció resol de cop els set problemes que tindria qualsevol aplicació treballant sobre el vector de blocs cru del mòdul 2, i ho fa amb la mateixa estratègia que la memòria virtual: una taula de traducció que converteix un espai lògic ordenat en un espai físic dispers.

El fitxer té tres parts en tres llocs: el contingut a la zona de dades, les metadades a l'inode, i el nom al directori. La conseqüència central, de la qual penja mig mòdul, és que el nom no és dins del fitxer: l'inode 1180934 no sap que es diu 2026-08-31.dat.

A UNIX hi ha set tipus de fitxer —regular, directori, enllaç simbòlic, dispositiu de bloc, dispositiu de caràcter, FIFO i sòcol— i els quatre últims ocupen inode però zero blocs de dades: la FIFO /run/meteora/lectures.fifo i el sòcol api.sock del mòdul 3 són entrades del sistema de fitxers el contingut de les quals viu al nucli. ls -l els distingeix pel seu primer caràcter i stat ho compta tot: mida lògica, blocs de 512 bytes, dispositiu, inode, comptador d'enllaços i les quatre dates.

Físicament, un ext4 es divideix en grups de blocs de 128 MiB, cadascun amb mapa de bits de blocs, mapa de bits d'inodes, taula d'inodes i zona de dades, precedits pel superbloc —la fitxa d'identitat, amb còpies de seguretat que salven volums— i els descriptors de grup. Passar del número d'inode a la seva posició al disc costa dues divisions i una multiplicació, i aquesta és la raó profunda que l'inode sigui un número.

La mida de bloc és un compromís mesurable: 4 KiB és l'estàndard perquè coincideix amb la pàgina de memòria (i per tant amb la memòria cau de pàgines i amb mmap()) i amb el sector físic modern; abaixar-la té sentit amb milions de fitxers minúsculs i apujar-la, a Linux, ni tan sols és possible. Els inodes, a ext4, es fixen en formatar: d'aquí l'ENOSPC amb el disc mig buit que només df -i explica. I les quatre marques de temps distingeixen llegir (atime), modificar contingut (mtime), modificar metadades (ctime) i crear (crtime); noatime elimina 48.000 escriptures diàries inútils a meteo-01.

Amb la comparació de famílies a la mà, Meteora tria ext4 per a /var/lib/meteora: maduresa davant de dades irrecuperables, extents per descriure 17 MB en un sol tram, el joc d'eines més complet per a les tres de la matinada, i un ajust conscient de -i 1048576 i -m 1 que recupera uns 11 GiB per a dades útils.

Ens queda el cap solt que hem anat deixant a cada apartat: el nom. Sabem que no és a l'inode, sabem que viu «al directori», i hem dit que un directori és «un fitxer especial», però no n'hem obert cap. Què hi ha exactament dins de /var/lib/meteora/lectures/? Com aconsegueix el sistema convertir la cadena /var/lib/meteora/lectures/2026-08-31.dat en el número 1180934, i quants accessos a disc li costa? Per què un enllaç simbòlic pot quedar-se trencat i un de dur no? I què passa quan un directori té cent mil fitxers a dins?

Tot això és el que obre la lliçó següent: Estructures de Directoris.

Fonaments de Sistemes Operatius

Mòdul 1: Introducció als Sistemes Operatius

Mòdul 2: Gestió de Recursos

Mòdul 3: Concurrència

Mòdul 4: Estructures de Fitxers

Mòdul 5: Protecció i Seguretat del Sistema

Mòdul 6: Virtualització i Contenidors

Mòdul 7: Administració i Diagnòstic a la Pràctica

© Copyright 2026. Tots els drets reservats