54 votes

Déterminer si le système de fichiers ou la partition est monté en lecture seule ou en lecture-écriture via un script Bash?

Y a-t-il un moyen facile de déterminer si un système de fichiers monté est monté en lecture seule ou en lecture-écriture? Je pensais simplement utiliser la commande mount mais je me demandais s'il existait un moyen plus simple.

1 votes

Le système d'appel idéal pour cela serait statvfs qui, entre autres choses, renvoie un champ de drapeaux avec un drapeau indiquant un montage en lecture seule. Malheureusement, je ne connais pas de commande shell pour le faire directement. J'aurais utilisé stat -f, mais cette commande affiche tout sauf les drapeaux.

2 votes

Note : Comme @Travis Campbell l'explique judicieusement dans son commentaire sur serverfault.com/a/277449/236916, mount ne vous dit pas toujours ce que vous voulez : pour paraphraser, il lit depuis /etc/mtab, qui est une version mise en cache des données, et peut être obsolète dans certains cas. Les informations dans /proc/mounts sont ce que vous voulez vraiment.

74voto

flickerfly Points 2433

Cette petite ligne fera apparaître quelque chose si un système de fichiers en mode lecture seule existe.

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

En supposant que vous n'avez généralement pas un système de fichiers en mode lecture seule comme un CD dans le lecteur, il est suffisant pour certains besoins de surveillance de base et ne nécessite pas de modifier le système de fichiers pour trouver l'état actuel. Il ne suppose pas non plus votre type de système de fichiers. Passez-le dans grep -v iso9660 si vous voulez exclure vos CD de l'enregistrement.

2 votes

J'ai dû utiliser grep -P "\sro[\s,]" /proc/mounts ou grep " ro[ ,]" /proc/mounts

4 votes

C'est une bien meilleure réponse que "essayez de créer un fichier" merci.

0 votes

Ne fait-on plus que vous indiquer les options qui ont été utilisées pour monter, pas l'état actuel ? Par exemple, une entrée avec les options ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0 est réglée pour être remontée en lecture seule en cas d'erreur, donc sans vérifier mount, vous ne savez pas si cette remontée a eu lieu, donc si elle est effectivement actuellement en ro.

16voto

iwayneo Points 4880

Ancienne question, mais je suis tombé dessus en cherchant la même aide et il semble que j'ai trouvé une solution encore plus facile sans avoir besoin de créer de fichier.

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

Bien sûr, root-ro est un système de fichiers monté en ro et root-rw est un système de fichiers monté en rw.

4 votes

Cela semble tester les autorisations du système de fichiers, mais pas l'état de montage.

2 votes

Vrai, mais c'est très simple et peut fonctionner pour certains cas (comme le mien).

0 votes

De l'homme tiret pour l'option -w - "Le fichier n'est pas accessible en écriture sur un système de fichiers en lecture seule même si ce test indique vrai." À ma connaissance, c'est la même chose pour les autres shells.

9voto

Camden S. Points 111

Si le système de fichiers est monté, je ferais cd vers un répertoire temporaire et tenterais de créer un fichier. Le code de retour vous indiquera si le système de fichiers est en lecture seule ou en écriture pourvu que le système de fichiers ne soit pas plein (merci Willem).

2 votes

Si vous voulez simplement vérifier comment un système de fichiers est monté, obtenir la sortie de la commande `mount` devrait suffire. Mais je dois admettre, c'est une façon plus exhaustive de vérifier. Il arrive parfois que `mount` signale que c'est monté en lecture/écriture, mais qu'en réalité c'est en lecture seule. Un exemple courant est un grand nombre d'erreurs SCSI sur un périphérique le forçant à se protéger en passant en lecture seule. Créer un fichier permettra de vérifier en lecture+écriture/lecture seule sans aucun doute.

1 votes

Cela serait soigné : touch afile && { rm afile; echo "lecture-écriture"; } || echo "lecture seule"

1 votes

Le scriptlet tel qu'il est écrit présente une condition de concurrence. Je vais utiliser FILE=mktemp -p /filesystem/of/interest/ au lieu d'utiliser simplement 'un_fichier' pour générer le fichier et le nom de fichier. meilleur

5voto

Wayne Points 51

Je viens juste de rencontrer ce problème et voici les véritables extraits ...

Jetez un œil à /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

Pour information - Ces deux partitions apparaissent comme étant montées rw lorsqu'on utilise simplement la commande mount.

2 votes

Cela ne fonctionnera pas si "ro" est la seule option de montage

4voto

user1847 Points 101

Basé sur une réponse de flickerfly, influencé par un commentaire de WhiteKnight

Créez une fonction détecteur pour la mouche.

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

Utilisez-la pour déterminer si un chemin se trouve sur un système de fichiers en lecture seule

is_readonly /chemin/vers/fichier/sur/fs/en/lecture/seule && echo "désolé. impossible de supprimer cela"

Et éliminez-la une fois terminé

#se débarrasser de la fonction temporaire
unset -f is_readonly;

0 votes

C'est très amusant de revenir ici des années plus tard et de voir les améliorations itératives apportées à une réponse simple. Flickerfly -> WhiteKnight -> non synchronisé Ce truc d'internet pourrait vraiment décoller.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X