Al Mòdul 1 vas dibuixar el mapa: saps què és /etc, què distingeix /opt de /srv i per què /var conté allò que creix. Però conèixer un mapa i recórrer el terreny són coses diferents. Aquesta lliçó és el recorregut.

Moure's pel sistema de fitxers sembla trivial —cd per anar-hi, ls per mirar— i tanmateix és on es perd més temps al llarg d'una carrera. La diferència entre algú que navega amb fluïdesa i algú que no és en detalls concrets: saber tornar al directori anterior amb dues tecles, llegir la sortida d'ls -l d'un cop d'ull, entendre què et diu exactament cada marca de temps d'un fitxer, i no confondre «això ocupa 4 KB» amb «això declara 18 bytes».

Un avís abans de començar: fins al final d'aquesta lliçó no modificaràs res. Totes les ordres que veuràs són de només lectura. És deliberat: primer s'aprèn a mirar, i a la lliçó següent s'aprèn a tocar.

Contingut

  1. pwd i el directori de treball
  2. cd en totes les seves formes
  3. Rutes absolutes i relatives a la pràctica
  4. . i ..: entrades reals del directori
  5. ls a fons
  6. Llegir ls -l columna a columna
  7. tree: veure l'estructura d'un cop d'ull
  8. stat i les tres marques de temps
  9. file: què és un fitxer de debò
  10. du i df: quant ocupa i quant queda
  11. No perdre's mai: hàbits d'orientació
  12. Pràctica guiada: recorregut per l'arbre de Tramontana

  1. pwd i el directori de treball

Cada procés del sistema té un directori de treball actual (current working directory, cwd): el punt de l'arbre des del qual interpreta les rutes relatives. El teu shell és un procés i també té el seu.

operador@srv-tramontana:~$ pwd
/home/operador

pwd (print working directory) respon sempre amb una ruta absoluta, des de /.

En iniciar sessió, el teu directori de treball és el teu directori personal, que a srv-tramontana és /home/operador. Per això el prompt mostra ~: és l'abreviatura del home.

pwd té dues opcions que només tenen sentit quan hi ha enllaços simbòlics pel mig (lliçó 02-06):

Opció Comportament
-L (per defecte) Mostra la ruta lògica, tal com hi has arribat, amb els enllaços sense resoldre
-P Mostra la ruta física real, resolent tots els enllaços
operador@srv-tramontana:/opt/tramontana/app$ pwd
/opt/tramontana/app
operador@srv-tramontana:/opt/tramontana/app$ pwd -P
/opt/tramontana/releases/2026-08-18

Aquesta diferència serà important quan Tramontana adopti el patró de desplegament amb enllaços. De moment, queda't que pwd -P et diu on ets de debò.

  1. cd en totes les seves formes

cd (change directory) canvia el directori de treball. És un builtin, i a la lliçó 02-01 vas veure per què ho ha de ser.

Forma Què fa
cd /ruta/absoluta Va a aquella ruta, independentment d'on siguis
cd subdirectori Baixa a un fill del directori actual
cd .. Puja al directori pare
cd ../.. Puja dos nivells
cd (sense arguments) Va al teu home
cd ~ El mateix, explícit
cd ~operador Al home d'aquell usuari
cd - Torna al directori anterior
cd / A l'arrel

Recorregut complet:

operador@srv-tramontana:~$ pwd
/home/operador

operador@srv-tramontana:~$ cd /var/log/tramontana
operador@srv-tramontana:/var/log/tramontana$ pwd
/var/log/tramontana

operador@srv-tramontana:/var/log/tramontana$ cd ..
operador@srv-tramontana:/var/log$ pwd
/var/log

operador@srv-tramontana:/var/log$ cd
operador@srv-tramontana:~$ pwd
/home/operador

Fixa't en com el prompt reflecteix el directori actual. És el teu instrument d'orientació permanent i no costa res mirar-lo.

Les dues formes que més temps estalvien, i que molta gent no coneix:

cd - alterna entre els dos últims directoris, com el botó «enrere». En fer-lo servir, Bash imprimeix on ha anat:

operador@srv-tramontana:~$ cd /etc/tramontana
operador@srv-tramontana:/etc/tramontana$ cd /var/log/tramontana
operador@srv-tramontana:/var/log/tramontana$ cd -
/etc/tramontana
operador@srv-tramontana:/etc/tramontana$ cd -
/var/log/tramontana

És perfecte quan estàs comparant la configuració amb els registres: dues tecles per saltar d'un costat a l'altre.

~usuari és la ruta del home d'un altre usuari, resolta pel shell:

operador@srv-tramontana:~$ echo ~
/home/operador
operador@srv-tramontana:~$ echo ~alumne
/home/alumne
operador@srv-tramontana:~$ echo ~root
/root

Compte amb ~root: és /root, no /home/root. El compte d'administració té el seu home fora de /home precisament perquè continuï sent accessible encara que /home sigui en una partició que no s'ha muntat, cosa que importa en la recuperació del sistema (lliçó 07-01).

Un comportament a tenir en compte: si cd falla, no et mous.

operador@srv-tramontana:~$ cd /etc/tramontanas
-bash: cd: /etc/tramontanas: No such file or directory
operador@srv-tramontana:~$ pwd
/home/operador

El prompt no ha canviat i pwd ho confirma. Aquest és el detall que feia perillós el ; de la lliçó anterior: cd falla, però l'ordre següent s'executa igualment, al lloc equivocat.

  1. Rutes absolutes i relatives a la pràctica

