IvmanAutomount (subfs): различия между версиями

Материал из ALT Linux Wiki
(Import from freesource.info)
 
Нет описания правки
Строка 1: Строка 1:
[[Category:Admin]]
[[Категория:Admin]]
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/admin/IvmanAutomount/subfs}}
{{merge|IvmanAutomount}}


=== Автомонтирование устройств через связку ivman + subfs ===
=== Автомонтирование устройств через связку ivman + subfs ===


К связке '''ivman'''&'''pmount''' у меня (лично) всегда было несколько претензий:
К связке '''ivman'''&'''pmount''' у меня (лично) всегда было несколько претензий:
* необходимость держать два экземпляра (системный и пользовательский) '''ivman''''а (что для однопользовательской машины излишне, а для машины, на которой одновременно залогинено несколько пользователей, грозит конфликтами "кто первый успеет");
* необходимость держать два экземпляра (системный и пользовательский) '''ivman''''а (что для однопользовательской машины излишне, а для машины, на которой одновременно залогинено несколько пользователей, грозит конфликтами «кто первый успеет»);
* необходимость говорить чего-то руками (<tt>pumount</tt>) для отмонтирования устройства;
* необходимость говорить чего-то руками (<tt>pumount</tt>) для отмонтирования устройства;
* скудность параметров монтирования через '''pmount'''
* скудность параметров монтирования через '''pmount'''
Строка 12: Строка 12:


==== Краткое описание получившеся системы ====
==== Краткое описание получившеся системы ====
'''hal''' детектит событие появления или пропадания устройств. '''Ivman''' принимает решение, что в связи с этим событием сделать с устройством - смонтировать, размонтировать, или какую-нибудь программу запустить. Мы прописываем '''ivman'''у наши собственные команды монтирования/размонтирования - скрипты, которые и делают всю остальную работу.
'''hal''' детектит событие появления или пропадания устройств. '''Ivman''' принимает решение, что в связи с этим событием сделать с устройством — смонтировать, размонтировать, или какую-нибудь программу запустить. Мы прописываем '''ivman'''у наши собственные команды монтирования/размонтирования — скрипты, которые и делают всю остальную работу.


Итак, по порядку:
Итак, по порядку:
Строка 24: Строка 24:


==== Настройки '''ivman''' ====
==== Настройки '''ivman''' ====
Система предназначена для работы с системным экземпляром демона '''ivman'''. Чтобы не портить конфигурационные файлы самого '''ivman'''а, мы используем для хранения модифицированных xml-конфигов собственую директорию <tt>/etc/ivman-mount-subfs</tt>. Суть их модификации - наши собственные команды монтирования/размонтирования, отключение задержки монтирования (так как не предполагается использования пользовательского варианта '''Ivman'''), и включение обнаружения подключенных устройств при старте демона. Соответственно, для старта '''ivman'''а с использованием нашего варианта конфигов, используется отдельный init-скрипт <tt>/etc/rc.d/init.d/ivman-mount-subfs</tt>.
Система предназначена для работы с системным экземпляром демона '''ivman'''. Чтобы не портить конфигурационные файлы самого '''ivman'''а, мы используем для хранения модифицированных xml-конфигов собственую директорию <tt>/etc/ivman-mount-subfs</tt>. Суть их модификации — наши собственные команды монтирования/размонтирования, отключение задержки монтирования (так как не предполагается использования пользовательского варианта '''Ivman'''), и включение обнаружения подключенных устройств при старте демона. Соответственно, для старта '''ivman'''а с использованием нашего варианта конфигов, используется отдельный init-скрипт <tt>/etc/rc.d/init.d/ivman-mount-subfs</tt>.


По умолчанию, '''ivman''' работает от имени непривилегированного пользователя '''ivman'''. Чтобы он мог без проблем выполнять команды монтирования/размонтирования, мы должны или ставить на эти команды '''SUID''', или делать вызовы через '''sudo'''. Сам '''ivman''' рекомендует в отладочных логах второй вариант. Так и сделано - в файле <tt>/etc/sudo.d/ivman-mount-subfs</tt> пользователю '''ivman''' разрешено безпарольно вызывать наши скрипты для монтирования и размонтирования.
По умолчанию, '''ivman''' работает от имени непривилегированного пользователя '''ivman'''. Чтобы он мог без проблем выполнять команды монтирования/размонтирования, мы должны или ставить на эти команды '''SUID''', или делать вызовы через '''sudo'''. Сам '''ivman''' рекомендует в отладочных логах второй вариант. Так и сделано — в файле <tt>/etc/sudo.d/ivman-mount-subfs</tt> пользователю '''ivman''' разрешено безпарольно вызывать наши скрипты для монтирования и размонтирования.


