Déterminer si le système de fichiers ou la partition est monté RO ou RW via Bash Script?

37

Existe-t-il un moyen simple de déterminer si un système de fichiers monté est monté en lecture seule ou en lecture-écriture? Je pensais juste à la pipe, mountmais je pensais qu'il pourrait y avoir un moyen plus facile.

Jake Wilson
la source
1
L’appel système idéal pour cela serait, statvfsentre autres choses, de retourner un champ de drapeau avec un drapeau indiquant un montage en lecture seule. Malheureusement, je ne connais pas de commande shell permettant de le faire directement. J'aurais utilisé stat -f, mais cette commande montre tout sauf les drapeaux.
Kasperd
2
Remarque: comme l'explique utilement @ Travis Campbell dans son commentaire sur serverfault.com/a/277449/236916 , mountil ne vous dit pas toujours ce que vous voulez: pour paraphraser, il lit /etc/mtab, qui est une version en cache des données, et peut être obsolète dans certains cas. L'info /proc/mountsest ce que vous voulez vraiment.
mwfearnley

Réponses:

51

Ce petit one-liner fera apparaître quelque chose s'il existe un système de fichiers ro.

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

En supposant que vous ne disposiez généralement pas d'un système de fichiers ro, tel qu'un CD, dans le lecteur, cela suffit pour certains types de contrôle de base et il n'est pas nécessaire de modifier le système de fichiers pour rechercher l'état actuel. Cela ne suppose pas non plus votre type de système de fichiers. Envoyez-le dans grep -v iso9660 si vous souhaitez conserver vos CD en dehors de l’enregistrement.

papillotement
la source
1
Je devais utiliser grep -P "\sro[\s,]" /proc/mountsougrep " ro[ ,]" /proc/mounts
WhiteKnight le
3
C’est une bien meilleure réponse que "essayer de créer un fichier", merci.
Vagnerr
Est-ce que cela ne vous dit pas seulement 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 0est configurée pour remonter en lecture seule en cas d'erreur. Par conséquent, sans vérification, mountvous ne savez pas si ce remontage a eu lieu, donc s'il est en fait actuellement ro.
Walf
Cela n'a pas été mon expérience.
papillotement
3
Je viens d'en avoir un aujourd'hui. C'est le système de fichiers racine en ro, mais c'était au moment de démarrer. $ grep "\sro[\s,]" /proc/mountsSortie:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
papillotement
11

Vieille question, mais je suis tombé sur elle à la recherche de la même aide et semble être trouvé encore plus facile sans la nécessité de créer un fichier.

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

Bien sûr, root-ro est monté sur fs et root-rw est rw fs.

utilisateur156888
la source
3
Cela semble tester la permission du système de fichiers, mais pas le statut de montage.
Robert Calhoun
1
C'est vrai, mais c'est très simple et peut fonctionner dans certains cas (comme le mien).
Yajo
De man dashpour l' -woption - "Le fichier n'est pas accessible en écriture sur un système de fichiers en lecture seule, même si ce test indique true." Autant que je sache, c'est la même chose pour les autres coquilles.
Graeme
7

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

David Harris
la source
1
Si vous vérifiez simplement comment un système de fichiers est monté, obtenir le résultat de mount devrait suffire. Mais je suis d’accord, c’est une façon plus exhaustive de vérifier. Il y a des occasions où mount peut signaler qu'il est monté en lecture / écriture, mais qu'il est en réalité en lecture seule. Un exemple courant en est un grand nombre d’erreurs SCSI sur un périphérique qui l’a obligé à se protéger en lecture seule. Créer un fichier vérifiera sans aucun doute lecture + écriture / lecture seule.
Alex
1
ce serait bien rangé:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
glenn jackman
Le scriptlet tel qu'il est écrit a une condition de concurrence. J'utiliserais FILE = mktemp -p /filesystem/of/interest/au lieu d'utiliser simplement 'afile' pour générer le fichier et le nom du fichier. meilleur
Rik Schneider
1
Cela signalera de manière incorrecte un système de fichiers complet en lecture seule.
Willem
@ David, cela ressemble à un bidouillage au lieu d'une vraie solution.
Pacerier
4

Je viens d'avoir ce problème et ce sont de vraies pâtes ...

Jetez un coup d’œ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

FYI - Ces deux partitions indiquent qu’elles sont montées lorsque vous utilisez simplement la commande mount.

Wayne
la source
2
Cela ne fonctionnera pas si 'ro' est la seule option de montage
Willem
3

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

Créer une fonction de détecteur 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-le pour déterminer si un chemin est sur une fs en lecture seule

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

Et en disposer une fois terminé

#dump temp function
unset -f is_readonly;
non synchronisé
la source
1

Voici ma solution:

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

Par exemple, pour vérifier si la partition racine est en mode lecture seule:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi
Jaime M.
la source
2
Cela ne concerne pas tous les cas. / sbin / mount examinera / etc / mtab pour la version en cache des systèmes de fichiers actuellement montés (et leurs options actuelles). Si / parvient à remonter le ro pour une raison quelconque, mtab peut ne pas être mis à jour correctement, donc / peut encore apparaître rw. / proc / mounts devrait cependant toujours afficher la valeur correcte.
Travis Campbell
1
Je suis d’accord avec la nécessité d’utiliser / proc / mounts. Je pense que ce test devrait être réduit à un shell (bash puisque l'OP demande cela), fonction qui s'assure que la chaîne référencée n'est pas une sous-chaîne d'un autre chemin.
Skaperen
0

Comme Antonio, vous pouvez utiliser / proc / mounts pour faire la même chose. Utilisez votre propre disque à la place de sda4.

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

randyman99
la source