/srv/tramontana/backups porta setmanes creixent. Cada matinada, a les 4:20, copia_tramontana.sh hi deixa una còpia nova sense que ningú hagi calculat quant hi cap, i el disc arrel de 23 GB va pel 30 %. La pregunta no és si s'omplirà, sinó quan — i què passarà amb l'aplicació quan passi, perquè una / plena no és «va lent»: és una màquina que no pot ni escriure un registre ni completar una transacció. En aquesta lliçó baixes per fi al maquinari: veuràs la pila completa des del disc físic fins al punt de muntatge, particionaràs, formataràs, entendràs /etc/fstab camp a camp (i per què una línia mal escrita impedeix arrencar), i muntaràs LVM, que és el que fa servir un servidor de debò. Al final, /srv/tramontana/backups viurà al seu propi volum lògic ampliable en calent.

Contingut

  1. La pila d'emmagatzematge, de dalt a baix
  2. Identificar el maquinari: lsblk, blkid, fdisk -l
  3. Taules de particions: MBR enfront de GPT
  4. Particionar amb fdisk i parted
  5. Sistemes de fitxers comparats, i els inodes revisitats
  6. Muntar: mount, opcions, bind i findmnt
  7. /etc/fstab camp a camp i la xarxa de seguretat
  8. Espai: df, du, i el fitxer esborrat que no l'allibera
  9. Intercanvi: partició, fitxer i quant en cal
  10. LVM: PV, VG, LV, ampliar en calent i instantànies
  11. RAID per programari amb mdadm
  12. Quotes de disc
  13. Cas Tramontana: un disc nou per a les còpies

  1. La pila d'emmagatzematge, de dalt a baix

Entre el plat (o la cel·la NAND) i el cat fitxer.txt que escrius hi ha cinc o sis capes. Confondre-les és la causa del 90 % dels errors d'emmagatzematge.

flowchart TD
    D["Disc físic<br/>/dev/sdb — 20 GiB"] --> T["Taula de particions GPT"]
    T --> P1["Partició /dev/sdb1"]
    P1 --> PV["PV — pvcreate"]
    PV --> VG["VG vg-dades<br/>agrupa PV, 5G lliures"]
    VG --> LV1["LV lv-backups 15G"]
    LV1 --> FS["Sistema de fitxers<br/>mkfs.ext4 — UUID"]
    FS --> M["Punt de muntatge<br/>/srv/tramontana/backups"]

Les capes d'LVM són opcionals —sense elles la partició es formata directament—, però resolen el pitjor problema de tots: una partició no es pot ampliar si l'espai lliure no és just al darrere; un volum lògic sí, encara que l'espai sigui en un altre disc.

  1. Identificar el maquinari: lsblk, blkid, fdisk -l

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   25G  0 disk
├─sda1   8:1    0    1M  0 part
├─sda2   8:2    0    2G  0 part /boot
└─sda3   8:3    0   23G  0 part /
sdb      8:16   0   20G  0 disk    # el disc nou, encara sense taula de particions
$ lsblk -f
NAME   FSTYPE LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda3   ext4   arrel  3f0a91c4-8d2e-4b17-9c55-0a7ce31f77b2   14.8G    30% /
sdb

lsblk -f és l'ordre que faràs servir més vegades: diu el tipus de sistema de fitxers, l'etiqueta, l'UUID i l'ús real.

$ sudo blkid /dev/sda3
/dev/sda3: LABEL="arrel" UUID="3f0a91c4-8d2e-..." TYPE="ext4" PARTUUID="a1b2c3d4-03"
$ sudo fdisk -l /dev/sda | sed -n '1,2p;5p'
Disk /dev/sda: 25 GiB, 26843545600 bytes, 52428800 sectors
Disklabel type: gpt
Prefix Què és On apareix
/dev/sda, sdb… SATA, SAS, USB i la majoria dels virtuals VirtualBox, físics
/dev/nvme0n1 (particions p1) SSD NVMe Servidors i portàtils moderns
/dev/vda Disc paravirtualitzat virtio KVM, núvol (AWS, OpenStack)

