Salta al contenuto principale

mount: collegare dischi e cartelle al sistema

Inviato da tuxsa il

Hai visto con lsblk che la chiavetta si chiama sdc1. E adesso? Per leggerne i file bisogna "montarla": collegarla a una cartella del sistema. mount è il comando che fa questo collegamento, ed è anche quello che stabilisce, all'avvio, dove finisce ogni disco del server.

Cos'è

mount ("monta") fa parte del pacchetto util-linux ed è presente su ogni distribuzione. In Linux non esistono le "lettere dei dischi" di Windows (C:, D:): c'è un unico albero di cartelle, che parte da /, e ogni disco, partizione, chiavetta o condivisione di rete viene agganciata a una cartella di quell'albero. La cartella scelta si chiama punto di montaggio: una volta montata la chiavetta su /mnt/usb, i suoi file compaiono dentro quella cartella.

Cosa fa

Con argomenti, collega un dispositivo (o una cartella, o una condivisione di rete) a un punto di montaggio, con le opzioni richieste. Senza argomenti, elenca tutto ciò che è montato in questo momento. Il comando inverso è umount ("smonta", senza la n), che scollega in modo sicuro.

Come si usa

$ sudo mount [opzioni] dispositivo punto_di_montaggio
$ sudo umount punto_di_montaggio

Per montare e smontare servono i privilegi di amministratore (vedi l'articolo su sudo), salvo i casi, come le chiavette nell'ambiente grafico, in cui lo fa il sistema per te. Gli esempi continuano la serie sul server con il disco dati sdb1 e la chiavetta sdc1 dell'articolo su lsblk.

Esempio 1: che cosa è montato adesso?

$ mount -t ext4,vfat
/dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077)
/dev/sdb1 on /mnt/dati type ext4 (rw,relatime)
$ findmnt -l -t ext4,vfat
TARGET    SOURCE    FSTYPE OPTIONS
/         /dev/sda2 ext4   rw,relatime,errors=remount-ro
/boot/efi /dev/sda1 vfat   rw,relatime,fmask=0077,dmask=0077
/mnt/dati /dev/sdb1 ext4   rw,relatime

Senza opzioni mount stampa decine di righe, perché Linux monta anche molti file system "virtuali" (/proc, /sys, /dev, tmpfs…) che non sono dischi. Con -t (type) si filtra per tipo di file system. Il comando findmnt, dello stesso pacchetto, mostra le stesse informazioni in colonne più leggibili: la forma -l è l'elenco piatto, mentre senza opzioni disegna l'albero dei montaggi. Ogni riga dice cosa è collegato (SOURCE), dove (TARGET), con quale file system e con quali opzioni (rw vuol dire lettura e scrittura, ro sola lettura).

Esempio 2: montare una partizione

$ sudo mkdir -p /mnt/usb
$ sudo mount /dev/sdc1 /mnt/usb
$ ls /mnt/usb
documenti  foto  note.txt
$ df -h /mnt/usb
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sdc1        15G   64M     15G   1% /mnt/usb
$ sudo umount /mnt/usb

Tre passi: creare la cartella che farà da punto di montaggio (con mkdir, di solito sotto /mnt), montare, e al termine smontare. Il tipo di file system viene di solito riconosciuto da solo. Mentre è montata, la chiavetta si usa come una cartella qualsiasi (ls, cp, df, vedi gli articoli relativi). Se non vuoi scrivere il nome del dispositivo, o se non sei sicuro, controlla prima con lsblk.

Esempio 3: le opzioni più usate

$ sudo mount -t vfat -o uid=1000,gid=1000 /dev/sdc1 /mnt/usb
$ sudo mount -o ro /dev/sdb1 /mnt/dati
$ sudo mount -o noexec,nosuid,nodev /dev/sdc1 /mnt/usb