La definició la vas veure al Mòdul 1. Aquí la faràs servir.

  • Absoluta: comença per /. Significa el mateix des de qualsevol lloc.
  • Relativa: no comença per /. S'interpreta des del directori actual.

L'arbre de Tramontana que faràs servir com a referència:

/
├── etc/
│   └── tramontana/
│       └── app.conf
├── opt/
│   └── tramontana/
│       └── app/
│           ├── executable
│           ├── plantilles/
│           └── version.txt
├── srv/
│   └── tramontana/
│       └── backups/
├── var/
│   └── log/
│       └── tramontana/
│           ├── acces.log
│           └── errors.log
└── home/
    └── operador/
        ├── scripts/
        └── dades/
            ├── reserves.csv
            └── cases.txt

Exercicis de traducció. Ets a /var/log/tramontana. Com arribes a cada destí de les dues maneres?

Destí Ruta absoluta Ruta relativa
errors.log (mateix dir.) /var/log/tramontana/errors.log errors.log o ./errors.log
El directori /var/log /var/log ..
/etc/tramontana/app.conf /etc/tramontana/app.conf ../../../etc/tramontana/app.conf
/opt/tramontana/app /opt/tramontana/app ../../../opt/tramontana/app
El teu home /home/operador ~ o ../../../home/operador

Comprovació pràctica de la tercera fila:

operador@srv-tramontana:/var/log/tramontana$ ls ../../../etc/tramontana/
app.conf

Tres .. perquè cal pujar de tramontana a log, de log a var, i de var a /. Compta els nivells del prompt i et surten sols.

Quan fer servir cadascuna:

Context Fes servir Per què
Treball interactiu, a prop d'on ets Relativa Més curta, menys per teclejar
Scripts (Mòdul 4) Absoluta, sempre L'script es pot executar des de qualsevol directori
Tasques de cron (03-07) Absoluta, sempre Cron arrenca en un directori que no controles
Configuració de serveis Absoluta El servei no comparteix el teu directori de treball
Documentar un procediment Absoluta Qui ho llegeixi no sap on eres

Regla mnemotècnica: relativa per als teus dits, absoluta per a les màquines.

  1. . i ..: entrades reals del directori

. és el directori actual i .. és el pare. Però no són un truc del shell: són entrades reals dins de cada directori, escrites al disc.

operador@srv-tramontana:~$ ls -la /home/operador/dades
total 16
drwxr-xr-x 2 operador operador 4096 Aug 18 08:11 .
drwxr-x--- 5 operador operador 4096 Aug 18 08:11 ..
-rw-r--r-- 1 operador operador  418 Aug 17 19:40 cases.txt
-rw-r--r-- 1 operador operador 1204 Aug 18 07:55 reserves.csv

Les dues primeres línies són entrades de debò, amb els seus permisos, el seu propietari i la seva data. Comprovació definitiva:

operador@srv-tramontana:~$ ls -ldi /home/operador/dades /home/operador/dades/.
 262148 drwxr-xr-x 2 operador operador 4096 Aug 18 08:11 /home/operador/dades
 262148 drwxr-xr-x 2 operador operador 4096 Aug 18 08:11 /home/operador/dades/.

El mateix número, 262148. Aquest número és l'inode, i que coincideixi demostra que . i el directori són literalment el mateix objecte. Els inodes són el tema de la lliçó 02-06; guarda't aquesta dada.

Dues conseqüències pràctiques:

./ és obligatori per executar un programa del directori actual. Com vas veure a 02-01, el directori actual no és al PATH:

operador@srv-tramontana:~/scripts$ informe.sh
-bash: informe.sh: command not found
operador@srv-tramontana:~/scripts$ ./informe.sh
Generant informe de reserves...

./ protegeix davant de noms que comencen per guionet, com vas veure amb el separador --. rm ./-informe.txt funciona sempre.

Un detall sobre el directori arrel: a /, l'entrada .. apunta a si mateixa. cd /.. et deixa a /. L'arbre s'acaba aquí.

  1. ls a fons

ls és l'ordre que més vegades executaràs a la teva vida. Val la pena conèixer-la bé.

Opció Què fa
-l Format llarg: permisos, propietari, mida, data
-a Mostra tot, inclosos els ocults, . i ..
-A Com -a però sense . ni .. (gairebé sempre més útil)
-h Mides llegibles (K, M, G). Requereix -l
-t Ordena per data de modificació, més recent primer
-S Ordena per mida, més gran primer
-r Inverteix l'ordre
-R Recursiu: entra als subdirectoris
-d Mostra el directori mateix, no el seu contingut
-i Mostra el número d'inode
-1 Un element per línia (útil amb canonades)
-F Afegeix un símbol segons el tipus: / dir., * executable, @ enllaç
--color=auto Acoloreix per tipus (ja ve com a àlies a Ubuntu)

Sense opcions, ls és escarit perquè el shell antic ho era:

operador@srv-tramontana:~$ ls
dades  scripts

Combinacions que es fan servir de debò:

# La més comuna: tot, llarg, mides llegibles
operador@srv-tramontana:~$ ls -lah /var/log/tramontana
total 32K
drwxr-x---  2 root      adm      4.0K Aug 18 09:00 .
drwxrwxr-x 12 root      syslog   4.0K Aug 18 00:00 ..
-rw-r-----  1 root      adm       18K Aug 18 09:14 acces.log
-rw-r-----  1 root      adm      6.2K Aug 18 09:02 errors.log