I el detall crític: aquests noms poden canviar entre arrencades. N'hi ha prou d'afegir un disc, canviar l'ordre dels controladors o que el nucli detecti els dispositius en un altre ordre perquè el sdb d'avui sigui el sdc de demà. Per això mai no es munta per nom de dispositiu a fstab: es munta per UUID o per LABEL, que viatgen dins del sistema de fitxers mateix.

  1. Taules de particions: MBR enfront de GPT

Aspecte MBR (msdos) GPT
Antiguitat 1983 2000, part d'UEFI
Mida màxima de disc 2 TiB 8 ZiB (sense límit pràctic)
Nombre de particions 4 primàries (o 3 + estesa) 128 per defecte
Redundància i integritat Cap: un sector malmès i adeu Còpia al final del disc i CRC32
Arrencada BIOS heretada UEFI (i BIOS amb partició bios_grub)

Per a qualsevol disc nou avui: GPT, sense excepcions que mereixin discussió. La partició d'1 MiB que veus a sda1 és precisament la bios_grub que GRUB necessita en un GPT arrencat per BIOS heretada; el seu paper s'explica a 07-01.

  1. Particionar amb fdisk i parted

fdisk és interactiu i còmode; parted admet ordres en una línia, cosa que el fa apte per a scripts. Preparem /dev/sdb amb una única partició que ocupi el disc sencer:

$ sudo parted -s /dev/sdb mklabel gpt
$ sudo parted -s /dev/sdb mkpart dades 1MiB 100%
$ sudo parted -s /dev/sdb set 1 lvm on
$ sudo parted -s /dev/sdb print | tail -3
Partition Table: gpt
Number  Start   End     Size    Name   Flags
 1      1049kB  21.5GB  21.5GB  dades  lvm

L'1MiB d'inici no és un caprici: alinea la partició amb els blocs físics i evita una penalització de rendiment notable en SSD i en cabines.

A fdisk la sessió equivalent seria g (crear GPT), n (nova partició), Retorn tres vegades, t i 31 (tipus Linux LVM) i w per escriure. Res no s'escriu fins a la w: q et treu sense tocar res, i aquesta és la xarxa de seguretat de fdisk.

Si el nucli no s'assabenta de la taula nova —típic quan el disc té alguna partició muntada—, sudo partprobe /dev/sdb la torna a llegir, i lsblk /dev/sdb confirma que hi apareix sdb1.

  1. Sistemes de fitxers comparats, i els inodes revisitats

FS Maduresa Ampliar / Reduir Instantànies Quan triar-lo
ext4 Màxima; per defecte a Ubuntu Sí / sí, desmuntat No (les dona LVM) L'opció segura per a gairebé tot
XFS Molt alta; per defecte a RHEL En calent / no No Fitxers grans, escriptura paral·lela
Btrfs Estable en usos comuns Sí / sí Sí, natives Instantànies freqüents, sumes de verificació
ZFS Molt alta, integrat a Ubuntu Sí / segons disseny Sí, i enviament/recepció RAID + FS unificats; exigeix RAM

