Vam acabar la lliçó anterior assenyalant una costura que portem ignorant tot el mòdul. Quan recorrem /var/lib/meteora/lectures/2026-08-31.dat component a component, donem per fet que l'arbre és una cosa homogènia. No ho és. / és un ext4 sobre una partició del primer NVMe; /var/lib/meteora és un altre ext4, sobre el RAID 1 /dev/md0; /run és tmpfs i viu a la RAM; /proc no té cap dispositiu al darrere i els seus fitxers s'inventen en el moment de llegir-los. Quatre sistemes de fitxers radicalment diferents, amb estructures internes incompatibles, i tanmateix la resolució de camins camina d'un a l'altre sense assabentar-se'n.

Aquesta lliçó explica com s'aconsegueix això, i ho fa en dues meitats que es complementen. La primera és d'administració: com es trosseja un dispositiu de blocs en particions, com LVM hi afegeix una capa de flexibilitat a sobre, com es crea un sistema de fitxers i —l'operació central— què passa exactament en executar mount, amb /etc/fstab camp a camp i les opcions que protegeixen de debò. La segona és d'arquitectura: el Sistema de Fitxers Virtual (VFS), la capa d'indirecció del nucli que fa que el mateix open() funcioni sobre un SSD, sobre la RAM i sobre un servidor a l'altra banda de la xarxa.

En acabar sabràs particionar i muntar un servidor amb criteri, entendre per què separar /var de / no és una mania sinó prevenció, resoldre el «target is busy» que tothom pateix, i explicar amb precisió per què /proc/cpuinfo es comporta com un fitxer sense ser-ho.

Contingut

  1. Del dispositiu de blocs a la partició: MBR i GPT
  2. Esquema de particionament d'un servidor i per què separar /var
  3. Veure què hi ha: lsblk, fdisk -l i blkid
  4. LVM: volums físics, grups de volums i volums lògics
  5. Instantànies d'LVM per copiar /var/lib/meteora en calent
  6. Crear el sistema de fitxers amb mkfs
  7. El muntatge: què passa exactament en executar mount
  8. Identificació estable: UUID, etiquetes i /etc/fstab camp a camp
  9. Opcions de muntatge i què protegeix cadascuna
  10. Desmuntar, «target is busy» i com resoldre-ho
  11. Muntatges bind i espais de noms de muntatge
  12. El Sistema de Fitxers Virtual (VFS) i els seus quatre objectes
  13. Sistemes de fitxers virtuals i en memòria
  14. Sistemes de fitxers en xarxa: NFS i SMB

Del dispositiu de blocs a la partició: MBR i GPT

Al mòdul 2 vam deixar el disc com un vector de blocs adreçables per LBA. Una partició és simplement un rang contigu d'aquell vector declarat com a unitat independent: «de l'LBA 2048 al 1050623, això és una cosa». Res més. La partició no imposa format ni contingut; només delimita.

Per què particionar en lloc de fer servir el disc sencer? Per quatre raons que continuen sent vàlides: aïllar l'ompliment (si /var/log es desborda, no ha d'impedir que puguis iniciar sessió), aplicar polítiques diferents de muntatge a cada zona, fer servir sistemes de fitxers diferents segons la càrrega (04-01), i satisfer els requisits d'arrencada (la UEFI exigeix una partició FAT32; el xifratge de disc necessita /boot sense xifrar).

La taula de particions viu als primers sectors del disc, i n'hi ha dos formats. MBR (Master Boot Record), del 1983, ocupa els primers 512 bytes: 446 per al codi d'arrencada, 64 per a la taula —4 entrades de 16 bytes— i 2 per a la signatura 0x55AA. GPT (GUID Partition Table), part d'UEFI, fa servir una capçalera a l'LBA 1 i un array d'entrades de 128 bytes, amb una còpia completa al final del disc.

MBR GPT
Any 1983 1998
Mida màxima de disc 2 TiB (LBA de 32 bits × 512 B) 8 ZiB
Particions primàries 4 128 (per defecte a Linux)
Particions esteses Necessàries per passar de 4 No existeixen: totes són iguals
Redundància de la taula Cap Còpia al final del disc
Suma de verificació No CRC32 de capçalera i entrades
Identificació Número de partició GUID únic per partició i per disc
Etiquetes de partició No Sí, 36 caràcters
Tipus de partició 1 byte (83, 82, 8e...) GUID de 16 bytes
Arrencada BIOS heretada UEFI (i BIOS amb bios_grub)
Protecció heretada MBR protector a l'LBA 0

Tres diferències importen de debò. El límit de 2 TiB d'MBR és infranquejable: inici i mida es guarden en 32 bits de sectors de 512 bytes, i 2³² × 512 = 2 TiB, així que qualsevol disc de 4 o 8 TB exigeix GPT. La redundància: a MBR, corrompre 512 bytes destrueix la taula i l'accés a tot; GPT en guarda una còpia íntegra al final i verifica totes dues amb CRC32, de manera que gdisk en reconstrueix una a partir de l'altra —la diferència entre «he perdut el disc» i «he trigat un minut»—. I l'MBR protector: GPT escriu a l'LBA 0 un MBR fals amb una partició de tipus 0xEE que cobreix tot el disc, perquè una eina antiga el vegi com a ocupat i no el formati alegrement.

Regla actual: fes servir GPT sempre, llevat que necessitis arrencar una BIOS heretada molt antiga.

Esquema de particionament d'un servidor i per què separar /var

Aquest és l'esquema real de meteo-01, amb dos NVMe de 512 GB en RAID 1 (02-05) més el volum de dades:

Partició Mida Tipus Punt de muntatge Sistema de fitxers
/dev/nvme0n1p1 512 MiB EFI System /boot/efi FAT32
/dev/nvme0n1p2 1 GiB Linux /boot ext4
/dev/nvme0n1p3 40 GiB Linux / ext4
/dev/nvme0n1p4 20 GiB Linux /var ext4
/dev/nvme0n1p5 8 GiB Linux swap swap
/dev/md0 196 GiB RAID 1 /var/lib/meteora ext4 (noatime)

I ara la justificació, que és el que importa. Separar /var de / no és un ritual heretat: prevé un mode de fallada concret i freqüent.

/var conté tot allò que creix sense control: registres, cues de correu, memòries cau, bases de dades, imatges de contenidors. Si comparteix partició amb / i un registre es desboca, cap procés no pot crear temporals, systemd no pot escriure el seu estat, sudo pot fallar en no poder registrar, l'intèrpret d'ordres no guarda historial ni fitxers de bloqueig, i —el que és greu— no pots iniciar sessió, perquè el teu perfil necessita escriure.

Aquesta última conseqüència és tot l'argument: un / ple és un servidor que no et deixa entrar a arreglar-lo. Amb /var separat, un registre desbocat omple /var, fallen els serveis d'aquella partició, i / conserva espai perquè puguis connectar-t'hi, diagnosticar i esborrar. És també la raó del -m 5 que ext4 reserva per defecte per a root (04-01) i que a / no l'hagis d'abaixar.

El mateix raonament, aplicat a la resta: /boot manté el nucli accessible encara que / estigui xifrat o danyat; /home impedeix que un usuari ompli el sistema i permet reinstal·lar sense perdre dades; /tmp muntat noexec,nosuid talla molts exploits; i /var/lib/meteora aïlla dades irrecuperables al seu propi RAID, amb el seu propi mkfs i el seu noatime.

El contraargument honest: les particions fixes malbaraten espai/ amb 30 GiB lliures no ajuda un /var ple— i són difícils de redimensionar. Aquesta és exactament la mancança que LVM ve a resoldre.

Veure què hi ha: lsblk, fdisk -l i blkid

