Во-первых, небольшая справочная информация, чтобы обеспечить некоторую мотивацию для этого вопроса: у меня есть программа, которая работает на безголовом Linux-сервере и читает/записывает файлы на несколько съемных внешних жестких дисков, каждый из которых отформатирован с файловой системой ext4. Очень часто метаданные файловой системы на одном из этих дисков повреждаются по какой-либо причине (несмотря на отсутствие журналирования ext4), что может привести к тому, что диск файловой системы ext4 обнаружит проблему и перемонтирует раздел как доступный только для чтения, предположительно в качестве меры предосторожности против каскадных ошибок, развращающих привод дальше.Есть ли запрос API C API для запроса смонтированной файловой системы, чтобы узнать, доступна ли она только для чтения?
Хорошо, справедливо; но теперь я хочу добавить функцию в свою программу, которая может обнаружить, когда диск находится в состоянии перемонтированного состояния только для чтения, чтобы он мог активно уведомлять пользователя о том, что его диск находится в неисправности.
Мой вопрос: какой элегантный/поддерживаемый способ запросить файловую систему, чтобы узнать, смонтирован ли он только для чтения?
Пытаться записать файл в файловую систему недостаточно, потому что это может привести к поломке по другим причинам, а также потому, что я не хочу писать в файловую систему, если мне это не нужно.
Моя программа может fopen("/proc/mounts", "r")
и разобрать строки текста, которые он генерирует (grepping для маркера «rw,» в строке, соответствующей моему разделу), и я буду, если придется, но это решение кажется немного взломанным (слишком сильно, как скрипинг экрана, который может сломаться, если текстовый формат когда-либо изменится).
Итак, есть ли какой-либо легкий/специально разработанный системный вызов Linux, который я мог бы использовать, что скажет мне, установлена ли в данный момент точка монтирования файловой системы (например, «/ dev/sda1») только для чтения? Кажется, stat()
может это сделать, но я не вижу, как это сделать.
Существует даже функция POSIX.1 для этого: ['statvfs()' или 'fstatvfs()'] (http://man7.org/linux/man-pages/man3/statvfs.3.html) в любом файле на нужном жестком диске. Если '.f_flag & ST_RDONLY', он монтируется только для чтения. –
Глупым решением будет использование ['access()'] (https://linux.die.net/man/2/access) – Stargateur
_Side note: _ Если вы посмотрите на страницу man для 'statvfs' [as предложенный Nominal Animal], он отмечает, что _older_ версия 'statvfs' собрала флаги, проанализировав'/proc/mounts' - так что вы не были слишком далеко. На странице man также отмечается, что 'statvfs' вызывает linux syscall' statfs', чтобы получить эту информацию сейчас. –