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
- Del dispositiu de blocs a la partició: MBR i GPT
- Esquema de particionament d'un servidor i per què separar
/var - Veure què hi ha:
lsblk,fdisk -liblkid - LVM: volums físics, grups de volums i volums lògics
- Instantànies d'LVM per copiar
/var/lib/meteoraen calent - Crear el sistema de fitxers amb
mkfs - El muntatge: què passa exactament en executar
mount - Identificació estable: UUID, etiquetes i
/etc/fstabcamp a camp - Opcions de muntatge i què protegeix cadascuna
- Desmuntar, «target is busy» i com resoldre-ho
- Muntatges bind i espais de noms de muntatge
- El Sistema de Fitxers Virtual (VFS) i els seus quatre objectes
- Sistemes de fitxers virtuals i en memòria
- 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
mkfsi 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 fitxersDos 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 | Sí |
| Afegir un disc a un volum existent | No | Sí (vgextend + lvextend) |
| Instantànies | No | Sí |
| Moure dades entre discos en calent | No | Sí (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_meteoraCom 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.
Els passos que executa el nucli, en ordre:
- Resoldre el punt de muntatge.
/var/lib/meteoraes converteix en un inode, amb l'algorisme de 04-02. Ha d'existir i ser un directori; si no,ENOTDIRoENOENT. - 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.
- 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.
- Crear un objecte
superblocken memòria, la representació viva del sistema de fitxers, amb les seves operacions (llegir inode, escriure inode, estadístiques...). - Crear una estructura
vfsmountque associa aquell superblock amb l'inode del punt de muntatge. - 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. - 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:
- Origen. Què muntar: UUID, etiqueta, dispositiu, o un nom arbitrari per als sistemes virtuals (
tmpfs,proc). - Punt de muntatge. On. Per a swap,
none. - Tipus.
ext4,vfat,tmpfs,swap,nfs... oautoperquèmountho dedueixi llegint el superbloc. - Opcions, separades per comes i sense espais. És el camp de l'apartat següent.
dump. Relíquia de la utilitatdumpdels anys 80. Avui sempre 0.pass. Ordre de comprovació ambfscken arrencar:1per a l'arrel,2per a la resta (es comproven en paral·lel si són en discos diferents) i0per no comprovar —obligatori en tmpfs i sistemes de xarxa, que no tenenfsck—.
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ò:
Un sistema de fitxers està ocupat si algun procés l'està fent servir, i «fent servir» inclou quatre casos que la gent oblida:
- Té un fitxer obert a dins (04-04).
- Té el seu cwd a dins (04-02).
- Té un fitxer mapat en memòria amb
mmap()(02-04). - 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 servirSobre 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/dadesAra 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) | Sí |
| El veu un procés confinat | Es pot trencar | Sí |
| Opcions diferents de l'original | No | Sí: 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-realEl 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 procfs té inode 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:
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/dadesEls 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 baixarExplicació. 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
- Conceptes Bàsics de Sistemes Operatius
- Història i Evolució dels Sistemes Operatius
- Tipus de Sistemes Operatius
- Funcions Principals d'un Sistema Operatiu
- Arquitectura del Nucli: Monolític, Microkernel i Híbrid
- Mode Usuari, Mode Nucli i Crides al Sistema
Mòdul 2: Gestió de Recursos
- Gestió de Processos
- Planificació de la CPU
- Gestió de Memòria
- Memòria Virtual i Paginació
- Gestió d'Emmagatzematge
- Gestió de Dispositius
- Controladors, Interrupcions i Operacions d'E/S
Mòdul 3: Concurrència
- Conceptes de Concurrència
- Fils i Processos
- Comunicació entre Processos (IPC)
- Sincronització i Exclusió Mútua
- Problemes Clàssics de Concurrència
- Interbloquejos: Prevenció, Detecció i Recuperació
Mòdul 4: Estructures de Fitxers
- Sistemes de Fitxers
- Estructures de Directoris
- Particions, Muntatge i Sistema de Fitxers Virtual
- Gestió de Fitxers
- Assignació d'Espai, Journaling i Integritat
- Seguretat i Permisos de Fitxers
Mòdul 5: Protecció i Seguretat del Sistema
- Principis de Protecció i Control d'Accés
- Usuaris, Autenticació i Escalada de Privilegis
- Amenaces Habituals i Enfortiment del Sistema
- Auditoria, Registres i Resposta a Incidents
Mòdul 6: Virtualització i Contenidors
- Virtualització: Hipervisors i Màquines Virtuals
- Contenidors: Namespaces i cgroups
- El Sistema Operatiu al Núvol
- Sistemes Operatius Mòbils i de Temps Real