# L'últim que ha canviat, a dalt de tot: per diagnosticar
operador@srv-tramontana:~$ ls -lt /etc/tramontana
total 4
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf

# L'últim a baix: millor quan hi ha molts fitxers, perquè queda al costat del prompt
operador@srv-tramontana:~$ ls -ltr /var/log
...
-rw-r-----  1 syslog adm    124832 Aug 18 09:15 syslog

# Els més grans primer: per trobar què omple un disc
operador@srv-tramontana:~$ ls -lhS /var/log/tramontana
-rw-r----- 1 root adm  18K Aug 18 09:14 acces.log
-rw-r----- 1 root adm 6.2K Aug 18 09:02 errors.log

ls -ltr mereix un comentari: en ordenar de més antic a més recent, l'últim modificat queda just a sobre del prompt, on tens la vista. En un directori amb dos-cents fitxers, això és la diferència entre veure la resposta i haver-la de buscar.

-d és l'opció menys intuïtiva i més necessària. Sense ella, ls -l sobre un directori llista el seu contingut; amb ella, descriu el directori mateix:

operador@srv-tramontana:~$ ls -l /etc/tramontana
total 4
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf

operador@srv-tramontana:~$ ls -ld /etc/tramontana
drwxr-x--- 2 root tramontana 4096 Aug 18 08:30 /etc/tramontana

La primera et diu què hi ha a dins; la segona et diu qui hi pot entrar. Quan arribis als permisos a la lliçó 02-07, ls -ld serà la teva eina principal.

-R recorre l'arbre sencer. Fes-lo servir amb compte: ls -R / produeix centenars de milers de línies.

operador@srv-tramontana:~$ ls -R /opt/tramontana
/opt/tramontana:
app

/opt/tramontana/app:
executable  plantilles  version.txt

/opt/tramontana/app/plantilles:
confirmacio.html  factura.html

  1. Llegir ls -l columna a columna

Aquesta sortida cal saber-la llegir d'un cop d'ull, perquè conté gairebé tota la informació rellevant d'un fitxer:

operador@srv-tramontana:~$ ls -l /var/log/tramontana/acces.log
-rw-r----- 1 root adm 18432 Aug 18 09:14 /var/log/tramontana/acces.log

Desmuntada:

Columna Valor Significat
1 (1r caràcter) - Tipus: fitxer regular. d directori, l enllaç, c/b dispositiu, s sòcol, p canonada
1 (resta) rw-r----- Permisos: tres grups de tres. Lliçó 02-07
2 1 Nombre d'enllaços durs. Lliçó 02-06
3 root Propietari
4 adm Grup propietari
5 18432 Mida en bytes (amb -h, en unitats llegibles)
6 Aug 18 09:14 Data d'última modificació (mtime)
7 acces.log Nom

Un detall de la sisena columna: ls mostra l'hora si el fitxer s'ha modificat en els últims sis mesos, i l'any si és més antic. Aquesta asimetria desconcerta la primera vegada:

operador@srv-tramontana:~$ ls -l /etc/hostname /var/log/tramontana/acces.log
-rw-r--r-- 1 root root    16 Jun 12  2025 /etc/hostname
-rw-r----- 1 root adm  18432 Aug 18 09:14 /var/log/tramontana/acces.log

Si vols dates completes i sense ambigüitat:

operador@srv-tramontana:~$ ls -l --time-style=full-iso /var/log/tramontana/acces.log
-rw-r----- 1 root adm 18432 2026-08-18 09:14:37.482910233 +0200 /var/log/tramontana/acces.log

La segona columna, el nombre d'enllaços, té un comportament que sorprèn: als directoris no val mai 1.

operador@srv-tramontana:~$ ls -ld /opt/tramontana/app
drwxr-xr-x 4 root root 4096 Aug 18 08:30 /opt/tramontana/app

Val 4 perquè compten: l'entrada app a /opt/tramontana, l'entrada . dins d'app, i les entrades .. dels seus dos subdirectoris. El nombre d'enllaços d'un directori és 2 + el nombre de subdirectoris que conté. És un truc per comptar subdirectoris sense entrar-hi, i quedarà completament clar a la lliçó 02-06.

I la mida d'un directori (4096) no és el que conté: és el que ocupa la seva pròpia llista de noms. Per saber què conté hi ha du, a l'apartat 10.

  1. tree: veure l'estructura d'un cop d'ull

tree mostra la jerarquia dibuixada. No ve instal·lat per defecte a Ubuntu Server:

operador@srv-tramontana:~$ tree
Command 'tree' not found, but can be installed with:
sudo apt install tree

operador@srv-tramontana:~$ sudo apt install -y tree

(La gestió de paquets s'estudia a la lliçó 05-03; aquí l'instal·lem i seguim.)

operador@srv-tramontana:~$ tree /opt/tramontana
/opt/tramontana
└── app
    ├── executable
    ├── plantilles
    │   ├── confirmacio.html
    │   └── factura.html
    └── version.txt

3 directories, 4 files

Opcions imprescindibles:

Opció Què fa
-L n Limita la profunditat a n nivells
-d Només directoris
-a Inclou els ocults
-h Mostra mides llegibles
-F Afegeix / als directoris
--du Suma la mida de cada branca

-L és pràcticament obligatòria en directoris grans:

operador@srv-tramontana:~$ tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

Allà veus una cosa interessant: bin, lib i sbin apareixen amb una fletxa. Són enllaços simbòlics a directoris dins de /usr, resultat de la reorganització /usr-merge que van fer les distribucions modernes. La lliçó 02-06 explica exactament què significa aquesta fletxa.

