Определить, смонтирована ли файловая система или раздел RO или RW через Bash Script?
37
Есть ли простой способ определить, смонтирована ли файловая система как только для чтения или для чтения-записи? Я думал просто о трубе, mountно подумал, что может быть проще.
Идеальным системным вызовом для этого было бы то, 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 не записывались.
Я должен был использовать 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
Старый вопрос, но я наткнулся на него, ища ту же помощь, и кажется, что нашел еще более простой способ без необходимости создавать файл.
Кажется, это проверяет разрешение файловой системы, но не статус монтирования.
Роберт Кэлхун
1
Правда, но это очень просто и может работать в некоторых случаях (например, у меня).
Яхо
От man dashдля -wопции - «Файл не доступен для записи в файловой системе, доступной только для чтения, даже если этот тест показывает значение true». AFAIK это то же самое для других оболочек.
Грэм,
7
Если файловая система смонтирована, я бы перешел во временный каталог и попытался создать файл. Код возврата сообщит вам, если файловая система доступна только для чтения или для чтения и записи, при условии, что файловая система не заполнена (спасибо Виллему).
Если вы просто проверяете, как монтируется файловая система, достаточно получить вывод из mount. Но я должен согласиться, это более исчерпывающий способ проверки. В некоторых случаях mount может сообщить, что он монтируется для чтения / записи, но на самом деле доступен только для чтения. Типичным примером этого является большое количество ошибок SCSI на устройстве, заставляющих его защищать себя, переходя только в режим чтения. Создание файла будет проверять чтение + запись / только для чтения без сомнения.
Алекс
1
это было бы аккуратно:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
Гленн Джекман
Написанный скриптлет имеет состояние гонки. Я бы использовал FILE = mktemp -p /filesystem/of/interest/вместо того, чтобы просто использовать afile для генерации файла и имени файла. лучший
Рик Шнайдер
1
Это неправильно сообщит о полной файловой системе только для чтения.
Виллем
@ Дэвид, это похоже на взлом временной пробелы вместо настоящего решения.
Pacerier
4
У меня просто была эта проблема, и это настоящие пасты ...
Это не охватывает все случаи. / sbin / mount будет искать в / etc / mtab кэшированную версию монтируемых в данный момент файловых систем (и их текущих параметров). Если по какой-либо причине / удастся перемонтировать ro, mtab может не обновиться корректно, поэтому / может показаться rw по-прежнему. / proc / mounts всегда должен показывать правильное значение.
Трэвис Кэмпбелл
1
Я согласен с необходимостью использования / proc / mounts. Я думаю, что этот тест должен быть сведен к функции shell (bash, поскольку OP об этом просит), которая гарантирует, что ссылка на строку не является подстрокой другого пути.
Skaperen
0
Подобно Антонио, вы можете использовать / proc / mounts, чтобы сделать то же самое. Используйте свой собственный диск вместо sda4.
statvfs
что, среди прочего, возвращает поля флага с флагом, указывающим монтирование только для чтения. К сожалению, я не знаю команду оболочки, чтобы сделать это напрямую. Я бы использовалstat -f
, но эта команда показывает все, кроме флагов.mount
не всегда говорит вам, что вы хотите: перефразируя, считывает/etc/mtab
, является кэшированной версией данных, и может быть устаревшим в некоторых случаях. Информация в/proc/mounts
том, что вы действительно хотите.Ответы:
Эта маленькая однострочная строка что-то выскакивает, если существует файловая система ro.
Предполагая, что у вас обычно нет файловой системы ro, такой как компакт-диск в приводе, этого достаточно для некоторых базовых типов мониторинга и не требует изменения файловой системы, чтобы найти текущее состояние. Это также не предполагает ваш тип файловой системы. Отправьте его в grep -v iso9660, если вы хотите, чтобы ваши CD не записывались.
источник
grep -P "\sro[\s,]" /proc/mounts
илиgrep " ro[ ,]" /proc/mounts
ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0
настроена на перемонтирование как доступное только для чтения в случае ошибки, поэтому, не проверяя,mount
вы не знаете, произошло ли это перемонтирование, следовательно, действительно ли оно в данный момент находитсяro
.$ grep "\sro[\s,]" /proc/mounts
Вывод:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
Старый вопрос, но я наткнулся на него, ища ту же помощь, и кажется, что нашел еще более простой способ без необходимости создавать файл.
Конечно, root-ro - это смонтированный ros, а root-rw - это rw fs.
источник
man dash
для-w
опции - «Файл не доступен для записи в файловой системе, доступной только для чтения, даже если этот тест показывает значение true». AFAIK это то же самое для других оболочек.Если файловая система смонтирована, я бы перешел во временный каталог и попытался создать файл. Код возврата сообщит вам, если файловая система доступна только для чтения или для чтения и записи, при условии, что файловая система не заполнена (спасибо Виллему).
источник
touch afile && { rm afile; echo "read-write"; } || echo "read-only"
mktemp -p /filesystem/of/interest/
вместо того, чтобы просто использовать afile для генерации файла и имени файла. лучшийУ меня просто была эта проблема, и это настоящие пасты ...
Посмотрите на / proc / mounts -
К вашему сведению - эти два раздела отображаются как смонтированные rw только при использовании команды mount.
источник
Основано на ответе flickerdfly , под влиянием комментария от WhiteKnight
Создать детектор функции мухи.
используйте его, чтобы определить, находится ли путь только для чтения
И избавиться от него, когда закончите
источник
Вот мое решение:
источник
Например, чтобы проверить, находится ли корневой раздел в режиме только для чтения:
источник
Подобно Антонио, вы можете использовать / proc / mounts, чтобы сделать то же самое. Используйте свой собственный диск вместо sda4.
cat / proc / mounts | grep / dev / sda4 | awk '{print substr ($ 4,1,2)}'
источник