Determinare se il filesystem o la partizione sono montati RO o RW tramite Bash Script?


37

C'è un modo semplice per determinare se un filesystem montato è montato come Sola lettura o Lettura-Scrittura? Stavo pensando di fare pipa mountma ho pensato che potesse esserci un modo più semplice.


1
La richiesta di sistema ideale per questo sarebbe statvfsche tra l'altro restituisce un campo flag con un flag che indica un mount di sola lettura. Sfortunatamente non conosco un comando shell per farlo direttamente. Avrei usato stat -f, ma quel comando mostra tutto tranne le bandiere.
Kasperd,

2
Nota: come @Travis Campbell spiega utile nel suo commento su serverfault.com/a/277449/236916 , mountnon sempre ti dice quello che vuoi: parafrasando, si legge da /etc/mtab, che è una versione cache dei dati, e può essere obsoleto in alcuni casi. Le informazioni /proc/mountssono ciò che vuoi davvero.
mwfearnley,

Risposte:


51

Questo piccolo one-liner farà apparire qualcosa se esiste un file system ro.

grep "[[:space:]]ro[[:space:],]" /proc/mounts 

Supponendo che di solito non si disponga di un file system ro come un CD nell'unità, è sufficiente per alcuni tipi di monitoraggio di base e non è necessario modificare il file system per trovare lo stato corrente. Inoltre, non presuppone il tipo di file system. Inseriscilo in grep -v iso9660 se vuoi tenere i tuoi CD fuori dal registro.


1
Ho dovuto usare grep -P "\sro[\s,]" /proc/mountsogrep " ro[ ,]" /proc/mounts
WhiteKnight il

3
Questa è una risposta molto migliore di "prova a creare un file" grazie.
Vagnerr,

Questo non ti dice solo le opzioni che sono state usate per montare, non lo stato attuale? Ad esempio, una voce con le opzioni ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0è impostata per rimontare come letta solo in caso di errore, quindi senza controllare mountnon si sa se si è verificato quel rimontaggio, quindi se è effettivamente presente ro.
Walf,

Questa non è stata la mia esperienza.
flickerfly,

3
Ne ho appena avuto uno oggi. Questo è il file system di root in ro, ma era rw all'avvio. $ grep "\sro[\s,]" /proc/mountsUscita:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly,

11

Vecchia domanda, ma l'ho trovato cercando lo stesso aiuto e sembra che sia stato trovato un modo ancora più semplice senza la necessità di creare file.

    [ -w /root-rw ] && echo "rw" || echo "ro"
    rw
    [ -w /root-ro ] && echo "rw" || echo "ro"
    ro

Ovviamente, root-ro è ro montato fs e root-rw è rw fs.


3
Sembra testare l'autorizzazione del filesystem, ma non lo stato di mount.
Robert Calhoun,

1
È vero, ma è molto semplice e può funzionare in alcuni casi (come il mio).
Yajo,

Da man dashper l' -wopzione - "Il file non è scrivibile su un file system di sola lettura anche se questo test indica vero." AFAIK questo è lo stesso per altre shell.
Graeme,

7

Se il file system è montato, vorrei cd in una directory temporanea e tentare di creare un file. Il codice di ritorno ti dirà se il file system è di sola lettura o lettura-scrittura a condizione che il file system non sia pieno (grazie Willem).


1
Se stai solo verificando come è montato un filesystem, ottenere l'output da mount dovrebbe essere sufficiente. Ma devo essere d'accordo, questo è un modo più esaustivo per verificare. Ci sono occasioni in cui mount può segnalare che è montato in lettura / scrittura, ma in realtà è di sola lettura. Un esempio comune di ciò è un gran numero di errori SCSI su un dispositivo che lo fa proteggere andando in sola lettura. La creazione di un file verificherà senza dubbio la lettura + scrittura / sola lettura.
Alex,

1
questo sarebbe ordinato:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
Glenn Jackman,

Lo scriptlet come scritto ha una condizione di razza. Vorrei usare FILE = mktemp -p /filesystem/of/interest/invece di usare semplicemente 'afile' per generare il file e il nome file. migliore
Rik Schneider,

1
Questo riporterà erroneamente un file system completo in sola lettura.
Willem,

@ David, questo sembra un hack stopgap invece di una vera soluzione.
Pacerier,

4

Ho appena avuto questo problema e queste sono vere paste ...

Dai un'occhiata a / proc / mounts -

egrep " ro,|,ro " /proc/mounts 
/dev/sda3 / ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0    
/dev/sda5 /var ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0

Cordiali saluti - Queste due partizioni mostrano come montate rw quando si usa semplicemente il comando mount.


2
Questo non funzionerà se 'ro' è l'unica opzione di mount
Willem,

3

Basato sulla risposta di un flickerdfly , influenzato da un commento di WhiteKnight

Crea una funzione rivelatore al volo.

eval "function is_readonly () {
          $( grep -P "\sro[\s,]" /proc/mounts | awk '{print "if echo $1 | grep -q \""$2"\"; then return 0;fi"}' )
      return 1;}";    

usalo per determinare se un percorso è su una sola lettura fs

is_readonly /path/to/file/on/read/only/fs && echo "sorry. can't delete that"

E smaltirlo quando fatto

#dump temp function
unset -f is_readonly;

1

Ecco la mia soluzione:

if findmnt -n -o OPTIONS ${YOUR_MOUNT_POINT} | egrep "^ro,|,ro,|,ro$"; then
  echo "Read only!"
fi

0

Ad esempio, per verificare se la partizione di root è in modalità di sola lettura:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi

2
Questo non cattura tutti i casi. / sbin / mount cercherà / etc / mtab per la versione memorizzata nella cache dei filesystem attualmente montati (e le loro opzioni correnti). Se / riesce a rimontare ro per qualche motivo, mtab potrebbe non essere aggiornato correttamente, quindi / potrebbe apparire ancora rw. / proc / mounts dovrebbe comunque mostrare sempre il valore corretto.
Travis Campbell,

1
Sono d'accordo con la necessità di utilizzare / proc / mounts. Penso che questo test dovrebbe essere ridotto a una funzione shell (bash poiché l'OP lo richiede) che assicura che la stringa a cui si fa riferimento non sia una sottostringa di un altro percorso.
Skaperen,

0

Simile ad Antonio, puoi usare / proc / mounts per fare la stessa cosa. Usa la tua unità al posto di sda4.

gatto / proc / monti | grep / dev / sda4 | awk '{stampa substr ($ 4,1,2)}'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.