# Sistemes de fitxers

Un **sistema de fitxers** (*filesystem*) és l'estructura que utilitza el sistema operatiu per organitzar, emmagatzemar i recuperar dades en un dispositiu d'emmagatzematge (disc dur, SSD, memòria USB, etc.).

## 1. Conceptes fonamentals

### 1.1 Bloc (*block*)
La unitat mínima d'emmagatzematge en un disc. Típicament té una mida de **4 KB**. Fins i tot un fitxer d'1 byte ocupa un bloc sencer.

### 1.2 [Inode](https://proferamon.com/tic/inodes.html)
Estructura de metadades que descriu un fitxer o directori. Conté:

- Tipus de fitxer (regular, directori, enllaç simbòlic...)
- Permisos (`rwxrwxrwx`)
- Propietari i grup (`UID` / `GID`)
- Mida del fitxer
- Marques de temps (creació, modificació, accés)
- Nombre d'enllaços durs
- Punters als blocs de dades en disc

L'inode **no conté el nom del fitxer**. El nom es guarda al directori, que associa noms a números d'inode.

### 1.3 Directori
Un directori és simplement un fitxer especial que conté una taula de parells **nom → número d'inode**.

### 1.4 Superbloc (*superblock*)
Zona del sistema de fitxers que guarda la informació global: tipus de filesystem, mida dels blocs, nombre total d'inodes, nombre de blocs lliures, etc.

## 2. Tipus de sistemes de fitxers

### 2.1 Linux

| Sistema | Característiques principals |
|---|------|
| **ext4** | El més habitual a Linux. Journaling, suporta fitxers fins a 16 TB. |
| **XFS** | Alt rendiment amb fitxers grans. Usat a servidors (RHEL per defecte). |
| **Btrfs** | Funcions avançades: snapshots, compressió, RAID integrat. |
| **tmpfs** | En memòria RAM. Es perd en apagar. Usat per `/tmp` i `/run`. |
| **proc / sysfs** | Pseudosistemes de fitxers virtuals que exposen informació del kernel. |

### 2.2 Windows

| Sistema | Característiques principals |
|---|------|
| **NTFS** | El principal a Windows. Permisos, journaling, fitxers grans. |
| **FAT32** | Compatible amb tot. Límit de 4 GB per fitxer. |
| **exFAT** | Llapis de memòria i targetes. Sense límit pràctic de mida. |

### 2.3 macOS

| Sistema | Característiques principals |
|---|------|
| **APFS** | Modern, snapshots, encriptació nativa, còpies en escriptura. |
| **HFS+** | L'anterior a APFS, encara present en alguns discs. |


## 3. [L'arbre de directoris a Linux](https://proferamon.com/tic/jerarquia.html) (FHS)

L'estàndard **FHS** (*Filesystem Hierarchy Standard*) defineix l'estructura de directoris:

```ini
/
├── bin/       → Ordres essencials del sistema (ls, cp, bash...)
├── boot/      → Kernel i fitxers d'arrencada (GRUB)
├── dev/       → Dispositius com a fitxers (/dev/sda, /dev/null...)
├── etc/       → Fitxers de configuració del sistema
├── home/      → Directoris personals dels usuaris
├── lib/       → Biblioteques compartides essencials
├── media/     → Punt de muntatge per a dispositius extraïbles
├── mnt/       → Muntatges temporals manuals
├── opt/       → Programari optatiu de tercers
├── proc/      → Informació del kernel i processos (virtual)
├── root/      → Directori personal del superusuari
├── run/       → Dades en temps d'execució (PID, sockets...)
├── srv/       → Dades de serveis (web, FTP...)
├── sys/       → Informació del maquinari (virtual)
├── tmp/       → Fitxers temporals (s'esborra en reiniciar)
├── usr/       → Programes i dades d'usuari (la majoria d'aplicacions)
└── var/       → Dades variables: logs, cues, bases de dades...
```



## 4. Muntar i desmuntar sistemes de fitxers

A Linux, tots els sistemes de fitxers s'integren en un únic arbre. Per accedir a un dispositiu cal **muntar-lo** en un punt de muntatge.

```bash
mount /dev/sdb1 /mnt/usb        # Munta la partició sdb1 a /mnt/usb
mount -t ext4 /dev/sdb1 /mnt/   # Especificant el tipus de filesystem
umount /mnt/usb                 # Desmunta

mount                           # Llista tots els sistemes muntats
lsblk                           # Mostra dispositius de bloc i muntatges
df -h                           # Espai usat i disponible (llegible per humans)
```

### 4.1 /etc/fstab
Fitxer de configuració que defineix els muntatges automàtics en l'arrencada:

```bash
# Dispositiu         Punt de muntatge  Tipus   Opcions        dump  pass
UUID=abc123...       /                 ext4    defaults       0     1
UUID=def456...       /home             ext4    defaults       0     2
UUID=ghi789...       swap              swap    sw             0     0
tmpfs                /tmp              tmpfs   defaults,size=1G  0  0
```



