FreeBSD: монтирование сменных устройств и механизм HAL


http://alv.me/?p=194
Автор: Алексей Федорчук

В одном из комментариев к Саге о FreeBSD мне попалась такая фраза от некоего анонима:

бсдшники настолько суровы, что флешки вручную монтируют.

Что на это можно ответить? Да, фришники — народ суровый, и монтируют флешки вручную. Более того, делают это только от root’а. И поступают так же с компактами, сменными дисками и носителями цифровых камер. Правда, только тогда, когда им этого хочется.

А когда им это становится лениво, они настраивают возможность монтирования сменных устройств от лица пользователя. И, дабы уж до конца испугать анонимов своей суровостью, подчас не брезгуют даже автоматическим монтированием.

Давеча как раз этим мне и пришлось заниматься на одной дружественной машине, так что я решил вкратце описать последовательность действий — поскольку собственно в Саге о FreeBSD речь до этого дойдёт ещё не скоро, а нервы анонимов надо беречь — иначе кто же будет комментировать материалы в таких количествах?

Начнём с вопроса о монтировании с правами юзера.

Начинающих пользователей FreeBSD, имеющих некоторый опыт работы в современных дистрибутивах Linux’а, часто раздражает необходимость получать права администратора для монтирования сменных накопителей (компакт-дисков, флэшек, носителей цифровых камер и тому подобных). И по умолчанию это действительно так, а попытки решить эту задачу простым редактированием файла /etc/fstab по образу и подобию Linux’ового успеха иметь не будут — опция user, обеспечивающая эту функцию в последней ОС, командой mount из FreeBSD не поддерживается.

И тем не менее необходимость административных прав для монтирования сменных устройств во FreeBSD — кажущаяся. Вот только для реализации права юзера на монтирование потребуются несколько иные действия, нежели в Linux’е.

Для начала необходимо обеспечить пользователю права доступа к файлам устройств, соответствующих сменным носителям — напомню, что это файлы вида /dev/acd# для компакт-дисков и /dev/da0 для любых носителей с USB-интерфейсом. Поскольку, начиная с ветки 5, во FreeBSD используется файловая система устройств devfs, прямое изменение атрибутов доступа командой типа chown ничего не даст: она, как известно, пересоздаётся при каждом рестарте машины. А потому пойдём иным путём: получив привилегии root’а, устанавливаем необходимые права доступа к файлам сменных устройств в файле /etc/devfs.conf, отвечающем за поведение файловой системы devfs, вписав в него такие строки:


perm /dev/acd0 0666
perm /dev/xpt0 0666
perm /dev/pass0 0666
perm /dev/da0 0666
perm /dev/da0s1 0666
...

и так далее.

Заодно тут же снимаем символ комментария со строки


#link acd0 cdrom

Благодаря этому при воссоздании devfs перечисленные выше файлы не только получат нужные атрибуты доступа (чтение и запись для владельца, группы и прочих) , но будет устанавливаться также символическая ссылка для файла /dev/cdrom -> /dev/acd0: такое имя привода компакт-диска желают видеть некоторые программы, например, mplayer.

Затем в файле /ect/sysctl.conf разрешаем монтирование VFS от имени обычного пользователя:
vfs.usermount=1

Теперь возвращаем себе права обычного пользователя и от его имени создаём в домашнем каталоге точки монтирования для сменных устройств:
% mkdir ~/cdrom ~/usb [что ещё нужно]

Проверяем правильность настроек командами:
% /sbin/mount -t msdosfs /dev/da0s1 ~/usb
% /sbin/mount -t cd9660 -o ro /dev/da0s1 ~/cdrom

Если монтирование проходит нормально, то вносим в файл /etc/fstab соответствующие строки:
/dev/acd0 /home/username/cdrom cd9660 ro,noauto 0 0
/dev/da0s1 /home/username/usb msdosfs rw,noauto 0 0

Однако возможно, что после всех предпринятых шагов флэшка или компакт откажутся монтироваться от лица пользователя, выдав предупреждение, что
Operation not permitted

Почему — тайна сия велика есть, но такой результат не исключён. Однако и тут есть решение, даже два, правда, оба — на уровне шаманских рецептов.

Первое решение — это (от лица суперпользователя) присвоить командам /sbin/mount и /sbin/umount так называемый бит суидности:
# chmod a+s /sbin/mount /sbin/umount

Не очень изящно, но, говорят, работает.

