Salta al contenuto
Note per Studenti Esercizio - Hard link e link simbolici, fast symlink (laboratorio 10)

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:

  1. the_name_of_this_text_file_is_almost_60_characters_long.txt
  2. the_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é?

Teoria: File system - interfaccia, directory e implementazioneUn file è uno spazio di indirizzi logici contigui con attributi (nome, identificatore, tipo, posizione, dimensione, protezione, date) e operazioni (create, read, write, seek, delete, truncate, open, close); il sistema tiene una tabella dei file aperti di sistema e una per processo; l'accesso è sequenziale o diretto; le directory si organizzano a livello singolo, a due livelli, ad albero, a grafo aciclico (hard link e link simbolici) o a grafo generale; i permessi UNIX rwx per proprietario, gruppo e altri (chmod 754); il file system è a strati (file system logico, organizzazione dei file, file system di base, controllo dell'I/O), con strutture su disco (boot block, superblock, directory, FCB o inode) e in memoria; i blocchi si allocano in modo contiguo (extent), concatenato (FAT) o indicizzato (inode con puntatori diretti e indiretti, ext4 con extent); lo spazio libero con bitmap, lista, raggruppamento o conteggio; mount, VFS, file system distribuiti (NFS) e semantiche di consistenza.File system - interfaccia, directory e implementazione →.


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.txt ha 59 caratteri;
  • the_name_of_this_text_file_is_more_than_60_characters_long.txt ha 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.

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, 8×5128\times512)
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.

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 link link3 continua a funzionare (il contatore passa a 1 e i blocchi restano); link1 diventa 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 Size di 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 .txt sbagliando 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 rm dell'originale l'hard link smetta di funzionare.

Versione ripasso

Nomi. ...almost_60... =59=59 caratteri; ...more_than_60... =62=62.

Link simbolici (ext4). Il contenuto è il percorso. <60<60 byte →\to fast symlink nell'inode: link1 Size 59, Blocks 0. ≥60\ge60 byte →\to 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 <60<60 sbagliata; hard link come file diverso; hard link rotto dopo rm.

Teoria: File system - interfaccia, directory e implementazioneUn file è uno spazio di indirizzi logici contigui con attributi (nome, identificatore, tipo, posizione, dimensione, protezione, date) e operazioni (create, read, write, seek, delete, truncate, open, close); il sistema tiene una tabella dei file aperti di sistema e una per processo; l'accesso è sequenziale o diretto; le directory si organizzano a livello singolo, a due livelli, ad albero, a grafo aciclico (hard link e link simbolici) o a grafo generale; i permessi UNIX rwx per proprietario, gruppo e altri (chmod 754); il file system è a strati (file system logico, organizzazione dei file, file system di base, controllo dell'I/O), con strutture su disco (boot block, superblock, directory, FCB o inode) e in memoria; i blocchi si allocano in modo contiguo (extent), concatenato (FAT) o indicizzato (inode con puntatori diretti e indiretti, ext4 con extent); lo spazio libero con bitmap, lista, raggruppamento o conteggio; mount, VFS, file system distribuiti (NFS) e semantiche di consistenza.File system - interfaccia, directory e implementazione →.

Teoria collegata