## 5. Permisos de fitxers

Cada fitxer té permisos per a tres actors: **propietari**, **grup** i **resta**.

```bash
-rwxr-xr--  1  ramon  users  4096  gen 10 12:00  script.sh
|| || |└┬┘
|| |└┬┘ └── Altres: r-- (lectura)
|└┬┘ └───── Grup:   r-x (lectura + execució)
| └──────── Propietari: rwx (tot, lectura + escriptura + execució)
└────────── Tipus: - (fitxer regular), d (directori), l (enllaç)
```

### 5.1 Canviar permisos i propietari

```bash
chmod 755 script.sh          # rwxr-xr-x (octal)
chmod u+x script.sh          # Afegeix execució al propietari
chmod go-w fitxer.txt        # Treu escriptura a grup i altres
chown ramon fitxer.txt       # Canvia el propietari
chown ramon:users fitxer.txt # Canvia propietari i grup
```



## 6. Enllaços: durs i simbòlics

### 6.1 Enllaç dur (*hard link*)
Apunta directament al mateix **inode** que el fitxer original. No es pot fer entre sistemes de fitxers ni sobre directoris.

```bash
ln original.txt enllaç_dur.txt
```

- Si s'esborra l'original, l'enllaç dur continua funcionant.
- Tots dos noms comparteixen el mateix inode (mateixes dades, mateixos permisos).

### 6.2 Enllaç simbòlic (*symlink*)
És com una drecera: un fitxer especial que conté el **camí** al fitxer original.

```bash
ln -s /ruta/original.txt enllaç_simb.txt
ls -l enllaç_simb.txt
# lrwxrwxrwx  1 ramon  users  ...  enllaç_simb.txt -> /ruta/original.txt
```

- Si s'esborra l'original, l'enllaç queda **trencat** (*dangling link*).
- Pot apuntar a directoris i a fitxers en altres sistemes de fitxers.


## 7. Eines de gestió

### 7.1 Informació i estat

```bash
stat fitxer.txt          # Informació detallada (inode, permisos, temps...)
file fitxer.txt          # Tipus de fitxer (text, binari, ELF...)
ls -li                   # Llista amb número d'inode
df -h                    # Espai lliure per partició
du -sh /home/ramon/      # Mida total d'un directori
lsblk                    # Dispositius de bloc i particions
blkid                    # UUID i tipus de cada partició
```

### 7.2 Crear i gestionar sistemes de fitxers

```bash
mkfs.ext4 /dev/sdb1          # Formata com ext4
mkfs.xfs /dev/sdb1           # Formata com XFS
mkfs.vfat -F32 /dev/sdb1     # Formata com FAT32
fsck /dev/sdb1               # Comprova i repara errors
e2fsck -f /dev/sdb1          # Comprova ext2/3/4 en profunditat
tune2fs -l /dev/sda1         # Mostra paràmetres del superbloc (ext)
```


## 8. [Journaling](https://proferamon.com/tic/journalctl.html)

El **journaling** és un mecanisme que registra els canvis pendents en un diari (*journal*) abans d'aplicar-los al disc. Si el sistema falla a mig escriure, el journal permet recuperar un estat coherent en la pròxima arrencada, sense fer una comprovació completa del disc.

Sistemes de fitxers amb journaling: **ext3**, **ext4**, **XFS**, **NTFS**.



## 9. Quotes de disc

Permeten limitar l'espai que pot usar cada usuari o grup.

```bash
quotacheck -cug /home        # Inicialitza les quotes
edquota -u ramon             # Edita les quotes de l'usuari ramon
repquota /home               # Mostra l'ús actual de quotes
```

## 10. Resum

| Concepte | Descripció breu |
|---|---|
| **Inode** | Metadades d'un fitxer (sense el nom) |
| **Bloc** | Unitat mínima d'emmagatzematge en disc |
| **Superbloc** | Informació global del sistema de fitxers |
| **Muntatge** | Integrar un dispositiu a l'arbre de directoris |
| **Journaling** | Registre de canvis per evitar corrupció |
| **Hard link** | Nom addicional per al mateix inode |
| **Symlink** | Drecera que apunta a un camí |
| **FHS** | Estàndard de l'estructura de directoris Linux |

#### Versions d'aquest document

+ HTML - [sistemes_fitxers.html](https://proferamon.com/tic/sistemes_fitxers.html)
+ PDF - [sistemes_fitxers.pdf](https://proferamon.com/tic/docs/sistemes_fitxers.pdf)
+ ODT - [sistemes_fitxers.odt](https://proferamon.com/tic/odt/sistemes_fitxers.odt)
+ MD - [sistemes_fitxers.md](https://proferamon.com/tic/md/sistemes_fitxers.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)

