LINUX.ORG.RU

Какая операционная система?

В linux можно просто читать содержимое псевдофайла /proc/mounts и смотреть, есть ли устройство там.

Deleted
()
Ответ на: комментарий от Deleted

Более сложный, но более переносимый вариант - искать устройство в HAL и смотреть что у него в volume.is_mounted (true/false).

Deleted
()
Ответ на: комментарий от Rapt0r

> Какая операционная система?
Интересный вопрос на сайте «linux.org.ru» :-)

> В linux можно просто читать содержимое псевдофайла /proc/mounts и

> смотреть, есть ли устройство там.


Сначала я тоже так думал, но не всё так просто.
Названия дисков/разделов я беру из /sys/block. А в /proc/mounts они называются порой по-другому.

Например, у меня имеется корневой раздел 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.

Как об этом догадаться?
Конечно, в последнем случае можно попробовать вытащить major/minor-номера устройств и сравнить. Но что делать c /dev/root, который есть в /proc/mounts и отсутствует в /dev — вообще непонятно.

Поэтому я и хотел узнать, нет ли удобного простого общепринятого способа узнать о смонтированности устройства.

> Более сложный, но более переносимый вариант - искать устройство в HAL

> и смотреть что у него в volume.is_mounted (true/false).


Ну, мне надо, чтобы это работало и до старта hal.
Кстати, разве hal не устарел (http://lists.freedesktop.org/archives/hal/2008-May/011560.html)?

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

> Интересный вопрос на сайте «linux.org.ru» :-)

Тут иногда и про венду спрашивают =). Я уж не говорю про *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 (я не смотрел).

Deleted
()
Ответ на: комментарий от Deleted

> Если я правильно понимаю, то всё, что есть в /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. Но вот как бы спросить по этим номерам у ядра о смонтированности устройства?

sergey_feo
() автор топика

Поднимали тему на лоре, но что-то поиском она не находится. Если речь идёт о линухах то есть api для этого. Можешь посмотреть его в исходниках mount.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

В исходниках util-linux-ng (пакета, которому принадлежит mount) нашёл функцию is_mounted. Но она вроде бы просто использует /etc/mtab. И никакого API не видно. Может, плохо смотрю, уже спать надо идти :-)

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

Мда, я что-то тоже не нашёл ничего кроме man 2 mount. Ну тогда используй inotify на /etc/mtab :). Или свой модуль ядра который будет как-нить сигнализировать при вызове соответствующего syscall.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Не должно быть всё так сложно. Во всяком случае, я надеюсь :-)

Надо будет посмотреть, как в HAL'е делается упомянутое Иваном volume.is_mounted. Или может в DeviceKit'е.

sergey_feo
() автор топика

>Как в программе на Си определить, смонтировано ли оно? Не важно, куда и сколько раз. Нужен лишь сам факт: смонтировано — не смонтировано.

bool isMount (Device device) {
bool result = false;
/* здесь пишешь свой код */
return result;
}

iZEN ★★★★★
()
Ответ на: комментарий от sergey_feo

Очевидно же!

1) Берёшь функцию iZEN'а
2) ?????
3) PROFIT!

Deleted
()
Ответ на: комментарий от true_admin

> Если речь идёт о линухах то есть api для этого.

Есть функции для обработки /etc/mtab или /proc/mounts:
man getmntent

Не это имелось ввиду?

Эти функции просто разбирают/пишут файл и с присутствующим в /proc/mounts, но отсутствующем в /dev устройством /dev/root разобраться не помогут.

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

Так, посмотрел, как это делается в 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 оно вроде бы не использует.

sergey_feo
() автор топика
Ответ на: комментарий от true_admin

Что-то где-то рядом с темой :-)
Ещё можно посмотреть на

fs/super.c contains code to handle: - mount structures [...]

Но доступ к информации о смонтированности нужен из userspace.
А userspace-программа вроде бы не может пользоваться любыми структурами ядра или вызывать произвольные его функции.

sergey_feo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.