Tres eines, tres punts de vista. No formatis ni particionis mai sense haver mirat les tres.

lsblk mostra l'arbre de dispositius de blocs: què conté què.

$ lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
NAME          SIZE TYPE  FSTYPE            MOUNTPOINT
nvme0n1     476,9G disk
├─nvme0n1p1   512M part  vfat              /boot/efi
├─nvme0n1p3    40G part  ext4              /
├─nvme0n1p4    20G part  ext4              /var
└─nvme0n1p6   196G part  linux_raid_member
  └─md0       196G raid1 ext4              /var/lib/meteora
nvme1n1     476,9G disk
└─nvme1n1p1   196G part  linux_raid_member
  └─md0       196G raid1 ext4              /var/lib/meteora

El que és valuós és la jerarquia: es veu que md0 està format per dues particions de discos diferents i que és ell, i no elles, qui porta l'ext4. TYPE distingeix disk, part, raid1, lvm i crypt. I un camp buit a MOUNTPOINT significa que no està muntat, que és el primer que cal comprovar abans de tocar res.

fdisk -l entra a la taula de particions:

$ sudo fdisk -l /dev/nvme0n1
Disc /dev/nvme0n1: 476,94 GiB, 512110190592 bytes, 1000215216 sectors
Mida de sector (lògica/física): 512 bytes / 512 bytes
Tipus d'etiqueta de disc: gpt

Dispositiu            Inici        Final   Sectors  Mida Tipus
/dev/nvme0n1p1         2048      1050623   1048576  512M Sistema EFI
/dev/nvme0n1p2      1050624      3147775   2097152    1G Sistema de fitxers de Linux
/dev/nvme0n1p3      3147776     87033855  83886080   40G Sistema de fitxers de Linux

El que aporta i lsblk no: Tipus d'etiqueta de disc: gpt (confirma el format), els LBA exactes d'inici i final, i la mida de sector lògica/física. L'inici al sector 2048 no és casual: alinea la primera partició a 1 MiB, cosa que garanteix que els blocs de 4 KiB del sistema de fitxers coincideixin amb els sectors físics del disc i amb les pàgines d'esborrat de l'SSD. Una partició mal alineada provoca cicles llegir-modificar-escriure a cada operació i pot costar el 30 % del rendiment; avui les eines alineen soles, però convé saber per què hi ha aquell 2048 allà.

blkid identifica el contingut: quin sistema de fitxers hi ha i amb quin UUID.

$ sudo blkid
/dev/nvme0n1p1: UUID="A1B2-C3D4" TYPE="vfat" PARTLABEL="EFI System"
/dev/nvme0n1p3: UUID="c4e8f1a0-...-3b7d" TYPE="ext4" PARTUUID="8f2a..."
/dev/md0: LABEL="meteora-dades" UUID="9f3a1c22-7d4e-4a51-b7c8-2e5f0a1d6b93" TYPE="ext4"

Aquí hi ha l'UUID que farem servir a /etc/fstab, i l'etiqueta meteora-dades que vam posar amb mkfs -L a 04-01. Ull amb la distinció: UUID identifica el sistema de fitxers (l'escriu mkfs al superbloc) i PARTUUID identifica la partició (l'escriu la taula GPT). Reformatar canvia l'UUID però no el PARTUUID.

LVM: volums físics, grups de volums i volums lògics

El problema de les particions fixes és que decideixes les mides el dia de la instal·lació, quan menys en saps, i canviar-les després és arriscat. LVM (Logical Volume Manager) insereix una capa d'indirecció que ho resol, amb tres nivells:

graph TB
    PV1["PV: /dev/sdb1 — 500 GB"] --> VG
    PV2["PV: /dev/sdc1 — 500 GB"] --> VG
    VG["<b>VG 'dades' — 1 TB</b><br/>reserva única d'extents de 4 MiB"]
    VG --> LV1["LV lv_meteora — 600 GB<br/>ext4 → /var/lib/meteora"]
    VG --> LV2["LV lv_backup — 200 GB<br/>ext4 → /srv/backup"]
    VG --> LV3["200 GB SENSE ASSIGNAR<br/>(marge per créixer)"]
  • PV (physical volume): un dispositiu de blocs —partició, disc sencer o RAID— lliurat a LVM.
  • VG (volume group): la unió de diversos PV en una reserva única d'espai, dividida en extents de 4 MiB.
  • LV (logical volume): un dispositiu de blocs virtual construït amb extents del VG. A sobre s'hi fa mkfs i es munta, exactament igual que sobre una partició.

La creació completa, i després l'ampliació en calent, sense desmuntar ni aturar el servei:

sudo pvcreate /dev/sdb1 /dev/sdc1              # 1. declarar els PV
sudo vgcreate dades /dev/sdb1 /dev/sdc1        # 2. crear el VG 'dades' (1 TB)
sudo lvcreate -L 600G -n lv_meteora dades      # 3. crear un LV de 600 GB
sudo mkfs.ext4 /dev/dades/lv_meteora           # 4. formatar-lo

sudo lvextend -L +100G /dev/dades/lv_meteora   # 5. +100 GB al volum lògic
sudo resize2fs /dev/dades/lv_meteora           # 6. i al sistema de fitxers

Dos passos perquè són dues capes: lvextend engrandeix el dispositiu virtual i resize2fs estén l'ext4 perquè ocupi l'espai nou. L'ordre importa: en ampliar, primer el volum i després el sistema de fitxers; en reduir, a l'inrevés —primer resize2fs per encongir l'ext4 i després lvreduce—, perquè si redueixes el volum abans que el sistema de fitxers, talles dades i les perds. lvresize -r fa els dos passos en l'ordre correcte i és la manera segura de fer-ho. Una nota que connecta amb 04-01: ext4 es pot reduir; XFS no, perquè xfs_growfs només creix; és un argument fort a favor d'ext4 quan no saps com evolucionaran els teus volums.

Capacitat Particions fixes LVM
Redimensionar en calent Molt difícil i arriscat Sí, una ordre
Un volum sobre diversos discos No
Afegir un disc a un volum existent No (vgextend + lvextend)
Instantànies No
Moure dades entre discos en calent No (pvmove)
Complexitat i capes que poden fallar Mínima Més gran

Instantànies d'LVM per copiar /var/lib/meteora en calent

Aquí hi ha la funcionalitat que resol un problema real de Meteora. Copiar /var/lib/meteora/lectures/2026-09-01.dat mentre l'ingestor hi escriu produeix una còpia inconsistent: el principi del fitxer és de les 03:00 i el final de les 03:04, amb una estructura Lectura possiblement tallada per la meitat. Aturar el servei mitja hora cada nit no és acceptable.

Una instantània (snapshot) d'LVM congela l'estat d'un volum en un instant:

# 1. Crear la instantània (instantani: menys d'un segon)
sudo lvcreate -L 20G -s -n snap_meteora /dev/dades/lv_meteora

# 2. Muntar-la en només lectura
sudo mkdir -p /mnt/snap
sudo mount -o ro /dev/dades/snap_meteora /mnt/snap

# 3. Copiar amb calma: el contingut està congelat, el servei continua viu
sudo tar czf /srv/backup/meteora-$(date +%F).tar.gz -C /mnt/snap .

# 4. Desmuntar i ELIMINAR la instantània
sudo umount /mnt/snap
sudo lvremove -y /dev/dades/snap_meteora

Com funciona: la instantània no copia res en crear-se. És una taula buida més una regla de còpia en la primera escriptura (copy-on-write): quan l'ingestor escriu en un bloc del volum original, LVM primer copia el contingut antic a la zona de la instantània i després deixa escriure. Així, qui llegeix la instantània veu l'estat congelat i qui llegeix l'original veu l'actual.

