Esercizio - Hard link e link simbolici, fast symlink (laboratorio 10)
In questa pagina 4
Testo (laboratorio 10 del corso di Sistemi Operativi, Ing. Informatica UniPD, Task 3).
Si scaricano due file di testo:
the_name_of_this_text_file_is_almost_60_characters_long.txtthe_name_of_this_text_file_is_more_than_60_characters_long.txt
Si crea un link simbolico al primo file, ln -s the_name_of_this_text_file_is_almost_60_characters_long.txt link1, e un altro al secondo, ln -s the_name_of_this_text_file_is_more_than_60_characters_long.txt link2. Controllare dimensione e numero di blocchi dei due link simbolici: in cosa differiscono? Poi creare anche un hard link al primo file, ln the_name_of_this_text_file_is_almost_60_characters_long.txt link3: come differisce da link1? Perché?
Cosa succede nel file system
Un link simbolico è un file speciale con un proprio inode, il cui contenuto è il percorso del file puntato (la stringa passata a ln -s). Un hard link è invece solo un'altra voce di directory che punta allo stesso inode del file originale.
I nomi dei due file hanno lunghezze diverse. Contando i caratteri:
the_name_of_this_text_file_is_almost_60_characters_long.txtha 59 caratteri;the_name_of_this_text_file_is_more_than_60_characters_long.txtha 62 caratteri.
In ext4, se la stringa del percorso è lunga meno di 60 byte, viene memorizzata dentro l'inode stesso del link (lo spazio normalmente usato per i puntatori ai blocchi, 60 byte): è un fast symlink e non serve nessun blocco dati. Con 60 byte o più bisogna allocare un blocco.
I due link simbolici
Valori attesi su ext4 (stat link1, stat link2; non verificati su una macchina Linux in questo lavoro):
link1 (puntatore a 59 caratteri) |
link2 (puntatore a 62 caratteri) |
|
|---|---|---|
| tipo | link simbolico | link simbolico |
dimensione (Size) |
59 byte (la lunghezza del percorso) | 62 byte |
blocchi allocati (Blocks) |
0: il percorso sta nell'inode | 8 (un blocco da 4096 byte, ) |
| accesso | fast symlink, già in memoria con l'inode | serve leggere un blocco dati del disco |
La dimensione di un link simbolico non è quella del file puntato (che è di 48 byte), ma la lunghezza del percorso memorizzato: ls -l mostra link1 -> the_name_... e una size di 59.
L'hard link
link3 è un altro nome del primo file. Con ls -li e stat si vede:
link1 (simbolico) |
link3 (hard link) |
|
|---|---|---|
| numero di inode | diverso da quello del file | lo stesso del file originale |
| tipo | link simbolico | file normale (è il file) |
| dimensione | 59 (lunghezza del percorso) | 48, la dimensione del file |
| blocchi | 0 (fast symlink) | 8: i blocchi del file, condivisi con l'originale |
numero di link (Links) |
1 | 2: il file originale e link3 hanno lo stesso inode, con contatore pari a 2 |
Perché? Il nome di un file è solo una voce di directory (coppia nome-numero di inode): l'hard link ne aggiunge una, quindi non esiste nessuna nuova struttura sul disco: stesso inode, stessi blocchi, st_nlink aumentato di 1. Il link simbolico invece crea un nuovo inode (di tipo "link simbolico") con il testo del percorso.
Conseguenze, da ricordare:
- cancellando il file originale (
rm), l'hard linklink3continua a funzionare (il contatore passa a 1 e i blocchi restano);link1diventa un link pendente (dangling): punta a un nome che non esiste più; - un hard link non si può creare tra file system diversi (gli inode sono numerati dentro un file system), un link simbolico sì;
- su una directory normalmente si possono fare solo link simbolici (per evitare cicli).
I comandi per il controllo: ls -li link1 link2 link3 the_name_*, stat link1, stat link2, stat link3, e per il solo contenuto del link readlink link1.
Errori tipici
- Credere che
Sizedi un link simbolico sia la dimensione del file puntato: è la lunghezza del percorso. - Dimenticare che un fast symlink non occupa blocchi:
Blocks: 0. - Contare i caratteri del nome con l'estensione
.txtsbagliando il confronto con 60: 59 contro 62 (la soglia è "meno di 60 byte"). - Dire che l'hard link è un file diverso: è lo stesso inode, con il contatore dei link incrementato.
- Aspettarsi che dopo
rmdell'originale l'hard link smetta di funzionare.
Versione ripasso
Nomi. ...almost_60... caratteri; ...more_than_60... .
Link simbolici (ext4). Il contenuto è il percorso. byte fast symlink nell'inode: link1 Size 59, Blocks 0. byte blocco dati: link2 Size 62, Blocks 8 (un blocco da 4096). Size lunghezza del percorso, non del file (48 byte).
Hard link. link3: stesso inode, Size 48 (come il file), Blocks 8, Links 2; il simbolico link1 ha un inode diverso, Links 1, Size 59, Blocks 0. Il nome è una voce di directory: l'hard link ne aggiunge una (contatore +1); il simbolico crea un nuovo inode con il percorso.
Conseguenze. rm dell'originale: l'hard link resta valido, il simbolico diventa pendente. Hard link non tra file system diversi; su directory solo simbolici.
Controllo con i comandi. ls -li mostra gli inode (uguali per file e hard link), stat mostra Size, Blocks e Links; readlink link1 mostra il contenuto del simbolico. Nomi: 59 e 62 caratteri; soglia dei fast symlink: meno di 60 byte.
Errori tipici: Size del simbolico come quella del file; fast symlink con Blocks diverso da 0; soglia sbagliata; hard link come file diverso; hard link rotto dopo rm.