Дмитрий Донцов aka mit
2005-05-17
Дано: FreeBSD 5.3, мультиформатный cd/dvd пишущий привод NEC ND-3520A (любой другой, просто у меня такой).
Найти: Возможность монтировать cd/dvd от имени пользователя и с его правами.
Сразу замечу, что мы будем использовать драйвер 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
Возможно, так и надо, но меня это раздражает... :)
Прекрасно. "Отсель грозить мы будем шведу." Перезагружаемся.
Перезагрузились, радуемся новому ядру и новым возможностям. Вставляем в привод какой-нибудь диск (cd или dvd) и набираем в командной строке:
mount_cd9660 /dev/cd0 ~/cdrom
Диск должен успешно примонтироваться. Однако, у меня, хоть диск и смонтировался, но я не смог ничего на нем прочесть, потому что...
Сначала я думал, что я дурак... Я всегда так думаю, когда что-то идет не так.
Диск успешно смонтирован, но после выполнения команды 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 как-то неспортивно. Что делать, неясно. Что же делать?
Ну, или, пытаются это сделать. Попробуем 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, если для вас это окажется более удобно.
У меня оставалась одна нерешенная проблема, но зато я прекрасно провел время в попытках найти ее решение, узнал много интересного, и пообщался с замечательными людьми. Хочу сказать огромное спаcибо: Евгению Чайкину и Алексею Федорчуку.
Post Scsriptum: Да и проблема в итоге решилась просто - за счет внимательного чтения man mount_cd9660. Из которого следовало, что диск с Rock Ridge Extension следует монтировать следующим образом:
mount_cd9660 -o norrip /dev/cd0 ~/cdrom/
При этом опция norrip как раз и отвечает за то, чтобы расширения Rock Ridge (в частности, атрибуты доступа) игнорировались бы).