Regla pràctica per a un servidor Ubuntu convencional: ext4 sobre LVM. Tens redimensionament, instantànies (les de l'LVM) i el sistema de fitxers més provat que existeix.

$ sudo mkfs.ext4 -L backups /dev/vg-dades/lv-backups
Creating filesystem with 3932160 4k blocks and 983040 inodes
Filesystem UUID: 9d4f2b70-6c1a-4e8b-b3f7-52a0c9e14d68
$ sudo tune2fs -l /dev/vg-dades/lv-backups | grep -E 'Volume name|Inode count'
Volume name:              backups
Inode count:              983040

tune2fs permet canviar l'etiqueta (-L), l'interval de comprovació (-i) i, molt útil en un volum de dades, el 5 % reservat per a root: sudo tune2fs -m 1 /dev/vg-dades/lv-backups recupera uns 600 MiB en 15 GiB. Aquell 5 % té sentit a / —evita que un disc ple impedeixi a root arreglar la situació—, però en un volum dedicat a còpies és espai llençat.

Inodes: l'altre límit

A 02-06 vas veure que l'inode guarda les metadades i que el nom és només una entrada de directori. Aquí arriba la conseqüència operativa: el nombre d'inodes es fixa en formatar i no creix. Un directori amb milions de fitxers diminuts els pot esgotar amb el disc mig buit, i l'error és desconcertant:

$ df -h /srv/tramontana/backups | tail -1
/dev/mapper/vg--dades-lv--backups  15G   6.1G  8.2G  43% /srv/tramontana/backups
$ df -i /srv/tramontana/backups | tail -1
/dev/mapper/vg--dades-lv--backups  983040  983021      19  100% /srv/tramontana/backups

43 % d'espai lliure i No space left on device en crear un fitxer. Davant d'aquest error, df -i és la segona comprovació obligatòria. La solució passa per esborrar fitxers petits o reformatar amb més inodes (mkfs.ext4 -i 8192).

  1. Muntar: mount, opcions, bind i findmnt

sudo mkdir -p /mnt/proves && sudo mount /dev/vg-dades/lv-backups /mnt/proves
sudo mount -o remount,ro /mnt/proves   # canviar opcions sense desmuntar; umount per alliberar

Si umount respon «target is busy», reprèn lsof i fuser de 03-06:

$ sudo fuser -vm /mnt/proves
                     USER        PID ACCESS COMMAND
/mnt/proves:         operador   2841 ..c..  bash

Algú —tu, probablement— hi té el seu directori de treball. umount -l (lazy) desmunta quan s'alliberi, però és un pedaç.

Opció Què fa Quan fer-la servir
defaults rw,suid,dev,exec,auto,nouser,async Punt de partida
noatime No actualitza la marca d'últim accés Sempre en servidors: estalvia escriptures
nodev / nosuid Ignora fitxers de dispositiu / bits SUID Qualsevol volum de dades: tanca la via de 05-02
noexec / ro Prohibeix executar binaris / només lectura Còpies, /tmp, pujades; forense
nofail L'arrencada continua si falta el dispositiu Tot disc que no sigui /
$ findmnt -no SOURCE,FSTYPE,OPTIONS /srv/tramontana/backups
/dev/mapper/vg--dades-lv--backups ext4 rw,noatime,nodev,nosuid

findmnt és infinitament més llegible que mount sense arguments, i findmnt --verify valida el fstab sense muntar res. Un muntatge bind (sudo mount --bind /srv/tramontana/backups/enviaments /opt/tramontana/sortida) fa aparèixer un directori existent en un altre punt de l'arbre sense copiar res: és la manera neta d'exposar una carpeta a un servei confinat, i a 05-05 veuràs que systemd fa el mateix amb BindPaths.

  1. /etc/fstab camp a camp i la xarxa de seguretat

# /etc/fstab
# <dispositiu>                               <punt>                   <tipus> <opcions>                  <dump> <fsck>
UUID=3f0a91c4-8d2e-4b17-9c55-0a7ce31f77b2    /                        ext4   defaults,noatime             0      1
UUID=b7e12a55-0c4d-4e39-8a61-3f9d2b70c1a8    /boot                    ext4   defaults,noatime             0      2
/dev/mapper/vg--dades-lv--backups            /srv/tramontana/backups  ext4   defaults,noatime,nodev,nosuid,nofail  0  2
Camp Contingut Notes
1 Dispositiu UUID= o LABEL=, mai /dev/sdb1
2 i 3 Punt de muntatge i tipus El directori ha d'existir; ext4, xfs, swap, auto
4 Opcions Separades per comes, sense espais
5 i 6 dump i fsck El 5 és una relíquia (sempre 0); el 6 val 1 per a /, 2 per a la resta i 0 per no comprovar

Per què un fstab mal escrit impedeix arrencar

En l'arrencada, systemd converteix cada línia de fstab en una unitat .mount i les fa dependència de local-fs.target. Si un dispositiu no apareix, l'arrencada espera 90 segons i després cau a mode d'emergència demanant la contrasenya de root — que a Ubuntu està bloquejada. Un servidor remot en aquest estat és un servidor perdut fins que algú obri la consola.

Per això hi ha dues regles innegociables:

sudo cp -a /etc/fstab /etc/fstab.bak-$(date +%F)   # còpia prèvia, com sempre
sudo vim /etc/fstab && sudo diff -u /etc/fstab.bak-$(date +%F) /etc/fstab
sudo findmnt --verify --verbose                    # validació sintàctica
sudo mount -a                                      # muntar TOT el del fstab ARA

mount -a abans de reiniciar no és opcional. Si falla, ho arregles amb el servidor dret; si no l'executes, ho descobriràs amb el servidor caigut. I afegeix nofail a tot el que no sigui /: converteix una fallada d'arrencada en un avís al registre.

  1. Espai: df, du, i el fitxer esborrat que no l'allibera

$ df -h --total | tail -1
total             25G   6.9G   17G  30%
$ sudo du -sh --max-depth=1 /srv/tramontana 2>/dev/null | sort -h
4.8G	/srv/tramontana/backups
6.1G	/srv/tramontana

ncdu fa el mateix de manera interactiva i és el que faràs servir quan busquis el culpable amb pressa. Recorda de 02-03 que du mesura espai ocupat en blocs i ls -l la mida lògica: no tenen per què coincidir.

El clàssic: df diu ple, du diu buit

$ df -h / | tail -1
/dev/sda3         23G    23G     0  100% /
$ sudo du -sh /var
2.1G	/var

Falten gigues que ningú no veu. L'explicació connecta directament amb els inodes de 02-06: quan esborres un fitxer que un procés té obert, desapareix el nom del directori, però l'inode i els seus blocs continuen vius fins que l'últim descriptor es tanqui. Algú va fer rm sobre un registre gegant i el procés continua escrivint en un fitxer sense nom.

$ sudo lsof +L1
COMMAND    PID           USER  FD TYPE  SIZE/OFF NLINK   NODE NAME
tramonta  1284 svc-tramontana  3w  REG 16106127360   0 262147 /var/log/tramontana/acces.log (deleted)

NLINK 0 i (deleted) són la signatura del problema. Les dues sortides: reiniciar el procés (systemctl restart, que veurem a 05-05) o, si no pots, truncar el fitxer pel seu descriptor amb sudo truncate -s 0 /proc/1284/fd/3, que allibera l'espai sense matar-lo.

I la lliçó de fons: un registre no s'esborra, es rota — que és exactament el que muntarem a 05-06.

  1. Intercanvi: partició, fitxer i quant en cal

L'intercanvi (swap) és espai de disc que el nucli fa servir per descarregar pàgines de memòria poc utilitzades. Avui es prefereix un fitxer d'intercanvi a una partició: es redimensiona sense tocar la taula de particions.

$ sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile
$ sudo mkswap /swapfile && sudo swapon /swapfile && swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

Amb la seva línia a fstab (/swapfile none swap sw 0 0). El chmod 600 és obligatori: el contingut de l'intercanvi inclou trossos de memòria de processos, i això inclou secrets.

vm.swappiness (0–200, per defecte 60) decideix quanta pressa es dona el nucli a fer-lo servir; baixar-lo a 10 és l'habitual en un servidor d'aplicació. L'ajust fi d'aquest i altres paràmetres del nucli és matèria de 07-03. Quant d'intercanvi? Amb 3,8 GB de RAM, entre 2 i 4 GB és raonable: no com a substitut de memòria —si el servidor fa intercanvi constantment, anirà molt lent igualment—, sinó com a coixí que evita que l'OOM killer mati l'aplicació davant d'un pic puntual.

  1. LVM: PV, VG, LV, ampliar en calent i instantànies

LVM introdueix tres nivells: els PV (particions o discs sencers lliurats a LVM), el VG (una bossa d'espai formada per un o diversos PV) i els LV (els «discs virtuals» que es formaten i es munten). El VG es divideix en extents de 4 MiB, i un LV és simplement un conjunt d'extents, que no han de ser contigus ni ser al mateix disc. D'aquí ve tot el poder d'LVM.

$ sudo pvcreate /dev/sdb1 && sudo vgcreate vg-dades /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
  Volume group "vg-dades" successfully created
$ sudo lvcreate -L 15G -n lv-backups vg-dades
  Logical volume "lv-backups" created.
$ sudo vgs && sudo lvs
  VG       #PV #LV #SN Attr   VSize   VFree
  vg-dades   1   1   0 wz--n- <20.00g <5.00g
  LV         VG       Attr       LSize
  lv-backups vg-dades -wi-a----- 15.00g

Fixa't que hem deixat 5 GiB lliures al VG expressament: són el marge per ampliar el volum i, sobretot, per poder crear una instantània. Un VG al 100 % és un VG sense maniobra.

Ampliar en calent, amb el volum muntat i en ús:

$ sudo lvextend -L +3G -r /dev/vg-dades/lv-backups
  Size of logical volume vg-dades/lv-backups changed from 15.00 GiB to 18.00 GiB.
  The filesystem on /dev/mapper/vg--dades-lv--backups is now 4718592 (4k) blocks long.

L'opció -r (--resizefs) és la clau: amplia l'LV i el sistema de fitxers de sobre en un sol pas. Sense ella tindries un volum més gran i un df idèntic, que és l'error més freqüent de qui comença amb LVM. lvextend -l +100%FREE -r es menja tot l'espai lliure del VG.

Reduir és una altra història. Cal fer-ho al revés (primer el sistema de fitxers, després l'LV), amb el volum desmuntat, i XFS directament no es pot reduir. Un error d'ordre aquí destrueix dades. Regla: crea els LV petits i amplia'ls quan calgui; mai al revés.

Instantànies LVM

Una instantània és un LV que guarda les diferències respecte a l'original des de l'instant de la seva creació. Es crea en segons i permet copiar un volum en un estat congelat i coherent mentre l'aplicació continua escrivint:

$ sudo lvcreate -L 2G -s -n snap-pre-desplegament /dev/vg-dades/lv-backups
  Logical volume "snap-pre-desplegament" created.
$ sudo mount -o ro /dev/vg-dades/snap-pre-desplegament /mnt/snapshot   # copiar d'aquí
$ sudo umount /mnt/snapshot && sudo lvremove -y /dev/vg-dades/snap-pre-desplegament

Dos advertiments imprescindibles: la instantània s'omple si l'original canvia més del que la seva mida permet, i quan s'omple s'invalida i es perd. I no és una còpia de seguretat: viu al mateix VG, al mateix disc. És una eina de coherència, i així la farem servir a 05-08.

  1. RAID per programari amb mdadm

Nivell Discs mín. Capacitat útil Tolera Escriptura
0 (striping) 2 100 % Res: un disc cau i es perd tot Molt ràpida
1 (mirall) 2 50 % 1 disc Normal
5 / 6 3 / 4 n−1 / n−2 1 / 2 discs Penalitzada per la paritat
10 (1+0) 4 50 % 1 per mirall Ràpida; l'elecció per a bases de dades
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
mdadm: array /dev/md0 started.
$ cat /proc/mdstat | tail -1
      20955136 blocks super 1.2 [2/2] [UU]
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf && sudo update-initramfs -u

[UU] significa els dos discs sans; un [U_] és un disc caigut i cal actuar avui, no la setmana que ve. Sobre /dev/md0 s'hi posa després un PV d'LVM, i així es combinen redundància i flexibilitat.

RAID no és una còpia de seguretat. RAID protegeix que un disc es trenqui. No protegeix d'un rm -rf (es replica a l'instant al mirall), ni d'un xifratge per ransomware, ni d'una fallada del controlador que corrompi tots dos discs, ni d'un incendi a la sala. La còpia de seguretat és 05-08, i són coses diferents i complementàries.

  1. Quotes de disc

Quan diversos usuaris comparteixen un volum, les quotes limiten quant ocupa cadascun. S'activen amb usrquota,grpquota a fstab, s'inicialitzen amb quotacheck -cug i es fixen amb edquota -u usuari o sense interacció: sudo setquota -u luis 5G 6G 0 0 /srv/tramontana/backups (tou 5G, dur 6G), i sudo repquota -s /srv/tramontana/backups dona l'informe d'ús. El límit tou es pot superar durant un període de gràcia; el dur no se supera mai. En un servidor d'aplicació amb un únic usuari de servei són poc útils; en un de compartit són la diferència entre un incident i una trucada a les tres de la matinada.

  1. Cas Tramontana: un disc nou per a les còpies

La Marta aprova afegir un disc de 20 GiB a la VM. L'objectiu: que /srv/tramontana/backups deixi de competir per l'espai de /, sense perdre ni un byte de les còpies existents i sense que copia_tramontana.sh se n'assabenti.

Pas 1 — Afegir el disc. Amb la VM apagada, VirtualBox → Emmagatzematge → disc de 20 GiB. En arrencar, lsblk ha de mostrar sdb sense particions.

Pas 2 — Partició, PV, VG i LV: les ordres dels apartats 4 i 10, ja executades. Resultat: vg-dades de 20 GiB amb lv-backups de 15 GiB i 5 GiB de marge.

Pas 3 — Formatar i muntar en un punt temporal.

sudo mkfs.ext4 -L backups /dev/vg-dades/lv-backups && sudo tune2fs -m 1 /dev/vg-dades/lv-backups
sudo mkdir -p /mnt/nou && sudo mount /dev/vg-dades/lv-backups /mnt/nou

Pas 4 — Copiar preservant-ho tot. rsync -aHAX no és luxe: -a conserva permisos i propietaris (l'operador:tramontana de 05-01), -H els enllaços durs, -A les ACL de 05-02 i -X els atributs estesos.

$ sudo rsync -aHAX --info=progress2 /srv/tramontana/backups/ /mnt/nou/
$ sudo diff -qr /srv/tramontana/backups /mnt/nou && echo "Contingut idèntic"
Contingut idèntic
$ sudo du -sh /srv/tramontana/backups /mnt/nou
4.8G	/srv/tramontana/backups
4.8G	/mnt/nou

(Abans de copiar, comenta la línia de cron de la còpia perquè no n'entri una a mitja feina.)

Pas 5 — Intercanviar, amb xarxa de seguretat. No esborrem l'original: el reanomenem, i així la reversió és instantània. sudo umount /mnt/nou && sudo mv /srv/tramontana/backups /srv/tramontana/backups.vell && sudo mkdir /srv/tramontana/backups.

Pas 6 — fstab, amb les tres proteccions.

$ sudo cp -a /etc/fstab /etc/fstab.bak-$(date +%F)
$ echo "UUID=$(sudo blkid -s UUID -o value /dev/vg-dades/lv-backups) /srv/tramontana/backups ext4 defaults,noatime,nodev,nosuid,nofail 0 2" | sudo tee -a /etc/fstab
$ sudo diff -u /etc/fstab.bak-$(date +%F) /etc/fstab | tail -1
+UUID=9d4f2b70-... /srv/tramontana/backups ext4 defaults,noatime,nodev,nosuid,nofail 0 2
$ sudo mount -a && findmnt -no SOURCE,OPTIONS /srv/tramontana/backups
/dev/mapper/vg--dades-lv--backups rw,nosuid,nodev,noatime

nosuid i nodev perquè en un volum de còpies no hi ha d'haver mai un binari SUID ni un fitxer de dispositiu; nofail perquè una fallada d'aquest disc no pot impedir que arrenqui el servidor.

Pas 7 — Restaurar la propietat, verificar i netejar.

$ sudo chown -R operador:tramontana /srv/tramontana/backups
$ sudo chmod 2770 /srv/tramontana/backups          # SGID de 05-02: grup heretat
$ sudo -u operador /home/operador/scripts/copia_tramontana.sh --dry-run
[2026-08-18T11:04:12+02:00] simulació: destí /srv/tramontana/backups (9.4G lliures)
$ df -h /srv/tramontana/backups | tail -1
/dev/mapper/vg--dades-lv--backups   15G   4.9G  9.4G  35% /srv/tramontana/backups

Només quan una còpia real hagi funcionat i se n'hagi verificat el sha256sum s'esborra /srv/tramontana/backups.vell, i s'anota tot:

sudo tee -a /opt/tramontana/HISTORIAL >/dev/null <<'FI'
2026-08-18  Disc de còpies (operador)
  - sdb 20G -> GPT + PV + vg-dades (5G lliures per a instantànies) + lv-backups 15G ext4
  - rsync -aHAX, fstab per UUID amb nofail/nodev/nosuid, mount -a OK
  - backups.vell conservat fins a la primera còpia verificada
FI

Errors Comuns i Consells

  • Muntar per /dev/sdb1 a fstab. El dia que l'ordre de detecció canviï, arrencarà el disc equivocat o cap. UUID o LABEL, sempre.
  • Reiniciar sense mount -a. És la causa número u de servidors que no tornen. I nofail a tot el que no sigui /.
  • lvextend sense -r. El volum creix, df no canvia i perds mitja hora. Amb -r, el sistema de fitxers creix amb ell. I no omplis el VG al 100 %: sense espai lliure no hi ha instantània ni marge per ampliar.
  • Confiar en RAID com a còpia de seguretat. No ho és, i descobrir-ho el dia de l'esborrat accidental és car.
  • rm sobre un registre en ús. L'espai no s'allibera fins que el procés tanqui el descriptor: lsof +L1 el delata. Els registres es roten (05-06).
  • Copiar dades amb cp -r en comptes de rsync -aHAX: perds propietaris, enllaços durs, ACL i atributs, i després els permisos de 05-01 no quadren.
  • Consell: guarda lsblk -f, vgs, lvs i una còpia del fstab al costat de l'HISTORIAL. Reconstruir de memòria la disposició de discs, amb el servidor caigut, no és un pla.

Exercicis

  1. Diagnòstic de disc ple. df -h / marca 100 %, però du -sh / suma bastant menys. Enumera les tres causes possibles en ordre de probabilitat i l'ordre que confirma cadascuna.
  2. Ampliar en calent. lv-backups (15 GiB) s'ha quedat curt i el VG té 5 GiB lliures. Amplia'l 3 GiB sense desmuntar, verifica que l'espai és visible per a df i explica què hauria passat sense -r.
  3. Entrada de fstab segura. Escriu la línia de fstab per a un volum de pujades d'usuaris muntat a /opt/tramontana/shared/uploads, amb les opcions que un directori on escriuen tercers ha de tenir, i descriu com la validaries abans de reiniciar.

Solucions

1. Per ordre de probabilitat:

sudo lsof +L1     # (a) fitxer esborrat amb un procés que el manté obert
df -i /           # (b) inodes esgotats: hi ha espai però no es pot crear res
sudo mount --bind / /mnt/arrel && sudo du -sh /mnt/arrel/*   # (c) dades sota un muntatge

La tercera és la més traïdora: si algú va escriure a /srv/tramontana/backups abans de muntar-hi el volum a sobre, aquells fitxers continuen ocupant espai a / però són invisibles perquè el muntatge els tapa. El bind mount de / en un altre punt els deixa a la vista. És el risc del pas 5 del cas Tramontana, i per això creem el directori buit en lloc de reutilitzar el que tenia dades.

2.

$ df -h /srv/tramontana/backups | tail -1
/dev/mapper/vg--dades-lv--backups   15G   4.9G  9.4G  35% /srv/tramontana/backups
$ sudo lvextend -L +3G -r /dev/vg-dades/lv-backups
  Size of logical volume vg-dades/lv-backups changed from 15.00 GiB to 18.00 GiB.
$ df -h /srv/tramontana/backups | tail -1
/dev/mapper/vg--dades-lv--backups   18G   4.9G   12G  29% /srv/tramontana/backups

Sense -r, lvs mostraria 18 GiB i df continuaria dient 15 GiB: el sistema de fitxers ext4 no sap que el dispositiu de sota ha crescut fins que se li diu amb resize2fs. L'operació és segura en calent perquè ext4 admet créixer muntat; reduir exigiria desmuntar i fer-ho en l'ordre invers.

3.

LABEL=uploads  /opt/tramontana/shared/uploads  ext4  defaults,noatime,nodev,nosuid,noexec,nofail  0  2

noexec és l'afegit clau respecte al volum de còpies: en un directori on escriuen tercers, impedir l'execució de binaris talla en sec que una pujada maliciosa es converteixi en codi en marxa. nodev i nosuid tanquen les altres dues vies, i nofail evita que un problema amb aquest volum impedeixi arrencar. Validació abans de reiniciar:

sudo cp -a /etc/fstab /etc/fstab.bak-$(date +%F)   # còpia prèvia
sudo findmnt --verify --verbose                    # sintaxi i coherència
sudo mount -a && findmnt /opt/tramontana/shared/uploads   # muntar i veure opcions efectives

Fixa't que findmnt al final mostra les opcions efectives: és l'única prova que el que vas escriure és el que el nucli va aplicar.

Conclusió

Ja no hi ha una capa opaca entre els teus fitxers i el maquinari. Recorres la pila sencera —disc, taula de particions, partició, PV, VG, LV, sistema de fitxers, punt de muntatge— i saps quin problema resol cada esglaó; identifiques el maquinari amb lsblk -f, blkid i fdisk -l, i saps per què els noms /dev/sdX no són de fiar i l'UUID sí; tries GPT sense dubtar-ho, particiones amb parted en una línia i amb fdisk sabent que res no s'escriu fins a la w; compares ext4, XFS, Btrfs i ZFS amb criteri, ajustes amb tune2fs i reconeixes el desconcert d'un df -h amb lloc i un df -i al 100 %.

Muntes amb les opcions que un servidor necessita —noatime, nodev, nosuid, noexec, nofail—, llegeixes /etc/fstab camp a camp i saps que mount -a abans de reiniciar és la diferència entre un ajust i una nit perduda. Diagnostiques el disc ple en les seves tres variants, inclòs el fitxer esborrat que lsof +L1 delata. I domines LVM: crees PV, VG i LV, amplies en calent amb lvextend -r, saps per què reduir és perillós i fas servir instantànies per congelar un estat coherent. Coneixes mdadm i els seus nivells, i tens gravat que RAID no és una còpia de seguretat.

Sobretot, /srv/tramontana/backups viu ja al seu propi volum lògic de 15 GiB, ampliable en calent, muntat per UUID amb nofail, amb les còpies migrades byte a byte amb rsync -aHAX i verificades, i amb 5 GiB de marge al VG reservats per a instantànies.

I arribem al nucli del mòdul. Tens identitats, permisos, paquets i disc, però l'aplicació de Tramontana continua arrencant-se a mà: si el servidor es reinicia, no torna; si el procés mor, ningú no l'aixeca; desplegar.sh canvia l'enllaç simbòlic i continua sense reiniciar res; i la còpia de les 4:20 depèn d'una línia de cron sense control real de solapament ni registre decent. A systemd i la Gestió de Serveis s'acaba tot això: escriuràs tramontana.service des de zero i enfortit, entendràs la diferència real entre ordre i dependència, convertiràs copia_tramontana.sh en un .service amb el seu .timer i Persistent=true, i desplegar.sh farà per fi el systemctl restart que li faltava.

Curs de Linux: De Principiant a Administrador de Sistemes

Mòdul 1: Introducció a Linux

Mòdul 2: Comandes Bàsiques de Linux

Mòdul 3: Habilitats Avançades en la Línia de Comandes

Mòdul 4: Scripting en Shell

Mòdul 5: Administració del Sistema

Mòdul 6: Xarxes i Seguretat

Mòdul 7: Temes Avançats

Mòdul 8: Projectes Pràctics

© Copyright 2026. Tots els drets reservats