Determinar se o sistema de arquivos ou partição está montado RO ou RW via Bash Script?

37

Existe uma maneira fácil de determinar se um sistema de arquivos montado está montado como Somente Leitura ou Leitura-Gravação? Eu estava pensando apenas em cantar, mountmas achei que poderia haver uma maneira mais fácil.

Jake Wilson
fonte
11
A chamada ideal do sistema para isso seria statvfsque, entre outras coisas, retorna um campo de flag com um flag indicando uma montagem somente leitura. Infelizmente não conheço um comando shell para fazer isso diretamente. Eu teria usado stat -f, mas esse comando mostra tudo, exceto sinalizadores.
kasperd
2
Nota: como @Travis Campbell explica prestativamente em seu comentário em serverfault.com/a/277449/236916 , mountnem sempre diz o que você deseja: parafraseando, ele lê /etc/mtab, que é uma versão em cache dos dados e pode estar desatualizado em alguns casos. A informação /proc/mountsé o que você realmente deseja.
Mwfearnley 23/16

Respostas:

51

Este pequeno liner aparecerá algo se existir um sistema de arquivos ro.

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

Supondo que você normalmente não tenha um sistema de arquivos ro como um CD na unidade, é suficiente para algumas coisas básicas do tipo de monitoramento e não requer alteração do sistema de arquivos para encontrar o estado atual. Também não assume o seu tipo de sistema de arquivos. Conecte-o ao grep -v iso9660 se desejar manter seus CDs fora do registro.

flickerfly
fonte
11
Eu tive que usar grep -P "\sro[\s,]" /proc/mountsougrep " ro[ ,]" /proc/mounts
WhiteKnight 7/15
3
Esta é uma resposta muito melhor do que agradecer "tente criar um arquivo".
Vagnerr
Isso não informa apenas as opções usadas para montar, e não o status atual? Por exemplo, uma entrada com as opções ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0é configurada para remontar como somente leitura no caso de um erro, portanto, sem verificar, mountvocê não sabe se essa remontagem ocorreu; portanto, se ela está atualmente ro.
Walf
Isso não tem sido a minha experiência.
Flickerfly 28/04
3
Eu só tinha um hoje. Este é o sistema de arquivos raiz no ro, mas era rw quando iniciado. $ grep "\sro[\s,]" /proc/mountsSaída:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly
11

Pergunta antiga, mas me deparei com ela procurando a mesma ajuda e parece encontrada uma maneira ainda mais fácil, sem a necessidade de criar arquivo.

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

Obviamente, root-ro é montado em ro fs e root-rw é rw fs.

user156888
fonte
3
Isso parece testar a permissão do sistema de arquivos, mas não o status de montagem.
Robert Calhoun
11
É verdade, mas é muito simples e pode funcionar em alguns casos (como o meu).
Yajo 25/02
De man dashpara a -wopção - 'O arquivo não pode ser gravado em um sistema de arquivos somente leitura, mesmo que este teste indique verdadeiro.' AFAIK é o mesmo para outras conchas.
Graeme
7

Se o sistema de arquivos estiver montado, eu cdaria para um diretório temporário e tentaria criar um arquivo. O código de retorno informará se o sistema de arquivos é Somente Leitura ou Leitura-Gravação, desde que o sistema de arquivos não esteja cheio (obrigado Willem).

David Harris
fonte
11
Se você está apenas verificando como um item de arquivo é montado, obter a saída do mount deve ser suficiente. Mas eu tenho que concordar, esta é uma maneira mais exaustiva de verificar. Há ocasiões em que o mount pode relatar que está montado como leitura / gravação, mas na verdade é somente leitura. Um exemplo comum disso é um grande número de erros SCSI em um dispositivo, fazendo com que ele se proteja indo apenas para leitura. Criar um arquivo verificará leitura + gravação / somente leitura sem dúvida.
22410 Alex
11
isso seria arrumado:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
glenn jackman 6/06/11
O scriptlet conforme escrito possui uma condição de corrida. Eu usaria FILE = em mktemp -p /filesystem/of/interest/vez de apenas usar 'afile' para gerar o arquivo e o nome do arquivo. melhor
Rik Schneider
11
Isso reportará incorretamente um sistema de arquivos completo como somente leitura.
Willem
@ David, isso parece um hack paliativo em vez de uma solução verdadeira.
Pacerier
4

Acabei de ter esse problema e essas são pastas reais ...

Dê uma olhada em / 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 - Essas duas partições são exibidas como sendo montadas rw ao usar o comando mount.

Wayne
fonte
2
Isso não funcionará se 'ro' for a única opção de montagem
Willem
3

Com base na resposta de um flickerdfly , influenciado por um comentário do WhiteKnight

Crie uma função de detector a 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;}";    

use-o para determinar se um caminho está em um fs somente leitura

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

E descarte quando terminar

#dump temp function
unset -f is_readonly;
não sincronizado
fonte
1

Aqui está a minha solução:

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

Por exemplo, para verificar se a partição raiz está no modo Somente Leitura:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi
Jaime M.
fonte
2
Isso não pega todos os casos. / sbin / mount procurará em / etc / mtab a versão em cache dos sistemas de arquivos atualmente montados (e suas opções atuais). Se / conseguir remontar ro por algum motivo, o mtab poderá não ser atualizado corretamente, portanto poderá parecer rw ainda. / proc / mounts sempre deve mostrar o valor correto.
Travis Campbell
11
Concordo com a necessidade de usar / proc / mounts. Eu acho que esse teste deve ser reduzido a uma função shell (bash desde que o OP solicite isso) que garante que a string que está sendo referenciada não seja uma substring de outro caminho.
Skaperen
0

Semelhante ao Antonio, você pode usar / proc / mounts para fazer a mesma coisa. Use sua própria unidade no lugar do sda4.

cat / proc / montagens | grep / dev / sda4 | awk '{substr de impressão ($ 4,1,2)}'

randyman99
fonte