Con -t si indica il tipo di file system (ext4, vfat, exfat, ntfs3, xfs…), con -o (options) un elenco di opzioni separate da virgole:

  • ro (read only): monta in sola lettura, la scelta giusta quando devi solo guardare o recuperare dei dati;
  • uid=1000,gid=1000: sui file system senza permessi di tipo Unix (vfat, exfat, ntfs) assegna tutti i file a un utente e a un gruppo (qui quelli di enzo, vedi l'articolo su id);
  • noexec, nosuid, nodev: impediscono di eseguire programmi, di usare i permessi speciali e di creare dispositivi dal contenuto montato: una cautela sensata per chiavette di cui non ti fidi.

Esempio 4: montare per UUID o per etichetta

$ sudo mount UUID=c9d8e7f6-a5b4-4c3d-9e2f-1a0b9c8d7e6f /mnt/dati
$ sudo mount LABEL=CHIAVETTA /mnt/usb
$ lsblk -o NAME,LABEL,UUID /dev/sdb1

Come visto per lsblk, il nome sdb1 può cambiare da un avvio all'altro, mentre l'UUID (o l'etichetta, se la assegni tu) resta lo stesso. mount accetta direttamente UUID=... o LABEL=... al posto del dispositivo. Il valore si legge con lsblk -f o blkid.

Esempio 5: cambiare le opzioni di un montaggio esistente

$ sudo mount -o remount,ro /mnt/dati
$ echo prova > /mnt/dati/prova
bash: /mnt/dati/prova: File system di sola lettura
$ sudo mount -o remount,rw /mnt/dati

L'opzione remount cambia le opzioni di un file system già montato, senza smontarlo. L'uso più comune è passare in sola lettura (ro) prima di una verifica o di una copia di sicurezza, per essere certi che niente cambi, e tornare poi in lettura e scrittura (rw). Se qualche programma sta scrivendo un file, il passaggio a ro fallisce con un errore.

Esempio 6: montare un file ISO o l'immagine di un disco

$ sudo mkdir -p /mnt/iso
$ sudo mount -o loop,ro debian-12.iso /mnt/iso
$ ls /mnt/iso
boot  dists  install  pool  README.txt
$ findmnt /mnt/iso
TARGET   SOURCE     FSTYPE  OPTIONS
/mnt/iso /dev/loop0 iso9660 ro,relatime
$ sudo umount /mnt/iso

Un file immagine (un .iso, o un file che contiene un intero file system) si monta con l'opzione loop: il sistema lo tratta come se fosse un disco, e ne mostra il contenuto in una cartella, senza masterizzarlo né estrarlo. Nell'elenco dei dispositivi compare un loop (visto nell'articolo su lsblk). L'output dell'esempio è illustrativo.

Esempio 7: cartelle e memoria, con bind e tmpfs

$ sudo mount --bind /home/enzo/sito /srv/sito
$ sudo mount -t tmpfs -o size=512m tmpfs /mnt/ramdisk
$ findmnt /mnt/ramdisk
TARGET       SOURCE FSTYPE OPTIONS
/mnt/ramdisk tmpfs  tmpfs  rw,relatime,size=524288k
$ sudo umount /mnt/ramdisk

Si può montare anche qualcosa che non è un disco. Con --bind una cartella diventa visibile anche in un secondo punto dell'albero: utile per mostrare una cartella dentro un ambiente isolato, o a un servizio che la cerca in un percorso fisso (un'alternativa ai collegamenti simbolici, vedi l'articolo su ln, che funziona anche dove questi non sono ammessi). Con -t tmpfs si crea un "disco in memoria": velocissimo, ma i dati spariscono allo spegnimento e occupano la RAM (compaiono nella colonna shared di free).

Esempio 8: condivisioni di rete

$ sudo mount -t nfs 192.168.1.50:/export/backup /mnt/backup
$ sudo mount -t cifs //192.168.1.50/condivisa /mnt/nas \
    -o username=enzo,uid=1000,gid=1000
Password for enzo@//192.168.1.50/condivisa:
$ df -h /mnt/nas

Lo stesso comando monta cartelle di un altro computer: nfs è il protocollo tipico fra sistemi Linux, cifs (o SMB) quello delle condivisioni di Windows e di molti NAS. Per cifs serve il pacchetto cifs-utils e per nfs il pacchetto nfs-common (su Debian e Ubuntu), e la password viene chiesta al momento. L'indirizzo è inventato. Per non scrivere la password nei comandi o nei file leggibili da tutti si usa un file separato con credentials=/percorso/file, protetto con chmod 600 (vedi l'articolo su chmod e chown).

Esempio 9: montare all'avvio, con /etc/fstab

$ sudo cp /etc/fstab /etc/fstab.bak
$ sudo nano /etc/fstab
# dispositivo   punto   tipo   opzioni   dump   fsck
UUID=c9d8e7f6-a5b4-4c3d-9e2f-1a0b9c8d7e6f /mnt/dati ext4 defaults,nofail 0 2
//192.168.1.50/condivisa /mnt/nas cifs credentials=/etc/smb.cred,nofail 0 0
$ sudo findmnt --verify
Success, no errors or warnings detected
$ sudo mount -a

Il file /etc/fstab elenca i montaggi da fare all'avvio (file system table), una riga per montaggio, con sei campi: il dispositivo (meglio per UUID), il punto di montaggio, il tipo, le opzioni, il numero per le copie di sicurezza (di solito 0) e l'ordine dei controlli all'avvio (0 per saltarli, 1 per /, 2 per gli altri). Qui l'opzione defaults raccoglie quelle normali e nofail evita che il sistema si blocchi se il disco manca. I comandi dopo la modifica sono un controllo: findmnt --verify cerca errori di scrittura, mount -a (all) monta tutto ciò che è elencato e non lo è già. Una riga in fstab permette poi di scrivere solo mount /mnt/dati. Come visto per nano, tieni una copia del file prima di modificarlo.

Esempio 10: smontare, quando il sistema dice "occupato"

$ sudo umount /mnt/usb
umount: /mnt/usb: target is busy.
$ fuser -vm /mnt/usb
                     USER        PID ACCESS COMMAND
/mnt/usb:            enzo       4102 ..c.. bash
$ cd ~
$ sudo umount /mnt/usb

Non si può smontare un file system che qualcuno sta usando, e il messaggio (il cui testo cambia con la lingua del sistema) dice proprio questo. fuser -vm mostra chi lo sta tenendo occupato: qui una shell (bash) che ha la cartella come cartella corrente (la lettera c in ACCESS). Basta uscirne con cd. Per i file aperti, lsof +f -- /mnt/usb dà un elenco dettagliato; poi si chiude il programma o lo si ferma (vedi l'articolo su kill).

Esempio 11: uso negli script

#!/bin/bash
DEST=/mnt/backup
DISCO="UUID=c9d8e7f6-a5b4-4c3d-9e2f-1a0b9c8d7e6f"

if ! mountpoint -q "$DEST"; then
    mount "$DISCO" "$DEST" || {
        echo "Disco di backup non trovato" >&2
        exit 1
    }
fi

rsync -a --delete /var/www/ "$DEST/www/"
sync
umount "$DEST"

Lo script monta il disco dei backup solo se non è già montato (mountpoint -q risponde con il codice di uscita, senza stampare niente), si ferma con un errore se il disco non c'è, copia con rsync (vedi l'articolo relativo), aspetta che tutto sia scritto con sync e smonta. Va eseguito come root (per esempio dal crontab dell'amministratore: vedi l'articolo su crontab). Il punto è non lasciare il disco di backup sempre montato: un errore, un virus o un rm sbagliato non lo raggiungono.

Opzioni utili

  • -t tipo: tipo di file system (nel montaggio) o filtro (nell'elenco).
  • -o opzioni: ro, rw, remount, loop, noexec, nosuid, nodev, uid=, gid=, noatime, nofail.
  • --bind: rende visibile una cartella anche in un altro punto.
  • -a: monta tutto quello che è elencato in /etc/fstab.
  • -v: spiega cosa sta facendo; -r: sola lettura (come -o ro).
  • umount: smonta; umount -l (lazy) lo fa non appena smette di essere usato; umount -f forza lo smontaggio dei montaggi di rete irraggiungibili.
  • findmnt, findmnt --verify, mountpoint: elenco ordinato dei montaggi, controllo di fstab, verifica di un punto di montaggio.
  • lsblk, blkid, df, fuser, lsof: dispositivi e UUID, spazio, chi usa un montaggio.

Attenzione a

  • Una riga sbagliata in /etc/fstab può bloccare l'avvio: se un disco elencato manca o la riga è scritta male, il sistema può fermarsi in una modalità di emergenza. Usa nofail per i dischi non essenziali, prova con findmnt --verify e mount -a prima di riavviare, e conserva una copia del file. Su un server remoto, tieni a portata di mano un accesso di emergenza (la console del fornitore) prima di toccare questo file.
  • Un punto di montaggio non vuoto "nasconde" i suoi file: se in /mnt/usb ci sono già dei file e ci monti sopra un disco, quei file non si vedono finché non smonti (non sono cancellati). Usa sempre una cartella vuota, creata apposta.
  • Prima di staccare un disco, smontalo: con umount il sistema finisce di scrivere i dati in sospeso. Estrarre una chiavetta senza smontarla può lasciare file danneggiati o il file system da riparare.
  • Non usare umount -f o -l per abitudine: non risolvono il problema ("occupato"), lo nascondono. Prima cerca chi usa il montaggio con fuser -vm o lsof; la forzatura serve solo per i dischi di rete irraggiungibili.
  • Attenzione al dispositivo giusto: montare è sicuro (non cancella niente), ma fai attenzione ai nomi e controlla con lsblk. Se invece formatti (mkfs) un dispositivo già montato, o uno sbagliato, perdi i dati.
  • Su vfat, exfat e ntfs i permessi sono diversi: questi file system non conoscono proprietari e permessi di Linux, quindi chmod e chown non hanno effetto; si impostano al montaggio con uid=, gid= e umask=. Un disco NTFS di un Windows spento con l'"avvio rapido" può risultare bloccato o in sola lettura: va spento del tutto prima.
  • Un file system può diventare di sola lettura da solo: con l'opzione errors=remount-ro (quella tipica di /), il kernel passa in ro se rileva errori sul disco. Se i comandi di scrittura rispondono "File system di sola lettura", guarda sudo dmesg | tail e verifica lo stato del disco prima di rimontarlo in rw.
  • I dati in tmpfs non sono permanenti: scompaiono allo spegnimento e occupano memoria. Non metterci niente che non puoi perdere.
  • I montaggi fatti a mano non sopravvivono al riavvio: se un disco deve esserci sempre, scrivilo in /etc/fstab (o in un'unità systemd); se un montaggio di rete è lento o intermittente, valuta l'opzione x-systemd.automount, che lo monta solo quando serve.
  • Le credenziali non vanno nella riga di comando: una password scritta in un comando resta nella cronologia (vedi l'articolo su history) ed è visibile a chi elenca i processi. Usa un file di credenziali con chmod 600.
  • Nei container il montaggio è di solito vietato (servono permessi speciali): se mount risponde "permission denied" pur essendo root, di solito è questo il motivo.

Riepilogo

ComandoCosa fa
mount -t ext4Elenca i montaggi di un tipo
findmntElenca i montaggi in modo ordinato (albero)
sudo mount /dev/sdc1 /mnt/usbMonta una partizione su una cartella
sudo mount UUID=... /mnt/datiMonta tramite UUID
sudo mount -o ro ...Monta in sola lettura
sudo mount -o remount,ro /mnt/datiCambia le opzioni di un montaggio esistente
sudo mount -o loop,ro file.iso /mnt/isoMonta un file immagine
sudo mount --bind /a /bRende visibile la cartella /a anche in /b
sudo mount -t tmpfs -o size=512m tmpfs /mnt/ramdiskCrea un disco in memoria
sudo mount -aMonta tutto ciò che è in /etc/fstab
sudo findmnt --verifyControlla gli errori di /etc/fstab
sudo umount /mnt/usbSmonta in sicurezza
fuser -vm /mnt/usbMostra chi sta usando un montaggio
mountpoint -q /mnt/usbVerifica (negli script) se è montato