I ara l'advertiment, que és la part que la gent ignora i després lamenta:

Cost Detall
Penalització d'escriptura Cada escriptura nova sobre un bloc no copiat es converteix en llegir + escriure + escriure. La caiguda típica és del 20-40 %, i amb moltes instantànies actives es multiplica
Espai finit La instantània té una mida fixa (els 20 GB de l'exemple). Emmagatzema els blocs originals de tot el que canviï mentre visqui
Desbordament = pèrdua Si s'omple, la instantània s'invalida completament i la còpia es perd. El volum original no en pateix, però la teva còpia sí
Vida curta Com més temps visqui, més canvis acumula i més lent va tot. Es crea, es fa servir i s'elimina

Dimensionar-la és aritmètica: si Meteora escriu 17,3 MB al dia i la còpia triga 20 minuts, canviaran uns 240 KB, així que 20 GB donen marge de sobres fins i tot per a un pic anòmal. La vigilància es fa amb lvs, mirant la columna Data%; si s'acosta al 100 %, cal ampliar-la amb lvextend ja:

$ sudo lvs
  LV            VG     Attr       LSize   Origin      Data%
  lv_meteora    dades  owi-aos--- 600,00g
  snap_meteora  dades  swi-aos---  20,00g lv_meteora   0,12

Un matís d'honestedat tècnica: la instantània congela els blocs del dispositiu, no la memòria. Si l'ingestor tenia dades a la memòria cau de pàgines sense abocar, la instantània no les té. Per això la còpia perfecta porta un pas previ: demanar al servei que faci fsync() (o enviar-li SIGHUP), executar sync, i llavors crear la instantània. Ho veurem en parlar de fsync a Gestió de Fitxers, i les garanties de consistència són el tema d'Assignació d'Espai, Journaling i Integritat.

Crear el sistema de fitxers amb mkfs

mkfs escriu sobre el dispositiu les estructures que vam estudiar a 04-01: superbloc, descriptors de grup, mapes de bits i taula d'inodes. No pregunta i no avisa: si el dispositiu és l'equivocat, les dades anteriors deixen de ser accessibles a l'instant.

Les opcions que de debò es fan servir, i què decideix cadascuna:

Opció Què fa Quan tocar-la
-b 4096 Mida de bloc Abaixar a 1024 amb milions de fitxers petits (04-01)
-i N Un inode per cada N bytes Apujar-lo amb pocs fitxers grans; abaixar-lo amb molts de petits
-N N Nombre exacte d'inodes Quan saps la xifra exacta
-m N Percentatge reservat per a root 5 % a /; 1 % o 0 % en volums de dades
-L etiqueta Etiqueta del sistema de fitxers Sempre: facilita /etc/fstab i el diagnòstic
-O car Activar/desactivar característiques extent, dir_index, metadata_csum, ^has_journal
-E stride=,stripe_width= Alinear amb la geometria del RAID Amb RAID 5/6, marca diferències reals
-n Simulacre: no escriu res Abans de cada mkfs real

El procediment segur, amb el simulacre inclòs:

lsblk /dev/md0 ; sudo blkid /dev/md0 ; findmnt --source /dev/md0   # 1-3. verificar
sudo mkfs.ext4 -n -b 4096 -i 1048576 -m 1 -L meteora-dades /dev/md0   # 4. simulacre
sudo mkfs.ext4    -b 4096 -i 1048576 -m 1 -L meteora-dades /dev/md0   # 5. de debò

Les tres primeres ordres responen «és el dispositiu correcte?», «què conté ara?» i «està muntat?» en cinc segons, i eviten l'accident més car de l'administració de sistemes. El pas 4 amb -n imprimeix exactament el que faria —nombre d'inodes, de blocs, posicions dels superblocs de còpia— sense tocar res.

El muntatge: què passa exactament en executar mount

Arribem a l'operació central. Muntar és empeltar l'arbre d'un sistema de fitxers en un punt de l'arbre global, de manera que la resolució de camins creui d'un a l'altre sense notar-ho.

sudo mount /dev/md0 /var/lib/meteora

Els passos que executa el nucli, en ordre:

  1. Resoldre el punt de muntatge. /var/lib/meteora es converteix en un inode, amb l'algorisme de 04-02. Ha d'existir i ser un directori; si no, ENOTDIR o ENOENT.
  2. Obrir el dispositiu i llegir-ne el superbloc, que a ext4 comença al byte 1024: d'allà surten la mida de bloc, el nombre d'inodes, la posició de la taula d'inodes, l'UUID, les característiques actives i l'estat.
  3. Comprovar l'estat. Si diu «brut» —no es va desmuntar bé—, es dispara la recuperació des del diari (04-05). Si exigeix característiques que aquest nucli no admet, es rebutja el muntatge.
  4. Crear un objecte superblock en memòria, la representació viva del sistema de fitxers, amb les seves operacions (llegir inode, escriure inode, estadístiques...).
  5. Crear una estructura vfsmount que associa aquell superblock amb l'inode del punt de muntatge.
  6. Enganxar la dentry. A partir d'ara, quan la resolució de camins arribi a la dentry de /var/lib/meteora, veurà la marca d'«aquí hi ha un muntatge» i saltarà a l'inode arrel del nou sistema de fitxers.
  7. Registrar-lo a la taula de muntatges, visible a /proc/mounts.

El pas 6 és la clau de tot, i explica el comportament més desconcertant del muntatge:

Muntar sobre un directori no buit no n'esborra el contingut: l'oculta. Els fitxers continuen allà, intactes, però el camí ja no hi arriba perquè el pas 6 desvia la resolució.

Es comprova fàcilment:

sudo touch /var/lib/meteora/OCULT.txt
ls /var/lib/meteora                       # → OCULT.txt
sudo mount /dev/md0 /var/lib/meteora
ls /var/lib/meteora                       # → lectures/  arxiu/   (sense OCULT.txt!)
sudo umount /var/lib/meteora
ls /var/lib/meteora                       # → OCULT.txt  (ha tornat!)

D'aquí un incident clàssic: algú escriu dades a /var/lib/meteora abans de muntar el volum, després munta, i aquelles dades desapareixen de la vista mentre continuen ocupant espai invisible a /. Per veure-les sense desmuntar existeix el truc del bind mount de l'apartat 11.

La taula de muntatges:

$ cat /proc/mounts
/dev/nvme0n1p3 / ext4 rw,relatime 0 0
/dev/nvme0n1p4 /var ext4 rw,relatime 0 0
/dev/md0 /var/lib/meteora ext4 rw,noatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /run tmpfs rw,nosuid,nodev,size=1608040k,mode=755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=4096k,nr_inodes=2003417 0 0

/proc/mounts és la veritat del nucli, amb les opcions realment en vigor. mount sense arguments mostra el mateix, i findmnt ho presenta en arbre: accepta un punt de muntatge o un dispositiu, filtra per tipus (-t ext4) i retorna un codi de sortida útil per a scripts, així que és l'eina que cal fer servir.

Identificació estable: UUID, etiquetes i /etc/fstab camp a camp

Un problema real: els noms /dev/sdX no són estables. S'assignen en l'ordre en què el nucli detecta els discos, que depèn de la velocitat d'arrencada de cada controlador, de l'ordre dels ports i de si hi ha un USB connectat; el disc que avui és /dev/sdb pot ser /dev/sdc demà, i una entrada de fstab que l'anomeni muntarà el volum equivocat o farà fallar l'arrencada. Les quatre maneres d'identificar un dispositiu:

Forma Què identifica Estabilitat Exemple
/dev/sdb1 Nom del nucli Dolenta Canvia amb l'ordre de detecció
LABEL= Etiqueta del sistema de fitxers Bona, però es pot duplicar LABEL=meteora-dades
UUID= Sistema de fitxers, per mkfs Excel·lent UUID=9f3a1c22-7d4e-...
PARTUUID= Partició, per GPT Excel·lent, sobreviu al formatatge PARTUUID=8f2a...

Fes servir UUID= a /etc/fstab. És el que fan tots els instal·ladors moderns. L'única precaució: l'UUID canvia en reformatar, així que després d'un mkfs cal actualitzar fstab o el sistema no arrencarà.

L'/etc/fstab real de meteo-01:

# <sistema de fitxers>                         <punt>             <tipus> <opcions>                         <dump> <pass>
UUID=c4e8f1a0-2b19-4d7c-9e35-6a80f2c13b7d      /                  ext4    defaults                          0      1
UUID=A1B2-C3D4                                 /boot/efi          vfat    umask=0077,shortname=winnt        0      2
UUID=7d3e9b41-05fa-4c28-8b16-d9e4a7c0f582      /boot              ext4    defaults,nosuid,nodev,noexec      0      2
UUID=b81f6c30-9a24-4e5d-af73-1c206e8b4d95      /var               ext4    defaults,nosuid,nodev             0      2
UUID=9f3a1c22-7d4e-4a51-b7c8-2e5f0a1d6b93      /var/lib/meteora   ext4    noatime,nosuid,nodev,noexec       0      2
UUID=3f8a2c17-6d40-4b91-a5e8-7c1b09d3e264      none               swap    sw                                0      0
tmpfs                                          /tmp               tmpfs   rw,nosuid,nodev,noexec,size=2G    0      0

Els sis camps, un a un:

  1. Origen. Què muntar: UUID, etiqueta, dispositiu, o un nom arbitrari per als sistemes virtuals (tmpfs, proc).
  2. Punt de muntatge. On. Per a swap, none.
  3. Tipus. ext4, vfat, tmpfs, swap, nfs... o auto perquè mount ho dedueixi llegint el superbloc.
  4. Opcions, separades per comes i sense espais. És el camp de l'apartat següent.
  5. dump. Relíquia de la utilitat dump dels anys 80. Avui sempre 0.
  6. pass. Ordre de comprovació amb fsck en arrencar: 1 per a l'arrel, 2 per a la resta (es comproven en paral·lel si són en discos diferents) i 0 per no comprovar —obligatori en tmpfs i sistemes de xarxa, que no tenen fsck—.

L'error més perillós de tot aquest mòdul viu a fstab: una línia mal escrita pot impedir que la màquina arrenqui, i la deixa en mode d'emergència sense accés remot. El procediment segur és innegociable:

sudo cp /etc/fstab /etc/fstab.bak      # 1. còpia de seguretat
sudo nano /etc/fstab                   # 2. editar
sudo findmnt --verify --verbose        # 3. VALIDAR sintaxi, UUID i opcions
sudo mount -a                          # 4. muntar el pendent: si falla, ho diu AQUÍ

findmnt --verify comprova que els UUID i els punts de muntatge existeixen i que les opcions són vàlides sense muntar res. mount -a intenta muntar-ho tot: si hi ha un error, apareix ara, amb la màquina viva, i no a l'arrencada. I si tot i així alguna cosa surt malament, l'opció nofail evita que la fallada d'una entrada bloquegi l'arrencada —molt recomanable en discos externs i muntatges de xarxa—.

Opcions de muntatge i què protegeix cadascuna

Les opcions del quart camp són una de les eines d'enfortiment més barates que existeixen: costen zero rendiment i tanquen classes senceres d'atac.

Opció Què fa De què protegeix
defaults rw,suid,dev,exec,auto,nouser,async Res: és el conjunt permissiu per omissió
ro Només lectura Modificacions accidentals o malicioses; obligatori en mitjans forenses
rw Lectura i escriptura (Per defecte)
noexec Prohibeix executar binaris Que s'executi un programa pujat a un directori de dades o a /tmp
nosuid Ignora els bits setuid/setgid Escalada de privilegis amb un binari setuid col·locat allà (04-06)
nodev Ignora els fitxers de dispositiu Que algú creï un /dev/sda propi i llegeixi el disc cru saltant-se els permisos
noatime No actualitza l'atime Escriptures inútils (04-01)
relatime Atime mandrós (Per defecte des del 2009)
sync Escriptures síncrones Pèrdua de dades davant d'un tall; costa moltíssim rendiment
nofail No bloqueja l'arrencada si falla Que un disc absent deixi la màquina en mode d'emergència
errors=remount-ro Davant d'un error d'E/S, remunta en només lectura Que un disc moribund continuï corrompent dades

El trio noexec,nosuid,nodev és la recepta estàndard per a qualsevol volum que contingui només dades. nosuid és el més important: sense això, un atacant amb permís d'escriptura pot col·locar-hi una còpia de /bin/bash amb el bit setuid de root i obtenir un intèrpret de superusuari; amb nosuid el nucli ignora aquell bit i l'atac no funciona —una paraula a fstab enfront d'una escalada a root—. nodev tanca la via anàloga amb dispositius: sense això es podria crear un fitxer de dispositiu amb el major/menor de /dev/sda i llegir el disc sencer saltant-se els permisos. I noexec impedeix executar binaris des d'allà, encara que no és una barrera forta: un script continua corrent amb bash script.sh i un binari amb /lib/ld-linux.so.2 ./binari, així que fes-lo servir com a capa de defensa, no com a mur.

Per això /var/lib/meteora es munta amb noatime,nosuid,nodev,noexec: conté dades, mai programes, així que les quatre opcions són gratis i tanquen tres vectors. Aplicar el mateix trio a /tmp, /var i /home és una de les millors relacions esforç/benefici de l'administració de sistemes, i hi tornarem al mòdul 5. Les opcions es poden canviar en calent amb mount -o remount,ro /var/lib/meteora (i rw per tornar), que és justament el que fa el nucli amb errors=remount-ro en detectar un error d'E/S: congelar les escriptures per no empitjorar el dany.

Desmuntar, «target is busy» i com resoldre-ho

umount desmunta: aboca les escriptures pendents, sincronitza el superbloc, el marca com a net (decisiu per a 04-05) i desenganxa el punt de muntatge. Però:

$ sudo umount /var/lib/meteora
umount: /var/lib/meteora: target is busy.

Un sistema de fitxers està ocupat si algun procés l'està fent servir, i «fent servir» inclou quatre casos que la gent oblida:

  1. Té un fitxer obert a dins (04-04).
  2. Té el seu cwd a dins (04-02).
  3. Té un fitxer mapat en memòria amb mmap() (02-04).
  4. Hi ha un altre muntatge a sobre d'un subdirectori seu.

El diagnòstic, amb dues eines complementàries:

$ sudo lsof +f -- /var/lib/meteora
COMMAND    PID    USER   FD   TYPE DEVICE     SIZE/OFF   NODE NAME
meteo-api 2841 meteora  cwd    DIR    9,0         4096 1180928 /var/lib/meteora
meteo-api 2841 meteora    7r   REG    9,0     17280000 1180934 .../2026-08-31.dat
agregador 2903 meteora  mem    REG    9,0     17280000 1180934 .../2026-08-31.dat

A lsof, la columna FD és la clau: cwd és directori de treball, mem és fitxer mapat, i un número (7r) és un descriptor obert. fuser -vm /var/lib/meteora diu el mateix amb lletres: c (cwd), e (executable en ús), f (fitxer obert), r (arrel) i m (mapat).

Les solucions, en ordre de preferència:

sudo systemctl stop meteo-api agregador   # 1. EL CORRECTE: aturar qui el fa servir
sudo umount /var/lib/meteora

sudo umount -l /var/lib/meteora           # 2. mandrós: desenganxa ja, allibera després
sudo umount -f /mnt/nfs-remot             # 3. forçar (muntatges de xarxa penjats)
sudo fuser -km /var/lib/meteora           # 4. ÚLTIM RECURS: matar qui el fa servir

Sobre les tres últimes, amb honestedat. umount -l (lazy) desenganxa el punt de muntatge immediatament de la jerarquia, però manté el sistema de fitxers viu fins que es tanqui l'últim descriptor: els camins deixen de funcionar a l'instant, però el dispositiu continua en ús, així que si el teu objectiu era desconnectar-lo o formatar-lo, encara no pots. umount -f està pensat per a NFS amb el servidor caigut, on els processos estan bloquejats en estat D; en un sistema local pot deixar escriptures sense abocar. I fuser -k envia SIGKILL, sense donar oportunitat de desar res: comprova abans amb fuser -vm a qui mataràs.

Un quart cas, poc conegut però freqüent: si el sistema de fitxers sembla lliure i tot i així està ocupat, mira si tens un altre muntatge a sobre (un bind mount, un contenidor, un overlay) amb findmnt -R /var/lib/meteora, que mostra el subarbre de muntatges recursivament.

Muntatges bind i espais de noms de muntatge

Un muntatge bind fa visible un directori ja existent en un segon punt de l'arbre. No copia res ni crea un enllaç: és el mateix sistema de fitxers muntat dues vegades.

sudo mkdir -p /srv/publicacio/dades
sudo mount --bind /var/lib/meteora/lectures /srv/publicacio/dades

Ara els dos camins porten als mateixos inodes. La diferència amb un enllaç simbòlic és substancial:

Enllaç simbòlic Muntatge bind
Què és Un fitxer amb un camí a dins Una entrada a la taula de muntatges
Sobreviu al reinici Sí (és al disc) No (llevat d'entrada a fstab)
Funciona dins d'un chroot No (el camí apunta a fora)
El veu un procés confinat Es pot trencar
Opcions diferents de l'original No : es pot remuntar en només lectura

Aquesta última fila és la més útil a la pràctica: pots exposar un directori de dades a un servei només per llegir, sense tocar l'original, i de passada resoldre l'enigma de l'apartat 7 —veure el que va quedar ocult sota un muntatge— sense desmuntar res:

sudo mount -o remount,bind,ro /srv/publicacio/dades   # només aquesta vista és de lectura
sudo mount --bind / /mnt/arrel-real    # munta l'arrel REAL, sense muntatges a sobre
ls /mnt/arrel-real/var/lib/meteora     # → OCULT.txt, el fitxer amagat
sudo umount /mnt/arrel-real

El servei que serveix /srv/publicacio/dades no pot escriure; l'ingestor, que fa servir el camí original, sí. És el mecanisme darrere de ReadOnlyPaths= de systemd (mòdul 7) i dels volums de només lectura de Docker.

Els muntatges bind són, a més, la porta d'entrada a un concepte més gran: els espais de noms de muntatge (mount namespaces). Linux permet que cada procés tingui la seva pròpia taula de muntatges, de manera que /var/lib/meteora signifiqui coses diferents per a dos processos de la mateixa màquina. És la base dels contenidors, que ho combinen amb pivot_root, sistemes de fitxers per capes (overlayfs) i cgroups; es veu complet a Contenidors: Namespaces i cgroups. Aquí n'hi ha prou de quedar-se amb què la taula de muntatges no és necessàriament global, i que /proc/<pid>/mountinfo diu quina veu cada procés.

El Sistema de Fitxers Virtual (VFS) i els seus quatre objectes

Hem arribat a la peça que ho explica tot. Considera aquest programa:

int a = open("/var/lib/meteora/lectures/2026-08-31.dat", O_RDONLY);  /* ext4 en NVMe */
int b = open("/dev/shm/meteora-cache",                   O_RDONLY);  /* tmpfs a RAM  */
int c = open("/proc/2841/status",                        O_RDONLY);  /* inventat     */
int d = open("/mnt/historic/2025-01-01.dat",             O_RDONLY);  /* NFS per xarxa*/

read(a, buf, 4096);   read(b, buf, 4096);   read(c, buf, 4096);   read(d, buf, 4096);

Quatre sistemes de fitxers incompatibles: un amb inodes i extents en un SSD, un altre que viu a la memòria cau de pàgines, un altre que genera el contingut en el moment de la lectura executant codi del nucli, i un altre que tradueix cada operació en paquets de xarxa. I tanmateix, les mateixes quatre línies de codi funcionen sobre els quatre.

Això ho fa possible el VFS (Virtual File System), una capa d'abstracció dins del nucli:

graph TB
    APP["Procés en mode usuari<br/>open() read() write() close()"]
    SC["Interfície de crides al sistema (01-06)"]
    VFS["<b>VFS — Sistema de Fitxers Virtual</b><br/>superblock · inode · dentry · file"]
    E4["ext4 / XFS"]
    TMP["tmpfs"]
    PROC["procfs / sysfs"]
    NFS["NFS"]
    PC["Memòria cau de pàgines (02-04)"]
    BIO["Capa de blocs i planificador (02-05)"]
    DRV["Controlador NVMe (02-07)"]
    HW["/dev/md0 — RAID 1"]
    RAM["RAM"]
    NET["Pila de xarxa → servidor remot"]
    APP --> SC --> VFS
    VFS --> E4
    VFS --> TMP
    VFS --> PROC
    VFS --> NFS
    E4 --> PC
    TMP --> RAM
    PROC -->|genera al vol| RAM
    NFS --> NET
    PC --> BIO --> DRV --> HW

La idea és exactament la del polimorfisme en programació orientada a objectes, implementada en C amb taules de punters a funció. El VFS defineix quines operacions existeixen; cada sistema de fitxers hi aporta la seva implementació. Quan arriba un read(), el VFS no sap llegir res: mira la taula d'operacions del fitxer i crida el punter corresponent, que apunta a ext4_file_read_iter, a shmem_file_read_iter o a la funció del mòdul de procfs.

Els quatre objectes del VFS, que convé tenir clars perquè expliquen comportaments concrets:

Objecte Representa Un per... Estructura On l'has vist
superblock Un sistema de fitxers muntat Muntatge struct super_block Es crea al pas 4 de mount
inode Un fitxer concret Fitxer struct inode L'inode de 04-01, en memòria
dentry Un nom dins d'un directori Component de camí struct dentry La memòria cau de dentries de 04-02
file Un fitxer obert per un procés open() struct file El descriptor, tema de 04-04

Les relacions entre ells responen preguntes que potser t'has fet. Diverses dentries poden apuntar al mateix inode: això són els enllaços durs, dos noms i un fitxer. Diversos file poden apuntar al mateix inode: dos processos que obren el mateix fitxer tenen objectes file diferents —cadascun amb el seu desplaçament i el seu mode— sobre un sol inode, i d'aquí surt tot el comportament de descriptors, fork i dup de 04-04. I l'inode del VFS no és l'inode del disc, sinó la seva representació en memòria comuna a tots els sistemes de fitxers: un fitxer de procfsinode del VFS encara que al disc no hi existeixi res.

Un exemple de la taula d'operacions, simplificat del nucli real:

struct file_operations {                    /* el que el VFS ESPERA de qualsevol FS */
    ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
    ssize_t (*write_iter)(struct kiocb *, struct iov_iter *);
    int     (*fsync)     (struct file *, loff_t, loff_t, int);
    int     (*mmap)      (struct file *, struct vm_area_struct *);
};

const struct file_operations ext4_file_operations = {   /* el que APORTA ext4 */
    .read_iter = ext4_file_read_iter,   .write_iter = ext4_file_write_iter,
    .fsync     = ext4_sync_file,        .mmap       = ext4_file_mmap,
};

read() en mode usuari acaba, després del canvi a mode nucli de 01-06, a vfs_read(), que fa essencialment file->f_op->read_iter(...). Una indirecció per punter a funció, i aquí és on el camí es bifurca cap a ext4, tmpfs o NFS.

El que el VFS aporta, resumit: una sola implementació de les crides al sistema per a tots els sistemes de fitxers; memòries cau compartides (pàgines, dentries, inodes) que beneficien tothom; la possibilitat d'afegir un sistema de fitxers nou com a mòdul sense tocar la resta del nucli; i la transparència que permet que un camí creui d'ext4 a tmpfs a mig camí sense que cap programa se n'assabenti. És la mateixa filosofia de màquina estesa de 01-01, aplicada una capa més avall.

Sistemes de fitxers virtuals i en memòria

Amb el VFS entès, els sistemes de fitxers «rars» deixen de ser-ho. Tots implementen la mateixa interfície; el que canvia és d'on treuen les dades.

Sistema Muntat a On són les dades Persistent Per a què
procfs /proc Es generen en llegir No Processos i paràmetres del nucli
sysfs /sys Es generen en llegir No Model de dispositius, controladors
devtmpfs /dev RAM No Fitxers de dispositiu, poblat pel nucli
tmpfs /run, /dev/shm, /tmp Memòria cau de pàgines + swap No Dades volàtils ràpides
cgroupfs /sys/fs/cgroup Es generen en llegir No Límits de recursos (06-02)
overlayfs Variable Dues capes superposades Depèn Imatges de contenidors

procfs és el més peculiar: els seus fitxers no existeixen. Quan executes cat /proc/2841/status, el read() arriba via VFS a una funció del nucli que recorre el task_struct del procés 2841 i formata text sobre la marxa. Per això ls -l /proc/2841/status mostra mida 0 —el nucli no sap quants bytes produirà fins a generar-los— i per això el contingut canvia entre dues lectures consecutives. Tot el que hem fet servir dels mòduls 2 i 3 —/proc/<pid>/maps, /proc/<pid>/stack, /proc/<pid>/fd, /proc/mounts— és això: una interfície de consulta al nucli disfressada de fitxers, per poder-la fer servir amb cat, grep i awk en lloc d'amb una API especial. És una de les millors idees de Linux.

tmpfs és un sistema de fitxers complet el magatzem del qual és la memòria cau de pàgines. És rapidíssim, perquè una escriptura és una còpia a la RAM; és volàtil, i això és una característica i no un defecte —és per això que /run/meteora/lectures.fifo i /run/meteora/api.sock són allà (04-02)—; creix i encongeix dinàmicament fins al límit de size=; i pot anar-se'n a swap sota pressió de memòria, a diferència d'un disc RAM clàssic que la immobilitza.

$ df -h /dev/shm /run /tmp
tmpfs            7,7G   132M  7,5G   2% /dev/shm
tmpfs            1,6G   1,8M  1,6G   1% /run
tmpfs            2,0G    24K  2,0G   1% /tmp

I aquí es tanca un cercle del mòdul 3. La memòria cau de Meteora, /dev/shm/meteora-cache, la vam crear amb shm_open() + mmap() com a memòria compartida POSIX. Ara ja es veu què és realment: shm_open() és un open() sobre un fitxer de tmpfs muntat a /dev/shm, i mmap() mapa les seves pàgines en diversos processos. La memòria compartida POSIX a Linux està implementada sobre el sistema de fitxers, i per això li pots fer ls -l, chmod i rm com a qualsevol altre fitxer:

$ ls -l /dev/shm/
-rw-r----- 1 meteora meteora 134217728 set  1 12:41 meteora-cache

128 MiB de memòria cau que són, alhora, un fitxer i un segment de memòria compartida. No hi ha contradicció: és el VFS fent la seva feina.

Sistemes de fitxers en xarxa: NFS i SMB

El VFS permet una cosa més ambiciosa: que el sistema de fitxers estigui en una altra màquina. El client implementa les operacions del VFS traduint-les a peticions de xarxa.

NFS SMB / CIFS
Origen Sun, 1984 IBM/Microsoft, 1983
Món natural UNIX i Linux Windows
Model de permisos UID/GID d'UNIX ACL de Windows i usuaris de domini
Estat al servidor Sense estat fins a NFSv3; amb estat a la v4 Amb estat
Autenticació Confiança en l'UID (o Kerberos a la v4) Usuari i contrasenya, Kerberos
Bloqueig de fitxers Problemàtic (protocol a part fins a la v4) Integrat
Port típic 2049 445

Muntar-los és com muntar qualsevol altra cosa, que és precisament la gràcia del VFS:

sudo mount -t nfs -o vers=4,hard,timeo=600 nas.meteora.local:/export/historic /mnt/historic
sudo mount -t cifs -o credentials=/etc/smb.cred,uid=990,gid=990 //nas/dades /mnt/dades

Els tres problemes que cal conèixer abans de fer-los servir en producció:

1. La latència ho canvia tot. Un stat() local costa microsegons; sobre NFS, una anada i tornada de xarxa: entre 0,1 i 5 ms. Un ls -l d'un directori amb 1.000 fitxers fa 1.000 stat(), cosa que en local són mil·lisegons i sobre NFS poden ser cinc segons. La causa no és mai l'amplada de banda, sinó el nombre d'anades i tornades.

2. La semàntica no és la mateixa. POSIX garanteix que un write() completat és visible immediatament per a qualsevol altre procés; NFS fa servir coherència feble, desa atributs i dades a la memòria cau, i un altre client pot trigar segons a veure el canvi. Pitjor encara, el bloqueig de fitxers (flock, que veurem a 04-04) és notòriament fràgil sobre NFS. Regla pràctica: no posis sobre NFS res que depengui de bloqueigs o d'escriptures coordinades entre màquines, bases de dades en particular.

3. hard enfront de soft. Amb hard (per defecte), si el servidor deixa de respondre els processos es queden bloquejats indefinidament en estat D, sense respondre ni a SIGKILL: el quadre clínic del mòdul 3 i el motiu del detector hung task de 03-06. L'alternativa soft retorna error després d'un temps límit, però pot corrompre dades si l'error arriba a mitja escriptura. L'equilibrat és hard més intr (o NFSv4, que permet interrompre), i muntar sempre amb nofail.

Meteora fa servir NFS només per a l'arxiu històric de només lectura a /mnt/historic: dades que ja no canvien, sense bloqueigs, sense escriptures concurrents. /var/lib/meteora, on l'ingestor escriu constantment, és en emmagatzematge local sobre RAID 1, i ara ja tens els tres motius tècnics pels quals aquella decisió és la correcta.

Errors Habituals i Consells

Fer servir /dev/sdX a /etc/fstab. Els noms del nucli canvien amb l'ordre de detecció. Fes servir UUID= sempre, i recorda que l'UUID canvia en reformatar.

Editar fstab sense validar. Una línia mal escrita deixa la màquina en mode d'emergència a l'arrencada següent, i si és un servidor remot, sense accés. Còpia de seguretat, findmnt --verify i mount -a abans de reiniciar. Sempre.

Escriure al punt de muntatge abans de muntar. Els fitxers queden ocults sota el muntatge, i ocupen espai invisible a la partició de sota. Comprova-ho amb un bind mount de /.

Formatar el dispositiu equivocat. mkfs no pregunta. Les tres ordres de verificació (lsblk, blkid, findmnt --source) més el simulacre amb -n costen deu segons i eviten l'accident més car de la professió.

Reduir un volum lògic en l'ordre equivocat. En ampliar: lvextend i després resize2fs. En reduir: resize2fs primer i després lvreduce. Invertir-ho en reduir talla dades. Fes servir lvresize -r, que ho fa bé tot sol.

Deixar instantànies d'LVM vives indefinidament. Costen un 20-40 % de rendiment d'escriptura i, si s'omplen, s'invaliden i perds la còpia. Crear, fer servir i eliminar.

Recórrer a umount -l com a resposta reflexa al «target is busy». Amaga el problema: el sistema de fitxers continua en ús encara que hagi desaparegut de l'arbre. Diagnostica primer amb lsof o fuser, i atura el servei.

Muntar sistemes de fitxers de xarxa sense nofail. Un NAS apagat bloqueja l'arrencada del servidor. I amb hard, un servidor caigut deixa processos en D que no moren ni amb kill -9.

Consell: munta els volums de dades amb nosuid,nodev,noexec —tres paraules que tanquen tres vectors d'atac— i fes servir findmnt en lloc de mount a seques, que mostra l'arbre, filtra, verifica i retorna codis de sortida útils en scripts.

Exercicis

Exercici 1: diagnosticar l'arbre de muntatges

En una màquina qualsevol, executa lsblk -f, findmnt, blkid i cat /proc/mounts, i respon: (a) quants sistemes de fitxers hi ha muntats i quants tenen un dispositiu real al darrere?; (b) quines opcions té /tmp i què protegeix cadascuna?; (c) quanta RAM estan consumint els tmpfs ara mateix?; (d) crea un fitxer a /dev/shm i localitza on apareix la seva memòria a free -h. Explica el resultat de (d) amb el que saps del VFS i de la memòria cau de pàgines.

Exercici 2: dissenyar el particionament i el fstab d'un servidor

Instal·laràs un meteo-02 amb un NVMe d'1 TB i dos discos SATA de 4 TB per a l'històric. Dissenya l'esquema complet: taula de particions (justificant MBR o GPT), particions amb les seves mides i sistemes de fitxers, ús o no d'LVM, i l'/etc/fstab íntegre amb els sis camps i les opcions de muntatge justificades una a una. Explica què protegeix cada separació i què passaria si no la fessis. El servidor executarà els tres serveis de Meteora i guardarà cinc anys d'històric.

Exercici 3: còpia consistent amb instantànies

/var/lib/meteora és sobre un volum lògic de 600 GB i l'ingestor escriu sense parar. Escriu el script complet de còpia de seguretat nocturna que produeixi una còpia consistent sense aturar el servei: dimensionament justificat de la instantània, la seqüència d'ordres amb el seu control d'errors, la comprovació que la instantània no s'ha desbordat, i la neteja garantida encara que el script falli a la meitat. Explica a més per què sync abans de crear la instantània no n'hi ha prou del tot i què caldria per a una còpia perfecta.

Solucions

Solució 1

(a) wc -l < /proc/mounts dona el total i grep -c '^/dev/' /proc/mounts els que tenen dispositiu real. En un sistema típic en surten entre 25 i 40 de muntatges, dels quals només 3 a 6 tenen un dispositiu real; tota la resta és procfs, sysfs, tmpfs, devtmpfs, cgroupfs, devpts, securityfs... El sistema de fitxers que veus és majoritàriament una construcció en memòria, i aquesta és la millor demostració pràctica de per a què serveix el VFS.

(b) findmnt /tmp dona una cosa com rw,nosuid,nodev,noexec,relatime,size=2097152k. nosuid impedeix l'escalada amb un binari setuid dipositat allà —/tmp és escrivible per tothom, així que és el lloc natural per intentar-ho—; nodev impedeix crear un /dev/sda casolà i llegir el disc cru; noexec impedeix executar directament un binari descarregat (encara que no bloqueja bash script.sh); i size=2G limita quanta RAM pot consumir.

(c) df -h -t tmpfs: la columna «Usat» de cada tmpfs és RAM ocupada ara mateix, i sol rondar uns quants centenars de MiB entre /run, /dev/shm i /tmp.

(d)

free -h                                    # anota «buff/cache» i «disponible»
dd if=/dev/zero of=/dev/shm/prova bs=1M count=512 status=none
free -h                                    # buff/cache puja ~512 MiB
ls -l /dev/shm/prova                       # el fitxer existeix i fa 536870912
rm /dev/shm/prova
free -h                                    # torna a baixar

Explicació. tmpfs no té dispositiu: les seves pàgines són pàgines de la memòria cau de pàgines (02-04), així que free les comptabilitza a buff/cache. La diferència amb una memòria cau normal és crucial: les pàgines de tmpfs no es poden descartar, perquè no hi ha còpia en cap disc del qual rellegir-les; només poden anar-se'n a swap. Per això un tmpfs sense size= pot arribar a esgotar la memòria del sistema i disparar l'OOM killer de 02-04, i per això tots els tmpfs del sistema porten un límit.

Solució 2

Taula de particions: GPT, perquè els discos de 4 TB superen el límit de 2 TiB d'MBR; a més aporta redundància i CRC.

Dispositiu Mida FS Punt Justificació
nvme0n1p1 512 MiB vfat /boot/efi Exigit per UEFI
nvme0n1p2 1 GiB ext4 /boot Nuclis; fora d'LVM per simplificar l'arrencada
nvme0n1p3 16 GiB swap Amb 32 GB de RAM, la meitat per a pressió puntual
nvme0n1p4 resta LVM PV Tota la resta sota LVM, per poder redimensionar
lv_root 40 GiB ext4 / Sistema base amb folgança
lv_var 40 GiB ext4 /var Registres i cues aïllats de /
lv_meteora 600 GiB ext4 /var/lib/meteora Dades actives, amb marge
sense assignar ~300 GiB Deliberat: reserva per ampliar on calgui
md1 (RAID 1, 4 TB) 3,6 TiB ext4 /srv/historic Cinc anys d'històric amb redundància

Deixar espai sense assignar al VG és una decisió de disseny, no un descuit: com que LVM amplia en calent, és millor repartir quan sàpigues on cal que endevinar-ho el dia de la instal·lació.

UUID=<efi>       /boot/efi         vfat   umask=0077,shortname=winnt              0 2
UUID=<boot>      /boot             ext4   defaults,nosuid,nodev,noexec            0 2
/dev/vg0/lv_root /                 ext4   defaults,errors=remount-ro              0 1
/dev/vg0/lv_var  /var              ext4   defaults,nosuid,nodev                   0 2
/dev/vg0/lv_met  /var/lib/meteora  ext4   noatime,nosuid,nodev,noexec             0 2
/dev/md1         /srv/historic     ext4   noatime,nosuid,nodev,noexec,nofail      0 2
UUID=<swap>      none              swap   sw                                      0 0
tmpfs            /tmp              tmpfs  rw,nosuid,nodev,noexec,size=4G          0 0

Justificació de les opcions no òbvies: errors=remount-ro a / fa que un error d'E/S passi el volum a només lectura en lloc de continuar corrompent-se; nosuid,nodev a /var perquè no hi ha motiu legítim per a un binari setuid allà, però sense noexec perquè alguns gestors de paquets executen coses des de /var/lib; noexec sí a /var/lib/meteora i /srv/historic, que són dades pures; pass=1 només a /, 2 a la resta i 0 a swap i tmpfs, que no tenen fsck; nofail a /srv/historic perquè un RAID que no s'acobli no impedeixi arrencar; i /tmp com a tmpfs de 4 GB, ràpid, autonetejable i amb límit perquè no esgoti la RAM.

Què passaria sense les separacions. Sense /var separat, un registre desbocat ompliria / i no podries iniciar sessió per arreglar-ho. Sense /var/lib/meteora separat, no li podries aplicar noatime ni un mkfs afinat. Sense /boot separat, xifrar el disc arrel seria molt més complicat.

Solució 3

Dimensionament. La instantània emmagatzema els blocs originals de tot el que canviï mentre visqui. Meteora escriu uns 17,3 MB al dia, és a dir 720 KB/hora; si la còpia triga 30 minuts, canviaran uns 360 KB. Amb 10 GB hi ha un factor de seguretat de 28.000× davant d'un pic anòmal, i continua sent l'1,6 % del volum. Sobredimensionar aquí és barat; quedar-se curt significa perdre la còpia.

#!/bin/bash
set -euo pipefail
VG=dades ; LV=lv_meteora ; SNAP=snap_backup ; MNT=/mnt/snap
DEST=/srv/backup/meteora-$(date +%F).tar.gz

netejar() {                                  # neteja GARANTIDA, passi el que passi
    mountpoint -q "$MNT" && umount "$MNT" || true
    lvs "$VG/$SNAP" &>/dev/null && lvremove -y "$VG/$SNAP" || true
}
trap netejar EXIT

systemctl reload meteora-ingestor    # 1. SIGHUP: tancar i reobrir amb fsync (03-03)
sync                                 #    abocar la memòria cau de pàgines al dispositiu
lvcreate -L 10G -s -n "$SNAP" "/dev/$VG/$LV"        # 2. instantània (<1 segon)
mkdir -p "$MNT" && mount -o ro "/dev/$VG/$SNAP" "$MNT"   # 3. muntar en només lectura
tar czf "$DEST" -C "$MNT" .                              # 4. copiar amb calma

OCUPACIO=$(lvs --noheadings -o data_percent "/dev/$VG/$SNAP" | tr -d ' %' | cut -d. -f1)
if [ "$OCUPACIO" -ge 90 ]; then      # 5. s'ha desbordat durant la còpia?
    echo "AVÍS: instantània al ${OCUPACIO}% — la còpia pot ser invàlida" >&2
    exit 1
fi
echo "Còpia correcta a $DEST (instantània al ${OCUPACIO}%)"

Les tres decisions importants del script: set -euo pipefail avorta al primer error en lloc de continuar amb una còpia incompleta; trap netejar EXIT garanteix que la instantània s'elimina encara que el script falli o el matin —sense això, una instantània oblidada penalitza les escriptures durant dies i acaba desbordant-se—; i la comprovació posterior de data_percent avisa si la instantània es va omplir durant la còpia, que és el que converteix el script en una còpia de seguretat i no en una il·lusió.

Per què sync no n'hi ha prou del tot. sync aboca la memòria cau de pàgines del nucli al dispositiu, així que la instantània recull tot el que el nucli tenia pendent. Però no buida les memòries intermèdies d'espai d'usuari: si l'ingestor fa servir FILE* de la biblioteca C, pot tenir dades a la seva pròpia memòria intermèdia que encara no han arribat ni tan sols al nucli (04-04). D'aquí el systemctl reload previ, que li demana tancar i reobrir els seus fitxers amb fsync(). La còpia perfecta requereix a més que l'aplicació tingui un punt consistent —una transacció tancada, un fitxer de dia complet— i no només bytes abocats; amb un format de registres de 24 bytes afegits al final, qualsevol tall deixa com a molt una lectura incompleta, que el lector detecta per la mida. És la diferència entre consistència de bytes i consistència d'aplicació, i hi tornarem a 04-05.

Conclusió

Una partició és un rang contigu d'LBA declarat com a unitat independent, i la taula que les descriu és MBR o GPT. L'elecció ja no és opinable: MBR topa a 2 TiB i 4 particions primàries i no té redundància; GPT arriba a 8 ZiB, admet 128 particions, guarda una còpia de la taula al final del disc verificada amb CRC32 i protegeix del formatatge accidental amb un MBR protector. Es particiona per aïllar l'ompliment, aplicar polítiques diferents, fer servir sistemes de fitxers diferents i satisfer els requisits d'arrencada, i la separació de /var té un argument demolidor: un / ple és un servidor on no pots entrar a arreglar-lo. LVM afegeix la capa que a les particions els falta: PV, VG i LV permeten ampliar en calent (lvextend + resize2fs, en aquest ordre; a l'inrevés per reduir), repartir un volum entre discos i moure dades sense aturar res; i les seves instantànies resolen la còpia consistent de /var/lib/meteora sense aturar l'ingestor, a canvi d'un 20-40 % de penalització d'escriptura i del risc d'invalidar-se si s'omplen.

El muntatge és l'operació central del mòdul: resoldre el punt de muntatge, llegir el superbloc, comprovar l'estat, crear el superblock i el vfsmount en memòria i enganxar la dentry perquè la resolució de camins salti al nou arbre. D'aquell últim pas surten dos fets: que muntar sobre un directori no buit oculta el seu contingut sense esborrar-lo, i que la taula de muntatges de /proc/mounts és la veritat del sistema. La identificació estable és amb UUID=, mai amb /dev/sdX, i /etc/fstab té sis camps on pass val 1 a l'arrel, 2 a la resta i 0 al que no té fsck — amb el procediment obligatori de còpia de seguretat, findmnt --verify i mount -a abans de reiniciar.

Les opcions de muntatge són enfortiment gratuït: nosuid talla l'escalada per binari setuid, nodev impedeix llegir el disc cru saltant-se els permisos, noexec afegeix una capa més, i errors=remount-ro atura el dany d'un disc moribund. Per això /var/lib/meteora va amb noatime,nosuid,nodev,noexec. El «target is busy» té quatre causes —fitxer obert, cwd, mmap i muntatge a sobre—, es diagnostica amb lsof o fuser -vm, i es resol aturant el servei: umount -l desenganxa però no allibera, i fuser -k mata sense avisar. Els muntatges bind exposen un mateix arbre en dos punts amb opcions diferents, permeten veure el que està ocult sota un muntatge i són l'avantsala dels espais de noms de muntatge de 06-02.

I l'explicació de fons de tot és el VFS: quatre objectes —superblock per muntatge, inode per fitxer, dentry per nom, file per obertura— i taules de punters a funció que fan que vfs_read() acabi a ext4_file_read_iter, a shmem_file_read_iter o al client NFS segons el cas. Gràcies a ell, /proc pot generar els seus fitxers en llegir-los —d'aquí la mida 0 i el contingut canviant—, tmpfs pot ser un sistema de fitxers el magatzem del qual és la memòria cau de pàgines —i per això /dev/shm/meteora-cache és alhora un fitxer i memòria compartida POSIX—, i NFS pot posar un sistema de fitxers a l'altra banda de la xarxa, amb els seus tres inconvenients: latència per anada i tornada, coherència feble que trenca els bloqueigs, i hard que deixa processos en D quan el servidor cau.

Ja tenim el mapa complet de l'emmagatzematge: sabem què és un fitxer, com se li posa nom, i com s'acobla l'arbre pel qual hi arribem. El que no hem fet encara és fer-lo servir des d'un programa. Què passa exactament quan open() retorna el número 3? Per què pare i fill comparteixen el desplaçament després d'un fork però dos open del mateix fitxer no? Com implementa l'intèrpret d'ordres la redirecció > i aquell 2>&1 que tothom copia sense entendre? I com s'assegura l'agregador que les mitjanes horàries que publica no es llegeixin mai a mig escriure?

És el que veurem a Gestió de Fitxers.

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