awk '$4~/(^|,)ro($|,)/' /proc/mounts
Como posso verificar um monte de sistemas para encontrar qualquer sistema de arquivos montado somente para leitura? Possivelmente através de um script?
awk '$4~/(^|,)ro($|,)/' /proc/mounts
Eu usei o seguinte no passado
grep ' ro ' /proc/mounts
Em alguns casos, você pode querer pular quaisquer montagens remotas que possam ser RO por design
grep ' ro ' /proc/mounts | grep -v ':'
Você também pode querer pular coisas montadas via automount
grep ' ro ' /proc/mounts | egrep -v 'automount|autofs'
Se você pretende encontrar sistemas de arquivos com problemas (ou seja, o status de montagem foi alterado para READ-ONLY devido a um erro no sistema de arquivos), eu faria o seguinte (assumindo ext * filesystems):
tune2fs -e panic [raw-disk-partition-name]
EX:
tune2fs -e panic /dev/sda1
O que isto faz é pânico com o sistema, reiniciando assim o servidor, possivelmente invocando um fsck no sistema de arquivos com problema para consertá-lo. Assim, um problema sério no sistema de arquivos é tratado por meio de um sistema que o conserte automaticamente, em vez de descartá-lo para o modo Somente Leitura, o que não achei muito útil. Além disso, eu prefiro entrar em pânico com um sistema de arquivos com problemas, consertando-o do que tentando danificá-lo, o que com o passar do tempo pode causar mais danos.
cat /proc/mounts|sort|awk '{print $1 "1" toupper(substr($4,0,2))}'
Produz saída delimitada por tabulações com nome e modo de montagem.
Como outras respostas sugerem, você pode analisar /proc/mounts
com grep
ou awk
, por exemplo, você pode listar as montagens somente leitura:
$ grep "\sro[\s,]" /proc/mounts
ou
$ awk '$4~/(^|,)ro($|,)/' /proc/mounts
Uma alternativa para analisar o conteúdo de /proc/mounts
que você pode tentar é
$ grep '^ro$' /proc/fs/*/<device>/options
em que <device>
é o nome do nó do dispositivo do sistema de arquivos em /dev
. Por exemplo
$ grep '^ro$' /proc/fs/*/sdc1/options
retornaria ro
se /dev/sdc1
fosse montado como somente leitura.
Se você quiser verificar um dispositivo de bloco somente leitura (em vez de um sistema de arquivos montado), poderá usar
$ cat /sys/block/<device>/ro
que retorna 1
se o sistema de arquivos for somente leitura ou 0
se ler-escrever.
Observe que <device>
acima se refere ao nó do dispositivo real. Se você quiser verificar um dispositivo de link simbólico (como aqueles criados por mapeador de dispositivo ou by-uuid
), use basename
e readlink
para obter o nome do nó do dispositivo. Como estes exemplos:
$ grep '^ro$' /proc/fs/*/$(basename $(readlink -f /dev/mapper/foo)/options
$ cat /sys/block/$(basename $(readlink -f /dev/mapper/foo)/ro
Basta procurar a opção ro
mount.
Uma abordagem que funciona mesmo para sistemas de arquivos remotos (que podem ser montados rw mesmo se forem exportados ro, resultando em um sistema de arquivos somente leitura) é simplesmente criar um arquivo de teste em cada sistema de arquivos e testar o código de retorno desse comando.
Mas se isso é algo que acontece regularmente, você precisa investigar a causa em vez de tentar corrigir os sintomas.
Estou um pouco atrasado, mas é assim que eu lidei com isso.
#!/bin/bash
FILE=/tmp/test.txt
# Check health of LXD host machine
touch ${FILE}
if [ -f ${FILE} ];
then
rm ${FILE}
echo "File System is Good!"
else
message="File System is R/O !"
echo ${message} >> /var/log/lxd/health.log >&2
send_twilio "${TWILIO_ACCOUNT_SID}" "${TWILIO_ACCOUNT_TOKEN}" "${TWILIO_NUMBER}" "${to_twilio}" "${HOST}" "${message}"
Tags mount linux filesystems rhel