Determinar si el sistema de archivos o la partición está montado RO o RW a través de Bash Script?


37

¿Hay una manera fácil de determinar si un sistema de archivos montado está montado como solo lectura o lectura-escritura? Estaba pensando en canalizar mountpero pensé que podría haber una manera más fácil.


1
La llamada ideal al sistema para esto sería statvfsque, entre otras cosas, devuelve campos de marca con una marca que indica un montaje de solo lectura. Lamentablemente, no conozco un comando de shell para hacer esto directamente. Lo hubiera usado stat -f, pero ese comando muestra todo excepto las banderas.
Kasperd

2
Nota: como @Travis Campbell explica útilmente en su comentario en serverfault.com/a/277449/236916 , mountno siempre le dice lo que quiere: parafraseando, lee /etc/mtab, que es una versión en caché de los datos, y puede estar desactualizado en algunos casos. La información en /proc/mountses lo que realmente quieres.
mwfearnley

Respuestas:


51

Este pequeño one-liner emergerá algo si existe un sistema de archivos ro.

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

Suponiendo que generalmente no tiene un sistema de archivos ro como un CD en la unidad, es suficiente para algunas cosas básicas de tipo de monitoreo y no requiere cambiar el sistema de archivos para encontrar el estado actual. Tampoco asume su tipo de sistema de archivos. Conéctelo a grep -v iso9660 si desea mantener sus CD fuera del registro.


1
Tuve que usar grep -P "\sro[\s,]" /proc/mountsogrep " ro[ ,]" /proc/mounts
WhiteKnight

3
Esta es una respuesta mucho mejor que "intentar y crear un archivo" gracias.
Vagnerr

¿Esto no solo te dice las opciones que se usaron para montar, no el estado actual? Por ejemplo, una entrada con las opciones ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0está configurada para remontarse como de solo lectura en caso de error, por lo que sin verificar mountno se sabe si se ha remontado, por lo tanto, si de hecho se encuentra actualmente ro.
Walf

Esa no ha sido mi experiencia.
flickerfly

3
Acabo de tener uno hoy. Este es el sistema de archivos raíz en ro, pero era rw cuando comenzó. $ grep "\sro[\s,]" /proc/mountsSalida:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly

11

Antigua pregunta, pero la encontré buscando la misma ayuda y parece que se encontró de una manera aún más fácil sin la necesidad de crear un archivo.

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

Por supuesto, root-ro está montado en ro fs y root-rw es rw fs.


3
Eso parece probar el permiso del sistema de archivos, pero no el estado de montaje.
Robert Calhoun

1
Es cierto, pero es muy simple y puede funcionar para algunos casos (como el mío).
Yajo

A partir man dashde la -wopción - "El archivo no se puede escribir en un sistema de archivos de sólo lectura, incluso si esta prueba indica cierto. AFAIK esto es lo mismo para otros proyectiles.
Graeme

7

Si el sistema de archivos está montado, haría un CD en un directorio temporal e intentaría crear un archivo. El código de retorno le dirá si el sistema de archivos es de solo lectura o lectura-escritura, siempre que el sistema de archivos no esté lleno (gracias Willem).


1
Si solo está verificando cómo se monta un sistema de archivos, debería ser suficiente obtener el resultado del montaje. Pero tengo que estar de acuerdo, esta es una forma más exhaustiva de verificar. Hay ocasiones en que mount puede informar que está montado lectura / escritura, pero en realidad es de solo lectura. Un ejemplo común de esto es una gran cantidad de errores SCSI en un dispositivo que hace que se proteja al ir solo a lectura. La creación de un archivo verificará lectura + escritura / solo lectura sin lugar a dudas.
Alex

1
esto sería ordenado:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
Glenn Jackman

El scriptlet como está escrito tiene una condición de carrera. mktemp -p /filesystem/of/interest/Usaría FILE = en lugar de solo usar 'afile' para generar el archivo y el nombre de archivo. mejor
Rik Schneider

1
Esto informará incorrectamente un sistema de archivos completo como de solo lectura.
Willem

@David, esto parece un truco provisional en lugar de una verdadera solución.
Pacerier

4

Acabo de tener este problema y estas son pastas reales ...

Echa un vistazo a / proc / monturas -

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

FYI: estas dos particiones se muestran como rw montadas cuando solo se usa el comando mount.


2
Esto no funcionará si 'ro' es la única opción de montaje
Willem

3

Basado en una respuesta de flickerdfly , influenciado por un comentario de WhiteKnight

Crear una función de detector de la mosca.

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

úselo para determinar si una ruta está en un solo lectura fs

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

Y deséchelo cuando haya terminado

#dump temp function
unset -f is_readonly;

1

Aquí está mi solución:

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

0

Por ejemplo, para verificar si la partición raíz está en modo de solo lectura:

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

2
Esto no atrapa todos los casos. / sbin / mount buscará en / etc / mtab la versión en caché de los sistemas de archivos montados actualmente (y sus opciones actuales). Si / logra volver a montar ro por alguna razón, mtab puede no actualizarse correctamente, por lo que / puede aparecer rw aún. Sin embargo, / proc / mounts siempre debe mostrar el valor correcto.
Travis Campbell

1
Estoy de acuerdo con la necesidad de usar / proc / mounts. Creo que esta prueba debería reducirse a una función shell (bash ya que el OP lo solicita) que se asegura de que la cadena a la que se hace referencia no sea una subcadena de otra ruta.
Skaperen

0

Similar a Antonio, puede usar / proc / monturas para hacer lo mismo. Use su propio disco en lugar de sda4.

gato / proc / monturas | grep / dev / sda4 | awk '{print substr ($ 4,1,2)}'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.