Определить, смонтирована ли файловая система или раздел RO или RW через Bash Script?

37

Есть ли простой способ определить, смонтирована ли файловая система как только для чтения или для чтения-записи? Я думал просто о трубе, mountно подумал, что может быть проще.

Джейк Уилсон
источник
1
Идеальным системным вызовом для этого было бы то, statvfsчто, среди прочего, возвращает поля флага с флагом, указывающим монтирование только для чтения. К сожалению, я не знаю команду оболочки, чтобы сделать это напрямую. Я бы использовал stat -f, но эта команда показывает все, кроме флагов.
Касперд
2
Примечание: как @Travis Campbell в своем комментарии к serverfault.com/a/277449/236916 услужливо объясняет , mountне всегда говорит вам, что вы хотите: перефразируя, считывает /etc/mtab, является кэшированной версией данных, и может быть устаревшим в некоторых случаях. Информация в /proc/mountsтом, что вы действительно хотите.
mwfearnley

Ответы:

51

Эта маленькая однострочная строка что-то выскакивает, если существует файловая система ro.

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

Предполагая, что у вас обычно нет файловой системы ro, такой как компакт-диск в приводе, этого достаточно для некоторых базовых типов мониторинга и не требует изменения файловой системы, чтобы найти текущее состояние. Это также не предполагает ваш тип файловой системы. Отправьте его в grep -v iso9660, если вы хотите, чтобы ваши CD не записывались.

flickerfly
источник
1
Я должен был использовать grep -P "\sro[\s,]" /proc/mountsилиgrep " ro[ ,]" /proc/mounts
WhiteKnight
3
Это гораздо лучший ответ, чем «попробуй создать файл».
Вагнерр
Разве это не говорит вам о параметрах, которые использовались для монтирования, а не о текущем состоянии? Например, запись с параметрами ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0настроена на перемонтирование как доступное только для чтения в случае ошибки, поэтому, не проверяя, mountвы не знаете, произошло ли это перемонтирование, следовательно, действительно ли оно в данный момент находится ro.
Уолф
Это не был мой опыт.
flickerfly
3
У меня был только один сегодня. Это корневая файловая система в ro, но при запуске она была rw. $ grep "\sro[\s,]" /proc/mountsВывод:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly
11

Старый вопрос, но я наткнулся на него, ища ту же помощь, и кажется, что нашел еще более простой способ без необходимости создавать файл.

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

Конечно, root-ro - это смонтированный ros, а root-rw - это rw fs.

user156888
источник
3
Кажется, это проверяет разрешение файловой системы, но не статус монтирования.
Роберт Кэлхун
1
Правда, но это очень просто и может работать в некоторых случаях (например, у меня).
Яхо
От man dashдля -wопции - «Файл не доступен для записи в файловой системе, доступной только для чтения, даже если этот тест показывает значение true». AFAIK это то же самое для других оболочек.
Грэм,
7

Если файловая система смонтирована, я бы перешел во временный каталог и попытался создать файл. Код возврата сообщит вам, если файловая система доступна только для чтения или для чтения и записи, при условии, что файловая система не заполнена (спасибо Виллему).

Дэвид Харрис
источник
1
Если вы просто проверяете, как монтируется файловая система, достаточно получить вывод из mount. Но я должен согласиться, это более исчерпывающий способ проверки. В некоторых случаях mount может сообщить, что он монтируется для чтения / записи, но на самом деле доступен только для чтения. Типичным примером этого является большое количество ошибок SCSI на устройстве, заставляющих его защищать себя, переходя только в режим чтения. Создание файла будет проверять чтение + запись / только для чтения без сомнения.
Алекс
1
это было бы аккуратно:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
Гленн Джекман
Написанный скриптлет имеет состояние гонки. Я бы использовал FILE = mktemp -p /filesystem/of/interest/вместо того, чтобы просто использовать afile для генерации файла и имени файла. лучший
Рик Шнайдер
1
Это неправильно сообщит о полной файловой системе только для чтения.
Виллем
@ Дэвид, это похоже на взлом временной пробелы вместо настоящего решения.
Pacerier
4

У меня просто была эта проблема, и это настоящие пасты ...

Посмотрите на / 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

К вашему сведению - эти два раздела отображаются как смонтированные rw только при использовании команды mount.

Wayne
источник
2
Это не будет работать, если «ro» является единственным вариантом монтирования
Виллем
3

Основано на ответе flickerdfly , под влиянием комментария от WhiteKnight

Создать детектор функции мухи.

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

используйте его, чтобы определить, находится ли путь только для чтения

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

И избавиться от него, когда закончите

#dump temp function
unset -f is_readonly;
синхронизирован
источник
1

Вот мое решение:

if findmnt -n -o OPTIONS ${YOUR_MOUNT_POINT} | egrep "^ro,|,ro,|,ro$"; then
  echo "Read only!"
fi
Антонио Петричка
источник
0

Например, чтобы проверить, находится ли корневой раздел в режиме только для чтения:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi
Хайме М.
источник
2
Это не охватывает все случаи. / sbin / mount будет искать в / etc / mtab кэшированную версию монтируемых в данный момент файловых систем (и их текущих параметров). Если по какой-либо причине / удастся перемонтировать ro, mtab может не обновиться корректно, поэтому / может показаться rw по-прежнему. / proc / mounts всегда должен показывать правильное значение.
Трэвис Кэмпбелл
1
Я согласен с необходимостью использования / proc / mounts. Я думаю, что этот тест должен быть сведен к функции shell (bash, поскольку OP об этом просит), которая гарантирует, что ссылка на строку не является подстрокой другого пути.
Skaperen
0

Подобно Антонио, вы можете использовать / proc / mounts, чтобы сделать то же самое. Используйте свой собственный диск вместо sda4.

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

randyman99
источник