Combinació molt útil per documentar l'estructura d'un projecte:

operador@srv-tramontana:~$ tree -d -L 2 /var
/var
├── backups
├── cache
├── lib
├── log
│   ├── apt
│   └── tramontana
├── spool
└── tmp

  1. stat i les tres marques de temps

ls -l dona un resum. stat dona tot:

operador@srv-tramontana:~$ stat /home/operador/dades/reserves.csv
  File: /home/operador/dades/reserves.csv
  Size: 1204          Blocks: 8          IO Block: 4096   regular file
Device: 8,2	Inode: 262151      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/operador)   Gid: ( 1001/operador)
Access: 2026-08-18 09:20:11.104283761 +0200
Modify: 2026-08-18 07:55:02.882910233 +0200
Change: 2026-08-18 07:55:02.882910233 +0200
 Birth: 2026-08-10 12:03:44.000000000 +0200

El que aporta sobre ls -l:

  • El número d'inode (262151) i el dispositiu on viu.
  • Els permisos en octal i simbòlic alhora (0644/-rw-r--r--), molt útil per a la lliçó 02-07.
  • Els UID i GID numèrics a més dels noms.
  • Els blocs realment ocupats.
  • I les marques de temps amb precisió de nanosegons.

Les tres marques clàssiques es confonen constantment. Aquesta taula resol la confusió:

Marca Nom S'actualitza quan... No s'actualitza quan...
atime Accés Es llegeix el contingut (cat, less) Només mires els seus metadades amb ls
mtime Modificació Canvia el contingut Canvien els permisos o el propietari
ctime Canvi d'inode Canvia el contingut o les metadades No el pots fixar mai tu a mà

L'error més estès és creure que ctime significa creation time. No és així: és change time, el moment en què va canviar l'inode. Canviar els permisos d'un fitxer actualitza el seu ctime però no el seu mtime.

Demostració:

operador@srv-tramontana:~$ stat -c '%y  %z' dades/cases.txt
2026-08-17 19:40:10.000000000 +0200  2026-08-17 19:40:10.000000000 +0200

operador@srv-tramontana:~$ chmod 640 dades/cases.txt

operador@srv-tramontana:~$ stat -c '%y  %z' dades/cases.txt
2026-08-17 19:40:10.000000000 +0200  2026-08-18 09:31:55.771820102 +0200

L'mtime (%y) no s'ha mogut: el contingut no ha canviat. El ctime (%z) sí: l'inode s'ha modificat en canviar els permisos. Aquesta distinció és la base de la detecció d'intrusions (lliçó 06-04): un atacant pot falsificar l'mtime, però no el ctime.

La quarta línia, Birth (temps de naixement), és relativament moderna. Existeix a ext4 i altres sistemes de fitxers actuals, però no totes les eines l'exposen i no es pot consultar de manera portable.

Un detall sobre l'atime que convé conèixer: actualitzar-lo cada vegada que es llegeix un fitxer implica una escriptura al disc per cada lectura, cosa que seria un desastre de rendiment. Per això Linux munta els sistemes de fitxers amb l'opció relatime, que només actualitza l'atime si és més antic que l'mtime o si han passat més de 24 hores. Conseqüència: l'atime que veus és aproximat. No el facis servir per a auditoria precisa.

stat accepta formats personalitzats amb -c:

operador@srv-tramontana:~$ stat -c '%n: %s bytes, permisos %a, propietari %U:%G' dades/*
dades/cases.txt: 418 bytes, permisos 640, propietari operador:operador
dades/reserves.csv: 1204 bytes, permisos 644, propietari operador:operador

Aquesta forma és la que faràs servir als scripts del Mòdul 4 per generar informes.

  1. file: què és un fitxer de debò

A Windows, l'extensió determina el tipus. A Linux l'extensió és només part del nom: no significa res per al sistema. El que determina el tipus és el contingut, i qui l'interpreta és el programa que l'obre.

file examina els primers bytes d'un fitxer i els compara amb una base de dades de signatures conegudes (els números màgics):

operador@srv-tramontana:~$ file /home/operador/dades/*
/home/operador/dades/cases.txt:    UTF-8 Unicode text
/home/operador/dades/reserves.csv: CSV text

operador@srv-tramontana:~$ file /opt/tramontana/app/executable
/opt/tramontana/app/executable: ELF 64-bit LSB pie executable, x86-64,
 dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, ...

operador@srv-tramontana:~$ file /etc/tramontana /dev/null /dev/sda
/etc/tramontana: directory
/dev/null:       character special (1/3)
/dev/sda:        block special (8/0)

Prova definitiva que l'extensió no mana:

operador@srv-tramontana:~$ cp dades/cases.txt /tmp/cases.jpg
operador@srv-tramontana:~$ file /tmp/cases.jpg
/tmp/cases.jpg: UTF-8 Unicode text

Es diu .jpg i continua sent text. file no es deixa enganyar pel nom.

Casos en què file et salva d'un problema:

# Amb què està comprimit aquest fitxer que m'han passat?
operador@srv-tramontana:~$ file /srv/tramontana/backups/copia-2026-08-17
/srv/tramontana/backups/copia-2026-08-17: gzip compressed data, from Unix

# Per què l'script falla amb un error estrany?
operador@srv-tramontana:~$ file scripts/informe.sh
scripts/informe.sh: Bourne-Again shell script, ASCII text executable,
 with CRLF line terminators

Aquest últim exemple és un clàssic: with CRLF line terminators significa que el fitxer té finals de línia de Windows. Bash intenta executar /bin/bash\r i falla amb un missatge incomprensible. file dona el diagnòstic en un segon.

Opcions útils:

Opció Què fa
-b Només el tipus, sense el nom del fitxer
-i Retorna el tipus MIME (text/plain, application/gzip)
-L Segueix els enllaços simbòlics
operador@srv-tramontana:~$ file -bi dades/reserves.csv
text/csv; charset=us-ascii

Hàbit professional: passa file a tot fitxer desconegut abans d'obrir-lo. A la lliçó 02-05 veuràs per què fer cat d'un binari destrossa el teu terminal; file és la comprovació que ho evita.

  1. du i df: quant ocupa i quant queda

Dues ordres que es confonen i responen a preguntes diferents:

  • df (disk free): quant espai queda als sistemes de fitxers muntats. Pregunta al sistema de fitxers.
  • du (disk usage): quant ocupa un directori concret. Recorre i suma.
operador@srv-tramontana:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           389M  1.4M  388M   1% /run
/dev/sda2        23G  6.7G   15G  30% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda1       1.1G  6.4M  1.1G   1% /boot/efi

Allà veus el disc de 23 GB al 30 % que coneixes de la instal·lació. Les línies tmpfs són sistemes de fitxers a memòria RAM, no al disc: per això /run i /dev/shm desapareixen en reiniciar.

Opció imprescindible que gairebé ningú no fa servir:

operador@srv-tramontana:~$ df -hi /
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda2        1.5M  112K  1.4M    8% /

-i mostra els inodes, no els bytes. Un disc pot tenir espai lliure i tot i així donar No space left on device si s'han esgotat els inodes, típicament per milions de fitxers diminuts. És una incidència que desconcerta qui no sap que existeix, i df -hi és el diagnòstic en un segon.

du respon a la pregunta contrària:

operador@srv-tramontana:~$ sudo du -sh /var/log/tramontana
26K	/var/log/tramontana
Opció Què fa
-s Resum: només el total, sense desglossar
-h Llegible
-c Afegeix una línia de total al final
-d n Baixa n nivells en el desglossament
--apparent-size Mida declarada, no la ocupada al disc
-x No creua a altres sistemes de fitxers

Sense -s, du desglossa cada subdirectori, cosa que a / produeix una allau. Amb -d 1 obtens el desglossament d'un nivell, que és el que vols per buscar culpables:

operador@srv-tramontana:~$ sudo du -h -d 1 /var/log
4.0K	/var/log/apt
26K	/var/log/tramontana
8.0K	/var/log/private
1.3M	/var/log

L'última línia és el total de /var/log, inclosos els fitxers solts que no són en cap subdirectori.

La diferència entre mida declarada i espai ocupat explica una discrepància que confon:

operador@srv-tramontana:~$ echo "hola" > /tmp/prova.txt
operador@srv-tramontana:~$ ls -l /tmp/prova.txt
-rw-rw-r-- 1 operador operador 5 Aug 18 09:45 /tmp/prova.txt
operador@srv-tramontana:~$ du -h /tmp/prova.txt
4.0K	/tmp/prova.txt
operador@srv-tramontana:~$ du -h --apparent-size /tmp/prova.txt
5	/tmp/prova.txt

El fitxer declara 5 bytes, però ocupa 4 KB perquè el sistema de fitxers assigna espai en blocs i el bloc mínim d'ext4 és de 4 KB. Un directori amb cent mil fitxers de 5 bytes ocupa 400 MB reals.

Per això du (que mesura el que està ocupat) i df (que mesura el que queda lliure al dispositiu) poden no quadrar. Una altra causa clàssica de descompensació: un fitxer esborrat que continua obert per un procés. Desapareix de l'arbre, així que du no el veu, però l'espai no s'allibera fins que el procés el tanca, així que df sí que el compta. És el motiu pel qual esborrar un registre enorme sense reiniciar el servei no allibera espai, i ho reprendràs a la lliçó 05-07.

  1. No perdre's mai: hàbits d'orientació

Tres costums que eviten el 90 % dels ensurts:

1. Llegeix el prompt abans de cada ordre destructiva. El prompt d'Ubuntu ja mostra el directori actual. No costa res mirar-lo, i a l'instant anterior a un rm és el que separa esborrar el correcte d'esborrar l'altra cosa.

2. pwd com a reflex. Després de qualsevol cd encadenat, després de tornar d'una pausa, després de connectar-te per SSH a una altra màquina. És gratis.

3. Abans d'actuar, mira. El patró que ja vas veure a 02-01 i que es repetirà tot el curs:

operador@srv-tramontana:~$ ls -la /srv/tramontana/backups/temporals   # 1. mirar
operador@srv-tramontana:~$ pwd                                        # 2. confirmar on soc
operador@srv-tramontana:~$ cd /srv/tramontana/backups/temporals && ... # 3. actuar amb &&

Un quart hàbit, per més endavant: quan treballis en diversos servidors alhora, personalitza el prompt perquè mostri el nom de la màquina en un color diferent. És la manera de no executar en producció el que anaves a executar en proves. Es fa amb la variable PS1 (lliçó 03-01).

  1. Pràctica guiada: recorregut per l'arbre de Tramontana

Recorrerem sencer el desplegament de Tramontana Reserves, descrivint cada peça. Aquest recorregut és el que faries en rebre un servidor que no coneixes.

Punt de partida i visió general:

operador@srv-tramontana:~$ pwd
/home/operador
operador@srv-tramontana:~$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        23G  6.7G   15G  30% /

Un sol sistema de fitxers per a tot l'arbre, al 30 %. Bé d'espai, i també significa que qualsevol cosa que creixi sense control afecta tot el sistema.

L'aplicació:

operador@srv-tramontana:~$ tree -L 2 /opt/tramontana
/opt/tramontana
└── app
    ├── executable
    ├── plantilles
    └── version.txt

operador@srv-tramontana:~$ ls -ld /opt/tramontana/app
drwxr-xr-x 4 root root 4096 Aug 18 08:30 /opt/tramontana/app

operador@srv-tramontana:~$ cat /opt/tramontana/app/version.txt
Tramontana Reserves 3.2.1

operador@srv-tramontana:~$ file /opt/tramontana/app/executable
/opt/tramontana/app/executable: ELF 64-bit LSB pie executable, x86-64

operador@srv-tramontana:~$ du -sh /opt/tramontana/app
48M	/opt/tramontana/app

Diagnòstic: programari de tercers a /opt segons l'FHS, propietat de root (els usuaris no poden modificar el codi: correcte), 48 MB, un binari compilat i les seves plantilles. Dades estàtiques: no canvien excepte en un desplegament.

La configuració:

operador@srv-tramontana:~$ ls -l /etc/tramontana/
total 4
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf

operador@srv-tramontana:~$ stat -c 'permisos %a, propietari %U:%G, modificat %y' /etc/tramontana/app.conf
permisos 640, propietari root:tramontana, modificat 2026-08-18 08:47:12.338291044 +0200

Dues coses rellevants. La primera: permisos 640, és a dir, ningú que no sigui root o del grup tramontana la pot llegir, cosa que és correcta perquè conté credencials. La segona: el grup tramontana apareix aquí, i encara no l'hem creat formalment; això es farà a la lliçó 05-01. El significat exacte del 640 és la lliçó 02-07.

Fixa't també en l'mtime: es va modificar aquest matí a les 8:47. En un servidor que no hauria de canviar, una configuració modificada recentment és el primer que s'investiga davant d'una incidència.

Els registres:

operador@srv-tramontana:~$ sudo ls -lh /var/log/tramontana/
total 25K
-rw-r----- 1 root adm  18K Aug 18 09:14 acces.log
-rw-r----- 1 root adm 6.2K Aug 18 09:02 errors.log

operador@srv-tramontana:~$ sudo du -sh /var/log/tramontana
26K	/var/log/tramontana

operador@srv-tramontana:~$ sudo file /var/log/tramontana/acces.log
/var/log/tramontana/acces.log: ASCII text

Dades variables: creixen amb l'ús. 26 KB avui no és res, però un registre d'accés en producció creix de manera lineal amb el trànsit, i aquest és exactament l'escenari que justificava posar-lo a /var. Que sigui ASCII text importa: significa que totes les eines de processament de text del Mòdul 3 hi funcionaran.

Les còpies i les dades de treball:

operador@srv-tramontana:~$ ls -ld /srv/tramontana/backups
drwxr-x--- 2 root root 4096 Aug 18 08:30 /srv/tramontana/backups

operador@srv-tramontana:~$ ls -lh ~/dades/
total 8.0K
-rw-r----- 1 operador operador  418 Aug 17 19:40 cases.txt
-rw-r--r-- 1 operador operador 1.2K Aug 18 07:55 reserves.csv

operador@srv-tramontana:~$ head -n 3 ~/dades/reserves.csv
id;data;casa;hoste;nits;import
1001;2026-07-03;mas-figueres;Nuria Prat;4;620.00
1002;2026-07-05;can-ventos;Oriol Sala;2;280.00

Les dades de treball són al teu home, separades de l'aplicació. reserves.csv fa servir punt i coma com a separador, un detall que serà important en processar-lo a la lliçó 03-05.

Resum del recorregut, en el format d'informe que la Marta espera:

Ruta Contingut Naturalesa Mida Propietari
/opt/tramontana/app Binari i plantilles Estàtic 48 M root:root
/etc/tramontana/app.conf Configuració amb credencials Estàtic, sensible 512 B root:tramontana
/var/log/tramontana/ Registres d'accés i error Variable, creix 26 K root:adm
/srv/tramontana/backups Còpies de seguretat Variable, creix a salts 0 root:root
/home/operador/dades Dades de treball Variable 8 K operador:operador

Amb cinc ordres —df, tree, ls -l, stat, du— has caracteritzat un servidor complet sense tocar res. Aquest és el reconeixement inicial que es fa en heretar un sistema.

Errors Comuns i Consells

Confondre .. amb .. cd . no fa res, cd .. puja. Un caràcter, molta diferència.

Fer servir rutes relatives en scripts. Funciona mentre l'executes a mà des del directori adequat, i falla el dia que el llança cron des de /. Absolutes sempre en scripts.

Creure que la mida d'un directori a ls -l és el que conté. No: són 4096 bytes d'índex. Fes servir du -sh.

Confondre du amb df. Si preguntes «quant queda al disc», és df. Si preguntes «què està ocupant tant», és du.

Creure que el ctime és la data de creació. És change time. La creació real, quan està disponible, la mostra stat com a Birth.

Refiar-se de l'extensió. Un .txt pot ser un binari i un fitxer sense extensió pot ser un executable. file és la resposta.

Consell: cd - i pushd/popd. cd - alterna entre dos. Si necessites una pila de directoris, pushd i popd la implementen; són builtins i la seva documentació és a help pushd.

Consell: ls -ltr en directoris amb molts fitxers. El més recent queda enganxat al prompt.

Consell: ls -ld és l'opció que més s'oblida. Cada vegada que vulguis saber alguna cosa del directori i no del seu contingut, és -d.

Consell: df -hi quan «no queda espai» però df -h diu que sí. S'han esgotat els inodes.

Exercicis

Exercici 1: traducció de rutes

Sense executar res, partint de l'arbre de Tramontana de l'apartat 3 i sent a /opt/tramontana/app/plantilles:

  1. Ruta relativa a /opt/tramontana/app/version.txt.
  2. Ruta relativa a /etc/tramontana/app.conf.
  3. Quin directori és ../../../../var/log?
  4. Què fa cd ../.. des d'aquí, i quin és el pwd resultant?

Després comprova les teves respostes al servidor.

Exercici 2: caracteritzar un directori desconegut

La Marta et demana que revisis el directori /var/log de srv-tramontana perquè «sembla que el disc es va omplint». Sense esborrar res, esbrina i presenta:

  1. Quant espai lliure queda a la partició arrel i quin percentatge s'utilitza.
  2. Quant ocupa /var/log en total.
  3. Quins tres subdirectoris de /var/log ocupen més.
  4. Quin és el fitxer modificat més recentment dins de /var/log/tramontana i a quina hora.
  5. Si aquell fitxer és text o binari.

Exercici 3: les marques de temps

Al teu home, amb un fitxer de prova:

  1. Crea /tmp/marques.txt amb una mica de contingut i anota les seves tres marques de temps.
  2. Llegeix-lo amb cat. Quina ha canviat?
  3. Canvia'n els permisos amb chmod 600. Quina ha canviat ara?
  4. Afegeix-hi contingut. Quines han canviat?
  5. Explica per què un atacant que vol ocultar que ha modificat un fitxer del sistema pot falsificar l'mtime però li resulta molt més difícil falsificar el ctime.

Solucions

Solució 1

1. ../version.txt — puges de plantilles a app i allà hi ha el fitxer.

operador@srv-tramontana:/opt/tramontana/app/plantilles$ cat ../version.txt
Tramontana Reserves 3.2.1

2. ../../../etc/tramontana/app.conf. Compta els nivells: de plantilles a app (un), a tramontana (dos), a opt (tres)... i des d'opt cal pujar-ne un més fins a /. Són quatre: ../../../../etc/tramontana/app.conf.

Comprovem-ho, que és just el tipus d'error que es comet:

operador@srv-tramontana:/opt/tramontana/app/plantilles$ ls ../../../etc/tramontana/
ls: cannot access '../../../etc/tramontana/': No such file or directory

operador@srv-tramontana:/opt/tramontana/app/plantilles$ ls ../../../../etc/tramontana/
app.conf

La ruta absoluta actual té quatre components (opt, tramontana, app, plantilles), així que calen quatre .. per arribar a l'arrel. Aquesta és exactament la raó per la qual les rutes absolutes són millors així que la distància passa d'un parell de nivells: /etc/tramontana/app.conf no admet aquest error.

3. ../../../../var/log és /var/log, pel mateix càlcul.

4. cd ../.. puja dos nivells: de plantilles a app, i d'app a tramontana.

operador@srv-tramontana:/opt/tramontana/app/plantilles$ cd ../..
operador@srv-tramontana:/opt/tramontana$ pwd
/opt/tramontana

Solució 2

# 1. Espai a l'arrel
operador@srv-tramontana:~$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        23G  6.7G   15G  30% /

15 GB lliures, 30 % utilitzat. Sense problema per ara.

# 2. Total de /var/log
operador@srv-tramontana:~$ sudo du -sh /var/log
1.3M	/var/log

1,3 MB sobre 23 GB: /var/log no és la causa que el disc s'ompli. Aquesta és la dada que tanca la pregunta de la Marta.

# 3. Els tres subdirectoris més grans
operador@srv-tramontana:~$ sudo du -h -d 1 /var/log | sort -h | tail -n 4
8.0K	/var/log/private
26K	/var/log/tramontana
912K	/var/log/journal
1.3M	/var/log

(El | sort -h | tail és una canonada; s'explica a fons al Mòdul 3. Pots obtenir el mateix llegint la sortida de du -h -d 1 /var/log a ull.)

El consumidor més gran és journal, el registre de systemd, amb 912 KB. És normal i té un límit de mida configurable (lliçó 05-06).

# 4. El més recent a /var/log/tramontana
operador@srv-tramontana:~$ sudo ls -lt --time-style=long-iso /var/log/tramontana
total 25
-rw-r----- 1 root adm 18432 2026-08-18 09:14 acces.log
-rw-r----- 1 root adm  6348 2026-08-18 09:02 errors.log

acces.log, modificat a les 09:14. -t ordena per data descendent, així que el primer és el més recent.

# 5. Tipus de fitxer
operador@srv-tramontana:~$ sudo file /var/log/tramontana/acces.log
/var/log/tramontana/acces.log: ASCII text

Informe per a la Marta: el disc arrel està al 30 % amb 15 GB lliures. /var/log ocupa 1,3 MB en total, així que no és el que està omplint el disc; convé mirar en un altre lloc. Dins dels registres, el consumidor més gran és el diari del sistema (912 KB) i els registres de l'aplicació sumen 26 KB. El registre d'accés es va actualitzar per última vegada a les 09:14 d'avui, cosa que confirma que l'aplicació està funcionant i escrivint amb normalitat.

Solució 3

operador@srv-tramontana:~$ echo "linia inicial" > /tmp/marques.txt
operador@srv-tramontana:~$ stat -c 'atime=%x%nmtime=%y%nctime=%z' /tmp/marques.txt
atime=2026-08-18 10:02:14.118293011 +0200
mtime=2026-08-18 10:02:14.118293011 +0200
ctime=2026-08-18 10:02:14.118293011 +0200

En crear-lo, les tres coincideixen.

operador@srv-tramontana:~$ cat /tmp/marques.txt
linia inicial
operador@srv-tramontana:~$ stat -c 'atime=%x%nmtime=%y%nctime=%z' /tmp/marques.txt
atime=2026-08-18 10:03:41.554820119 +0200
mtime=2026-08-18 10:02:14.118293011 +0200
ctime=2026-08-18 10:02:14.118293011 +0200

Només ha canviat l'atime: has llegit el contingut, no l'has modificat. (Si no veus el canvi, és per relatime: si l'atime ja era més recent que l'mtime i no han passat 24 hores, el nucli no l'actualitza. És el comportament normal i esperat.)

operador@srv-tramontana:~$ chmod 600 /tmp/marques.txt
operador@srv-tramontana:~$ stat -c 'atime=%x%nmtime=%y%nctime=%z' /tmp/marques.txt
atime=2026-08-18 10:03:41.554820119 +0200
mtime=2026-08-18 10:02:14.118293011 +0200
ctime=2026-08-18 10:05:02.771820102 +0200

Només ha canviat el ctime: has modificat l'inode (els permisos hi viuen), no el contingut ni l'has llegit. Aquesta és la demostració que el ctime no és creation time.

operador@srv-tramontana:~$ echo "segona linia" >> /tmp/marques.txt
operador@srv-tramontana:~$ stat -c 'atime=%x%nmtime=%y%nctime=%z' /tmp/marques.txt
atime=2026-08-18 10:03:41.554820119 +0200
mtime=2026-08-18 10:06:33.201938477 +0200
ctime=2026-08-18 10:06:33.201938477 +0200

Han canviat l'mtime i el ctime. El contingut ha canviat (mtime) i, en canviar el contingut, també ha canviat la mida registrada a l'inode (ctime). No ha canviat l'atime perquè escriure no és llegir.

Punt 5: per què el ctime és difícil de falsificar. L'ordre touch permet fixar l'atime i l'mtime al valor que vulguis (touch -t, lliçó 02-04). Un atacant que modifica /etc/tramontana/app.conf pot deixar l'mtime exactament com estava i el fitxer semblarà intacte a ls -l.

Però el ctime no es pot fixar. No hi ha cap crida al sistema que permeti escriure-hi un valor arbitrari: el nucli l'actualitza automàticament cada vegada que l'inode canvia, inclòs el canvi que provoca el mateix touch en falsificar l'mtime. Falsificar el ctime exigeix accés directe al dispositiu de blocs per sota del sistema de fitxers, o canviar el rellotge del sistema, i totes dues coses deixen altres rastres.

D'aquí la pràctica forense: davant la sospita d'una intrusió, es comparen l'mtime i el ctime. Un fitxer el ctime del qual és molt posterior al seu mtime ha estat tocat d'una manera que mereix explicació. És un dels indicadors que fan servir les eines de la lliçó 06-04.

Conclusió

Ja no navegues a les palpentes per l'arbre del Mòdul 1: el recorres amb instruments.

  • pwd et diu on ets, i pwd -P on ets de debò quan hi ha enllaços pel mig.
  • cd té més formes de les que semblava: cd - per alternar, cd tot sol per tornar a casa, ~usuari per al home aliè. I si falla, no et mous, que és justament el que feia perillós el ;.
  • Saps traduir entre rutes absolutes i relatives comptant nivells, i tens el criteri: relatives per als teus dits, absolutes per a scripts i cron.
  • . i .. són entrades reals amb el seu propi inode, i per això ./programa és la manera d'executar alguna cosa del directori actual.
  • ls el llegeixes columna a columna, i coneixes les combinacions que es fan servir diàriament: -lah, -ltr, -lhS i la imprescindible -ld.
  • tree -L et dona l'estructura d'un cop d'ull sense ofegar-te en profunditat.
  • stat et dona les metadades completes, i entens amb precisió atime, mtime i ctime, inclosa la raó per la qual el ctime és rellevant en seguretat.
  • file et diu què és realment un fitxer, perquè a Linux l'extensió no mana.
  • du mesura el que ocupa alguna cosa, df mesura el que queda, i saps per què de vegades no quadren i què fer quan el disc «està ple» sense estar-ho.
  • I has caracteritzat el desplegament complet de Tramontana Reserves amb cinc ordres, sense modificar res.

S'ha acabat mirar. A la propera lliçó, Operacions amb Fitxers i Directoris, comences a escriure al disc: touch i mkdir per crear, cp i mv amb tots els seus paranys —inclosa la barra final del destí, que mossega tothom—, rm i la conversa seriosa sobre rm -rf que cal tenir un cop a la vida, rsync per copiar directoris grans com cal, i tar amb gzip, bzip2 i xz per empaquetar. Acabaràs preparant un paquet de /opt/tramontana/app per passar-lo a en Luis. Assegura't de tenir la instantània de la VM al dia abans de començar: a partir d'aquí, les ordres ja no es limiten a mirar.

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