Вызов этих скриптов в качестве программ монтирования/размонтирования добавлен в системный конфиг '''ivman''''а <tt>[[IvmanAutomount/IvmConfigBase.xml|IvmConfigBase.xml]]</tt>:
Вызов этих скриптов в качестве программ монтирования/размонтирования добавлен в системный конфиг '''ivman''''а <tt>[[IvmanAutomount/IvmConfigBase.xml|IvmConfigBase.xml]]</tt>:
Строка 48: Строка 48:
# chkconfig ivman off
# chkconfig ivman off
# killall ivman</pre>
# killall ivman</pre>
(последнее - для пользовательских вариантов '''ivman''''a, если они есть. Тогда нужно так же отключить их автозапуск).
(последнее — для пользовательских вариантов '''ivman''''a, если они есть. Тогда нужно так же отключить их автозапуск).
Конфигурируем автозапуск нашей системы:  
Конфигурируем автозапуск нашей системы:
<pre># chkconfig ivman-mount-subfs on
<pre># chkconfig ivman-mount-subfs on
# service ivman-mount-subfs start</pre>
# service ivman-mount-subfs start</pre>
Строка 55: Строка 55:


==== Земеченные глюки ====
==== Земеченные глюки ====
У меня есть USB-HDD с четыремя разделами. И при монтировании '''ivman''''ом один из разделов, не обязательно один и тот же, постоянно монтировался "как бы дважды": в выводе команды <tt>mount</tt> он был перечислен только один раз, однако, команду <tt>umount</tt> приходилось выполнять '''дважды''', чтобы точка монтирования освободилась. При монтировании '''ivman''' ругался в логи вот так:
У меня есть USB-HDD с четыремя разделами. И при монтировании '''ivman''''ом один из разделов, не обязательно один и тот же, постоянно монтировался «как бы дважды»: в выводе команды <tt>mount</tt> он был перечислен только один раз, однако, команду <tt>umount</tt> приходилось выполнять '''дважды''', чтобы точка монтирования освободилась. При монтировании '''ivman''' ругался в логи вот так:
<pre>hal_interface.c:48 (hal_device_added) New Device: /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF
<pre>hal_interface.c:48 (hal_device_added) New Device: /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF
IvmConfig/IvmConfigCommon.c:166 (ivm_device_is_mountable) UDI /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF is device /dev/sdc1
IvmConfig/IvmConfigCommon.c:166 (ivm_device_is_mountable) UDI /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF is device /dev/sdc1
Строка 65: Строка 65:
IvmConfig/IvmConfigCommon.c:319 (ivm_device_is_mountable) Device /dev/sdc1 appears to be mountable</pre>
IvmConfig/IvmConfigCommon.c:319 (ivm_device_is_mountable) Device /dev/sdc1 appears to be mountable</pre>


Кто здесь виноват - '''ivman''', '''hal''', '''subfs''' - я не знаю. Пока что решил проблему некоторым хаком в скрипте размонтирования.
Кто здесь виноват — '''ivman''', '''hal''', '''subfs''' — я не знаю. Пока что решил проблему некоторым хаком в скрипте размонтирования.




Строка 71: Строка 71:
==== Творческие планы ====
==== Творческие планы ====
* Тестировать, тестировать, тестировать.
* Тестировать, тестировать, тестировать.
* Подумать в сторону удаления "подвисших" точек монтирования.
* Подумать в сторону удаления «подвисших» точек монтирования.
* скорее всего, расширить и улучшить конфиг: возможность раздельных опций по типам файловых систем, типам устройств и идентификаторам разделов с проверкой допустимых опций монтирования.
* скорее всего, расширить и улучшить конфиг: возможность раздельных опций по типам файловых систем, типам устройств и идентификаторам разделов с проверкой допустимых опций монтирования.



Версия от 20:08, 3 августа 2008

Merge-arrow.svg
Необходимо перенести содержимое этой статьи в статью IvmanAutomount
Вы можете помочь проекту, объединив их.


Автомонтирование устройств через связку ivman + subfs

К связке ivman&pmount у меня (лично) всегда было несколько претензий:

  • необходимость держать два экземпляра (системный и пользовательский) ivman'а (что для однопользовательской машины излишне, а для машины, на которой одновременно залогинено несколько пользователей, грозит конфликтами «кто первый успеет»);
  • необходимость говорить чего-то руками (pumount) для отмонтирования устройства;
  • скудность параметров монтирования через pmount

Поведение же пакетов hal-fstab-sync&hal-mount-subfs меня всегда более, чем устраивало. Поэтому, после того, как в последних версиях hal был поставлен конфликт на hal-fstab-sync, и волей-неволей пришлось перейти на ivman, мне очень захотелось воссоздать старую привычную функциональность.

Краткое описание получившеся системы

hal детектит событие появления или пропадания устройств. Ivman принимает решение, что в связи с этим событием сделать с устройством — смонтировать, размонтировать, или какую-нибудь программу запустить. Мы прописываем ivmanу наши собственные команды монтирования/размонтирования — скрипты, которые и делают всю остальную работу.

Итак, по порядку:

Скрипты монтирования и размонтирования

Скрипт, занимающийся монтированием, является художественно переработанным примером с Gentoo Wiki. Он выясняет желаемую точку монтирования, опции монтирования в зависимости от файловой системы устройства, создаёт уникальную точку монтирования и, собственно, монтирует устройство.

Скрипт размонтирования пытается размонтировать устройство, и, при успехе, изничтожает точку монтирования.

Настройки ivman

Система предназначена для работы с системным экземпляром демона ivman. Чтобы не портить конфигурационные файлы самого ivmanа, мы используем для хранения модифицированных xml-конфигов собственую директорию /etc/ivman-mount-subfs. Суть их модификации — наши собственные команды монтирования/размонтирования, отключение задержки монтирования (так как не предполагается использования пользовательского варианта Ivman), и включение обнаружения подключенных устройств при старте демона. Соответственно, для старта ivmanа с использованием нашего варианта конфигов, используется отдельный init-скрипт /etc/rc.d/init.d/ivman-mount-subfs.

По умолчанию, ivman работает от имени непривилегированного пользователя ivman. Чтобы он мог без проблем выполнять команды монтирования/размонтирования, мы должны или ставить на эти команды SUID, или делать вызовы через sudo. Сам ivman рекомендует в отладочных логах второй вариант. Так и сделано — в файле /etc/sudo.d/ivman-mount-subfs пользователю ivman разрешено безпарольно вызывать наши скрипты для монтирования и размонтирования.

Вызов этих скриптов в качестве программ монтирования/размонтирования добавлен в системный конфиг ivman'а IvmConfigBase.xml:

<ivm:Option name="mountcommand" value="/usr/bin/sudo /usr/bin/mount-device-subfs '$hal.info.udi$'" />
<ivm:Option name="umountcommand" value="/usr/bin/sudo /usr/bin/umount-device-subfs '$hal.block.device$'" />

монтирование мы вызываем с ##DEFINITION UDI => Универсальный идентификатор устройства##, по которому скрипт определяет все нужные для монтирования свойства устройства. А когда запускается скрипт размонтирования, устройство уже скорее всего удалено, и hal о нём может ничего не знать. Поэтому в качестве параметра передаётся извлеченное устройство. Проще было бы использовать точку монтирования, но иногда ivman наотрез отказывается её передавать.

Конфиги

Скрипт монтирования использует конфигурационный файл /etc/sysconfig/subfs_mount_options, в котором хранятся опции монтирования для разных файловых систем:

vfat="fmask=0111,dmask=000"
iso9660="mode=0444,iocharset=koi8-r,ro"
Внимание

: Формат и наполнение этого конфига, скорее всего, будет изменено и дополнено.

Кроме того, используется файл 95-ivman-mount-subfs-storage-policy.fdi, позаимствованный из пакета hal-fstab-sync. Это даёт нам как минимум двух мёртвых зайцев:

  • список устройств, которые будет монтировать ivman. А то, к примеру, он отказывается монтировать USB-жесткие диски.
  • желаемые точки монтирования для разных типов устройств.

Установка и использование

Вся система опакечена (скачать RPM, src.rpm). Устанавливаем пакет, редактируем /etc/sysconfig/subfs_mount_options в своё удовольствие. Отключаем базовую версию ivmanа (если запущена):

# service ivman stop
# chkconfig ivman off
# killall ivman

(последнее — для пользовательских вариантов ivman'a, если они есть. Тогда нужно так же отключить их автозапуск). Конфигурируем автозапуск нашей системы:

# chkconfig ivman-mount-subfs on
# service ivman-mount-subfs start

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

Земеченные глюки

У меня есть USB-HDD с четыремя разделами. И при монтировании ivman'ом один из разделов, не обязательно один и тот же, постоянно монтировался «как бы дважды»: в выводе команды mount он был перечислен только один раз, однако, команду umount приходилось выполнять дважды, чтобы точка монтирования освободилась. При монтировании ivman ругался в логи вот так:

hal_interface.c:48 (hal_device_added) New Device: /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF
IvmConfig/IvmConfigCommon.c:166 (ivm_device_is_mountable) UDI /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF is device /dev/sdc1
IvmConfig/IvmConfigCommon.c:319 (ivm_device_is_mountable) Device /dev/sdc1 appears to be mountable
manager.c:1014 (ivm_media_changed) Attempting to mount device /dev/sdc1
manager.c:786 (ivm_run_command) Running: sudo /usr/local/bin/mount-device-subfs '/org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF'
manager.c:1030 (ivm_media_changed) /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF wasn't mounted, by us or by others...
IvmConfig/IvmConfigCommon.c:166 (ivm_device_is_mountable) UDI /org/freedesktop/Hal/devices/volume_uuid_6CD0_31EF is device /dev/sdc1
IvmConfig/IvmConfigCommon.c:319 (ivm_device_is_mountable) Device /dev/sdc1 appears to be mountable

Кто здесь виноват — ivman, hal, subfs — я не знаю. Пока что решил проблему некоторым хаком в скрипте размонтирования.


Творческие планы

  • Тестировать, тестировать, тестировать.
  • Подумать в сторону удаления «подвисших» точек монтирования.
  • скорее всего, расширить и улучшить конфиг: возможность раздельных опций по типам файловых систем, типам устройств и идентификаторам разделов с проверкой допустимых опций монтирования.

Пожалуйста, жду отзывов.

Литература: