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.
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.
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.
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).
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 ...
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.
statvfs
entre 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.mount
il 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/mounts
est ce que vous voulez vraiment.Réponses:
Ce petit one-liner fera apparaître quelque chose s'il existe un système de fichiers ro.
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.
la source
grep -P "\sro[\s,]" /proc/mounts
ougrep " ro[ ,]" /proc/mounts
ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0
est configurée pour remonter en lecture seule en cas d'erreur. Par conséquent, sans vérification,mount
vous ne savez pas si ce remontage a eu lieu, donc s'il est en fait actuellementro
.$ grep "\sro[\s,]" /proc/mounts
Sortie:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
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.
Bien sûr, root-ro est monté sur fs et root-rw est rw fs.
la source
man dash
pour l'-w
option - "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.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).
la source
touch afile && { rm afile; echo "read-write"; } || echo "read-only"
mktemp -p /filesystem/of/interest/
au lieu d'utiliser simplement 'afile' pour générer le fichier et le nom du fichier. meilleurJe viens d'avoir ce problème et ce sont de vraies pâtes ...
Jetez un coup d’œil à / proc / mounts -
FYI - Ces deux partitions indiquent qu’elles sont montées lorsque vous utilisez simplement la commande mount.
la source
Basé sur une réponse de scintillement , influencé par un commentaire de WhiteKnight
Créer une fonction de détecteur la mouche.
utilisez-le pour déterminer si un chemin est sur une fs en lecture seule
Et en disposer une fois terminé
la source
Voici ma solution:
la source
Par exemple, pour vérifier si la partition racine est en mode lecture seule:
la source
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)}'
la source