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
pwdi el directori de treballcden totes les seves formes- Rutes absolutes i relatives a la pràctica
.i..: entrades reals del directorilsa fons- Llegir
ls -lcolumna a columna tree: veure l'estructura d'un cop d'ullstati les tres marques de tempsfile: què és un fitxer de debòduidf: quant ocupa i quant queda- No perdre's mai: hàbits d'orientació
- Pràctica guiada: recorregut per l'arbre de Tramontana
pwd i el directori de treball
pwd i el directori de treballCada 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.
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-18Aquesta 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ò.
cd en totes les seves formes
cd en totes les seves formescd (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/operadorFixa'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
/rootCompte 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/operadorEl 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.
- 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.txtExercicis 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:
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.
. i ..: entrades reals del directori
. 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.csvLes 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í.
ls a fons
ls a fonsls é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:
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.logls -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/tramontanaLa 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
- Llegir
ls -l columna a columna
ls -l columna a columnaAquesta 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.logDesmuntada:
| 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.logSi 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.logLa 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/appVal 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.
tree: veure l'estructura d'un cop d'ull
tree: veure l'estructura d'un cop d'ulltree 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 filesOpcions 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
└── varAllà 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
stat i les tres marques de temps
stat i les tres marques de tempsls -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 +0200El 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 +0200L'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:operadorAquesta forma és la que faràs servir als scripts del Mòdul 4 per generar informes.
file: què és un fitxer de debò
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 textEs 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 terminatorsAquest ú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 |
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.
du i df: quant ocupa i quant queda
du i df: quant ocupa i quant quedaDues 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/efiAllà 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:
| 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/logL'ú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.txtEl 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.
- 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).
- 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/appDiagnò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 +0200Dues 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 textDades 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.00Les 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:
- Ruta relativa a
/opt/tramontana/app/version.txt. - Ruta relativa a
/etc/tramontana/app.conf. - Quin directori és
../../../../var/log? - Què fa
cd ../..des d'aquí, i quin és elpwdresultant?
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:
- Quant espai lliure queda a la partició arrel i quin percentatge s'utilitza.
- Quant ocupa
/var/logen total. - Quins tres subdirectoris de
/var/logocupen més. - Quin és el fitxer modificat més recentment dins de
/var/log/tramontanai a quina hora. - Si aquell fitxer és text o binari.
Exercici 3: les marques de temps
Al teu home, amb un fitxer de prova:
- Crea
/tmp/marques.txtamb una mica de contingut i anota les seves tres marques de temps. - Llegeix-lo amb
cat. Quina ha canviat? - Canvia'n els permisos amb
chmod 600. Quina ha canviat ara? - Afegeix-hi contingut. Quines han canviat?
- 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.12. ../../../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.confLa 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/tramontanaSolució 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.
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.logacces.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 textInforme 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 +0200En 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 +0200Nomé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 +0200Nomé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 +0200Han 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.
pwdet diu on ets, ipwd -Pon ets de debò quan hi ha enllaços pel mig.cdté més formes de les que semblava:cd -per alternar,cdtot sol per tornar a casa,~usuariper 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.lsel llegeixes columna a columna, i coneixes les combinacions que es fan servir diàriament:-lah,-ltr,-lhSi la imprescindible-ld.tree -Let dona l'estructura d'un cop d'ull sense ofegar-te en profunditat.statet dona les metadades completes, i entens amb precisió atime, mtime i ctime, inclosa la raó per la qual el ctime és rellevant en seguretat.fileet diu què és realment un fitxer, perquè a Linux l'extensió no mana.dumesura el que ocupa alguna cosa,dfmesura 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
- Què és Linux?
- Història de Linux
- Distribucions de Linux
- Instal·lant Linux
- Primer Contacte amb el Sistema
- Estructura del Sistema de Fitxers de Linux
Mòdul 2: Comandes Bàsiques de Linux
- Introducció a la Línia de Comandes
- Obtenir Ajuda i Documentació del Sistema
- Navegant pel Sistema de Fitxers
- Operacions amb Fitxers i Directoris
- Visualització i Edició de Fitxers
- Enllaços Durs i Simbòlics
- Permisos i Propietat dels Fitxers
Mòdul 3: Habilitats Avançades en la Línia de Comandes
- L'Entorn del Shell: Variables, Àlies i Historial
- Ús de Comodins i Expressions Regulars
- Cerca de Fitxers i Contingut: find, locate i grep
- Canonades i Redirecció
- Processament de Text: cut, sort, uniq, sed i awk
- Gestió de Processos
- Programació de Tasques amb Cron
- Comandes de Xarxa
Mòdul 4: Scripting en Shell
- Introducció al Scripting en Shell
- Variables i Tipus de Dades
- Entrada, Sortida i Arguments d'un Script
- Estructures de Control
- Funcions i Biblioteques
- Depuració i Gestió d'Errors
- Scripts de Producció: Bones Pràctiques
Mòdul 5: Administració del Sistema
- Gestió d'Usuaris i Grups
- sudo i Permisos Especials
- Gestió de Paquets
- Gestió de Discs
- systemd i la Gestió de Serveis
- Registres del Sistema: journald i syslog
- Monitoratge del Sistema i Optimització del Rendiment
- Còpies de Seguretat i Restauració
Mòdul 6: Xarxes i Seguretat
- Configuració de Xarxes
- SSH i Accés Remot
- Tallafocs i Seguretat Perimetral
- Sistemes de Detecció d'Intrusions
- Gestió de Secrets i Certificats TLS
- Assegurant Sistemes Linux
Mòdul 7: Temes Avançats
- El Procés d'Arrencada i la Recuperació del Sistema
- Diagnòstic Avançat: strace, perf i eBPF
- Optimització del Nucli de Linux
- Virtualització amb Linux
- Contenidors de Linux i Docker
- Automatització amb Ansible
- Alta Disponibilitat i Balanceig de Càrrega
