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

Начинающих пользователей 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, хотя и со второго пинка.