Монтирование cd (с правами пользователя) в FreeBSD 5.3


Продолжение темы
Дмитрий Донцов aka mit

Дано: FreeBSD 5.3, мультиформатный cd/dvd пишущий привод NEC ND-3520A (любой другой, просто у меня такой).
Найти: Возможность монтировать cd/dvd от имени пользователя и с его правами.

1. Первоначальная настройка
Сразу замечу, что мы будем использовать драйвер ATAPI/CAM, что позже позволит нам использовать такие утилиты, как cdrecord и growisofs. Этот драйвер позволяет работать с ATAPI-устройствами (приводы CD-ROM, CD-RW, DVD и так далее) через подсистему SCSI.

Использование драйвера ATAPI/CAM подразумевает его подержку ядром, для этого в файл конфигурации ядра необходимо добавить следующие строки:

device atapicam
device scbus
device cd
device pass
Кроме того, в файле конфигурации ядра должна быть следующая строка:

device ata
которая уже должна там присутствовать. Подробности по ссылке.

Далее мы должны создать новое ядро, как описано здесь.

После создания и установки нового ядра не торопитесь перезагружаться. Выполним некоторые настройки, описанные Евгением Чайкиным aka StarNNick (можно прочитать и здесь).

Я приведу их здесь со своими комментариями.

Для начала, выставим на устройства соответствующие права. В файле /etc/devfs.conf пропишем следующее:

perm /dev/cd0 0666
perm /dev/xpt0 0666
perm /dev/pass0 0666
Если вы все еще используете флоппи диски... Нет, мы не идем к вам, просто добавьте туда же строчку:

perm /dev/fd0 0666
Права можно установить и 0660, но тогда вам (пользовотелю, под которым вы работаете) необходимо войти в группу operator, поскольку устройство /dev/cd0 принадлежит пользователю root и группе operator.

Затем, установим переменную vfs.usermount в 1, путем прописывания её в /ect/sysctl.conf:

vfs.usermount=1
Важное замечание: В системных файлах FreeBSD последняя строчка должна заканчиватся символом перевода строки, в противном случае параметр, размещенный в последней строчке не будет применен. Будьте внимательны.

Далее, займёмся редактированием файла /etc/fstab, прописав в нем точки монтирования для тех пользователей, которым мы хотим разрешить это делать:

/dev/cd0 /cdrom cd9660 ro,noauto,-C=koi8-r 0 0
/dev/cd0 /home/user1/cdrom cd9660 ro,noauto,-C=koi8-r 0 0
Если вы все еще используете флоппи диски, добавьте:

/dev/fd0 /floppy msdosfs rw,noauto,-L=ru_RU.KOI8-R,-D=CP866 0 0
/dev/fd0 /home/user1/floppy msdosfs rw,noauto,-L=ru_RU.KOI8-R,-D=CP866 0 0
Теперь создайте точки монтирования /home/user1/cdrom, /home/user1/floppy, например, от имени пользователя, это не играет роли.

Далее Евгений рекомендует создать некий загрузочный скрипт /usr/local/etc/rc.d/mount_umount.sh, следующего содержания:

#!/bin/sh
mount /cdrom; umount /cdrom
mount /floppy; umount /floppy
Его необходимо сделать исполняемым. Я воздержался от этого совета, поскольку (забегу вперед) у меня пользователь прекрасно монтирует и размонтирует диски и без этого. Если вы столкнетесь с проблемами монтирования от пользователя, обязательно воспользуйтесь этим скриптом, который более подробно описан в цитировавшемся сочинении.

Если я использую этот скрип, то при загрузке системы (у меня, во всяком случае) выводятся сообщения:

Local package initialization:cd9660 /dev/cd0:Input/output error
umount: /cdrom: not a file system root directory
Возможно, так и надо, но меня это раздражает... :)

Прекрасно. "Отсель грозить мы будем шведу." Перезагружаемся.

2. Пожинаем плоды
Перезагрузились, радуемся новому ядру и новым возможностям. Вставляем в привод какой-нибудь диск (cd или dvd) и набираем в командной строке:

mount_cd9660 /dev/cd0 ~/cdrom
Диск должен успешно примонтироваться. Однако, у меня, хоть диск и смонтировался, но я не смог ничего на нем прочесть, потому что...

3. Чудеса начинаются
Сначала я думал, что я дурак... Я всегда так думаю, когда что-то идет не так.

Диск успешно смонтирован, но после выполнения команды mount, права доступа на точку монтирования установились в 0600 с UID=501 и GID=501. Это мне было непонятно, ведь пользователи в FreeBSD начинают нумероваться с 1000, и я завел обсуждение на форуме http://linuxforum.ru, в соответствующем разделе посвященном BSD-системам - http://www.linuxforum.ru/index.php?showtopic=6323. И мне действительно помогли найти некий промежуточный ответ (огромная благодарность Алексею Федорчуку за правильные наводящие вопросы).

Небольшая предыстория:
Прежде чем перебраться на FreeBSD, я долгое время в качестве домашней системы использовал Linux (если вам так интересно, то сначала это был Mandrake 8.2, и несколько позже Mandrake 9.1).

Естественным образом, я еженедельно бэкапил (это же естественно, не правда ли?) ценные данные на cd, и позже на dvd+rw. А политика доступа к файлам у меня была довольно жесткая (не люблю, когда копаются в моих данных), т.е на директории - 0700 или на файлы 0600, если только они не являются исполняемыми (для них маска доступа была 0700).

И в результате, поскольку я при записи данных на диски использовал как расширение Joilet, так и расширение Rock Ridge, эти права (вместе с GID и UID) были, естественным образом, бережно сохранены расширением Rock Ridge.

Последний штрих, необходимый для понимания, той ситуации, в которой я оказался - в Линукс (очень часто) нумерация пользователей начинается с 500, во всяком случае так и было в Mandrake (а есть дистрибутивы, где она начианется со 100, возможны и иные варианты - А.Ф.).

В итоге, mount, "увидев" на диске Rock Ridge, ничтоже сумняшеся, установил права на точку монитрования 0600, а также UID=501 и GID=501 (именно те, с которыми я работал под Linux). Кроме того, mount под FreeBSD не имеет многих полезных опций, (позволивших бы решить проблему) доступных в Linux, и это сильно осложнило положение.

Я оказался в глупом положении, куда сам себя же и загнал... Можете посмеяться... :) Нет, из под пользователя root я все прекрасно вижу, диск и файлы на нем великолепно читаются...

Гугление на тему не дало результата, а изменять свой GID и UID на 501 как-то неспортивно. Что делать, неясно. Что же делать?

4. Нормальные герои всегда идут в обход
Ну, или, пытаются это сделать. Попробуем amd. Нет, я еще не сошел с ума и не собираюсь менять процессор, amd это не процессор, это Automatically Mount Daemon. Итак, в файл /etc/amd.map дописываем строчку:

cdrom type:=cdfs;dev:=/dev/cd0;opts:=ro
В файл /etc/rc.conf добавляем:

amd_enable="YES"
amd_flags="-r -l syslog /mnt1 /etc/amd.map"
Директорию /mnt1 создавать не нужно, она будет создана автоматически, при загрузке демона. Однако нужно создать директорию /.amd_mnt (это такой хитрый шаманизм). На самом деле, диск будет автоматически монтироваться именно в нее, а /mnt1/cdrom будет символической ссылкой на /.amd_mnt/cdrom/host.

Но мне все это не помогло, т.к. amd монтирует ровно с теми правами, о которых я писал выше. Вы, кстати, можете воспользоваться и amd, если для вас это окажется более удобно.

5. Итого
У меня есть одна нерешенная проблема, но зато я прекрасно провел время в попытках найти ее решение, узнал много интересного, и пообщался с замечательными людьми. Хочу сказать огромное спаcибо: Евгению Чайкину и Алексею Федорчуку.

Если вы, вдруг обнаружили ошибки в этой заметке, или, пуще того, знаете решение пробемы, то я всегда вас готов выслушать.

От редактора: тема монтирования устройств от лица пользователя во FreeBSD, как видите, не вполне закрыта. У кого есть соображения по этому поводу - милости просим на эти страницы или на Линуксфорум.

Обновлено: 12.03.2015