Второе же решение — вообще попахивает колдовством: произвести монтирование и размонтирование устройства от имени администратора в процессе инициализации системы. Проще всего это сделать посредством скрипта следующего содержания:
#!/bin/sh
mount /cdrom; umount /cdrom
mount /mnt; umount /mnt

который поместить в каталог /usr/local/etc/rc.d/ под именем, например, mount_umount.sh. Наличие компакта в приводе или флэшки, подсоединённой к USB-порту, не обязательно.

Мне с такой ситуацией сталкиваться не пришлось, но, говорят, что и это тоже работает: по окончании загрузки сменные устройства монтируются пользователем без всяких проблем.

Однако есть и более радикальный метод настройки монтирования сменных носителей от лица пользователя — использование механизма HAL (Hardware Abstraction Level). Правда, насколько мне известно, работает он только в Иксах, точно — в интегрированных средах KDE, GNOME и Xfce, за менеджеры окон не скажу по незнанию. Хотя, судя по тому, что порт hal идёт в качестве зависимости X-сервера, вероятно, и в некоторых из них этот механизм также поддерживается.

Итак, для начала необходимо установить соответствующий порт — /usr/ports/sysutils/hal. Правда, как только что было сказано, при установке Иксов и какой-либо из интегрированных сред он уже будет инсталлирован как зависимость, причём вместе с графическим фронт-эндом к нему (в случае с GNOME и Xfce это будет порт /usr/ports/sysutils/gnome-mount).

Далее, надо обеспечить запуск соответствующих демонов при старте системы. Собственно, демон, отвечающий за механизм HAL, так и называется — hald. Однако он зависит еще от нескольких стартовых служб — devd, usbd, dbus. Некоторые из них могут быть уже запущены — например, devd запускается по умолчанию (как это установлено в файле /etc/defaults/rc.conf). Определить, какие демоны уже функционируют можно, например, командой
# ps ux

Просматриваем её вывод и вписываем в файл /etc/rc.conf все недостающие строки из следующего набора:


usbd_enable="YES"
dbus_enable="YES"
hald_enable="YES"

Подчеркну, что никакой необходимости в установке прав доступа к файлам устройств или редактировании /etc/fstab, что требовалось при настройке описанного выше пользовательского монтировании вручную, при использовании механизма HAL не возникает. Хотя она (настройка) и ничему не мешает.

Теперь — собственно настройка. Она проста как грабли: отправляемся в каталог /usr/local/etc/PolicyKit и обнаруживаем там файл PolicyKit.conf. По умолчанию содержимое его следующее:


<config version="0.1">
<match user="root">
<return result="yes"/>
</match>
<define_admin_auth group="wheel"/>
</config>

Что предваряется следующей фразой:
<!-- See the manual page PolicyKit.conf(5) for file format -->

Руководствуясь man (5) PolicyKit.conf, между строками
<define_admin_auth group="wheel"/>

и
</config>

дописываем следующие строки:


<match action="org.freedesktop.hal.storage.mount-removable">
<return result="yes"/>
</match>
<match action="org.freedesktop.hal.storage.mount-fixed">
<return result="yes"/>
</match>

разрешающие членам группы wheel монтирование сменных и внутренних носителей, соответственно. Мы ведь не забыли ранее включить нашего главного пользователя в эту группу, не так ли?

И после реинициализации системы (например, посредством временного перехода в однопользовательский режим или полного рестарта) получаем возможность автоматического монтирования сменных устройств сразу вслед за их помещением в привод или подсоединением к USB-порту.

По собственному опыту, через HAL нормально монтируется всё, что способно монтироваться: CD- и DVD-диски, флэшки, внешние винчестеры с USB-интерфейсом, носители внутри фотокамер и они же, подключённые через кард-ридер. Единственная проблема возникла с флэшкой, переформатированной через штатную опцию Windows умолчально, то есть с файловой системой VFAT не на разделе, а непосредственно на raw-устройстве. В чём дело - пока не понял, руками эта же флэшка монтируется как устройство /dev/da0, хотя и со второго пинка.

Конечно, в отличие от современных дистрибутивов Linux, где HAL, как правило, работает “из коробки”, во FreeBSD подключение этого механизма требует некоторых телодвижений. Но, как мы только что видели, совсем не сложных. А для совсем уж ленивых существует PC-BSD — там HAL задействуется по умолчанию, точно так же, как и в любом Linux’е (о чем вкратце сказано здесь).

Обновлено: 12.03.2015