Есть имя устройства — скажем, md0 или hdc. Как в программе на Си определить, смонтировано ли оно? Не важно, куда и сколько раз. Нужен лишь сам факт: смонтировано — не смонтировано.
> Какая операционная система?
Интересный вопрос на сайте «linux.org.ru» :-) > В linux можно просто читать содержимое псевдофайла /proc/mounts и
> смотреть, есть ли устройство там.
Сначала я тоже так думал, но не всё так просто.
Названия дисков/разделов я беру из /sys/block. А в /proc/mounts они называются порой по-другому.
Например, у меня имеется корневой раздел sdb1. А в /proc/mounts про него записано
И ничего про sdb1.
А ещё есть dm-0 (название согласно /sys/block). В /proc/mounts это /dev/mapper/_dev_sdb3.
Как об этом догадаться?
Конечно, в последнем случае можно попробовать вытащить major/minor-номера устройств и сравнить. Но что делать c /dev/root, который есть в /proc/mounts и отсутствует в /dev — вообще непонятно.
Поэтому я и хотел узнать, нет ли удобного простого общепринятого способа узнать о смонтированности устройства. > Более сложный, но более переносимый вариант - искать устройство в HAL
> и смотреть что у него в volume.is_mounted (true/false).
Тут иногда и про венду спрашивают =). Я уж не говорю про *BSD и всякую "экзотику". > Например, у меня имеется корневой раздел sdb1. А в /proc/mounts про него записано
> rootfs / rootfs rw 0 0
> /dev/root / ext3 rw,noatime,nodiratime,errors=continue,data=ordered 0 0
> И ничего про sdb1.
> А ещё есть dm-0 (название согласно /sys/block). В /proc/mounts это /dev/mapper/_dev_sdb3.
> Как об этом догадаться?
Если я правильно понимаю, то всё, что есть в /sys/block, есть и в /dev, причём с теми же именами. Но в некоторых случаях это симлинки. А в /proc/mounts указаны только конкретные устройства. Так что думаю можно сначала пройти по симлинкам в /dev до конечного устройт=ства, а затем искать его в /proc/mounts.
Вообще, рекомендую по этому поводу поискать в /usr/src/linux/Documentation или спросить у ядроразработчиков. Всё, что я написал выше - это мои домыслы =). > Кстати, разве hal не устарел (http://lists.freedesktop.org/archives/hal/2008-May/011560.html)?
HAL *когда-нибудь* заменят кучей демонов DeviceKit-*, но пока до этого ещё очень далеко. Хотя возможно то что тебе нужно уже умеет DeviceKit-disks (я не смотрел).
> Если я правильно понимаю, то всё, что есть в /sys/block, есть и в /dev, причём с теми же именами.
В том-то и дело, что нет. Для раздела LUKS имеем «/sys/block/dm-0» и не имеем сочетания «dm-0» где-либо в /dev. Разве что в виде приделки в устрашающих штуках вида «/dev/.udev/names/mapper\x2f_dev_sdb3\x2fdevices\x2fvirtual\x2fblock\x2fdm-0». И судя по этому случаю, для других случаев соответствие может оказаться ещё менее очевидным. > в /proc/mounts указаны только конкретные устройства.
Ну, я бы сказал, что «rootfs» (первая строчка в моём /proc/mounts) — это не очень конкретное устройство :-) > Так что думаю можно сначала пройти по симлинкам в /dev до конечного
устройт=ства, а затем искать его в /proc/mounts.
Я так сначала и хотел. Отправная точка у меня /sys/block. По идее, берём имя устройства оттуда и смотрим на /dev/имя_устройства. Это может оказаться символической ссылкой, распутываем её. Получаем полное «нормальное» имя устройства. Если оно есть в /proc/mounts — значит, устройство смонтировано. Вроде несложно и логично.
Но обнаружилось, что установить соответствие имени в /sys и /dev — проблема. Я описал это на примере с /sys/block/dm-0. Кроме того, вместо нормальных имён устройств в /proc/mounts могут встречаться всякие rootfs. Т.е. установление соответствия имени в /dev и /proc/mounts — тоже проблема.
Мне показалось, что разгребание всего этого — это уже черезчур много действий и должен существовать более правильный способ определения смонтированности устройства.
В принципе, для каждого устройства, перечисленного в /sys/block, легко получить номера major/minor. Но вот как бы спросить по этим номерам у ядра о смонтированности устройства?
В исходниках util-linux-ng (пакета, которому принадлежит mount) нашёл функцию is_mounted. Но она вроде бы просто использует /etc/mtab. И никакого API не видно. Может, плохо смотрю, уже спать надо идти :-)
Мда, я что-то тоже не нашёл ничего кроме man 2 mount. Ну тогда используй inotify на /etc/mtab :). Или свой модуль ядра который будет как-нить сигнализировать при вызове соответствующего syscall.
Так, посмотрел, как это делается в HAL'е. Никакого API там не используется. Просто упорно разгребается /proc/mounts.
Основная функция в HAL для этого — blockdev_refresh_mount_state. 100 строк — 4 экрана кода ради того, чтобы узнать, смонтировано устройство или нет. Она заполняет свойство volume.is_mounted.
Там и про /dev/root комментарий есть и специальный кусок кода для обработки этого чуда.
Есть ещё похожая функция device_is_mounted. Она поменьше (31 строка), чем blockdev_refresh_mount_state, под Линуксом тоже разгребает /proc/mounts, но с /dev/root не справляется.
В devicekit-disks нужный алгоритм спрятан за столькими уровнями абстракции, что я за полдня так ничего и не понял. Какой-тот эффект второй системы. Но /proc/mounts оно вроде бы не использует.
Что-то где-то рядом с темой :-)
Ещё можно посмотреть на
fs/super.c contains code to handle: - mount structures [...]
Но доступ к информации о смонтированности нужен из userspace.
А userspace-программа вроде бы не может пользоваться любыми структурами ядра или вызывать произвольные его функции.