Артем Носов aka ChiP
2004
А речь пойдет, хоть и кратко, о поддержке Joliet extension для iso9660 в FreeBSD. О самом стандарте мне известно немного, попытки найти более весомую информацию ни к чему не привели. Однако, достоверно известно, что стандарт был "разработан" Microsoft'ом для расширения возможностей существовавшего тогда и имевшего кучу ограничений iso9660. Сейчас последний в свой чистой ипостасии почти не используется. Практическое применение нашли как раз его производные: Rock Ridge ("стандарт" для *nix систем), Apple Extensions, etc.
Собственно, не в стандартах дело, а в граблях...на которые приходится наступать пользователям *nix подобных систем при работе с ними. И, конечно, самой большой шишкой в этом плане выступает поддержка русского языка. О ней и пойдет речь под призмой FreeBSD и Joliet стандарта или, говоря иначе, как увидеть кирилические буковки, а не знаки вопроса, на компакте, полученном от друзей, использующих Windows ;)
Стандартным решением для FreeBSD 4-ой ветки является установка модулей для ядра, осуществляющих автомаческое переконвертирование в необходимую кодировку:
$ cd /usr/ports/sysutils/cd9660_unicode && $ make install clean
В дальнейшем они становятся доступными по адресу /usr/local/lib/cd9660_unicode/. Так, например, для локали ru_RU.KOI8-R достаточно подгрузить модуль cd9660_koi8-r.ko:
$ kldload /usr/local/lib/cd9660_unicode/cd9660_koi8-r.ko
После этого русские символы "появляются", даже уже на примонтированном cdrom устройстве. Соотвественно для автоматической загрузки модуля достаточно создать ссылку на него в /modules
$ ln -sf /usr/local/lib/cd9660_unicode/cd9660_koi8-r.ko \ /modules/cd9660_koi8-r.ko
и прописать соотвествующую строчку в /boot/loader.conf:
cd9660_koi8-r_load="YES"
Это решение осталось справедливым и для 5-ой ветки. Однако, с выходом 5.2-RELEASE появилась новая возможность.
Для того, чтобы ей воспользоваться вам понадобится как минимум наличие исходных текстов ядра системы. Хотя я бы посоветовал иметь при себе все дерево (именно этот случай я рассмотрю). Сама процедура проста и "условно" ее можно разделить на 2-а шага: добавление опций LIBICONV и CD9660_ICONV в конфиг ядра и его (ядра) пересборка:
$ cd /sys/i386/conf && $ cp GENERIC MYKERNEL && $ vi MYKERNEL # -- добавив опции -- # options LIBICONV options CD9660_ICONV # -- выходим, набрав :wq -- #
И непосредственно пересборка:
$ cd /usr/src && $ make buildkernel KERNCONF="MYKERNEL" && $ make installkernel KERNCONF="MYKERNEL"
После пересборки необходимо перезагрузить машину, т.к. способа вытеснения уже загруженного ядра новым для x86 еще не придумали :).
Теперь примонтируем компакт диск, на котором до этого были "кракозяблики" (знаки вопроса в моем случае ;-):
$ mount_cd9660 -C KOI8-R /dev/acd0 /cdrom
Думаю, это не совсем справедливо для нашего случая, однако может натолкнуть на некоторые варианты решений в случае затруднения: список "всех" поддерживаемых encodings можно глянуть выполнив:
$ iconv -l
Завершающим этапом станет добавление (или изменение существующей) строчки в /etc/fstab. Например, для устройства /dev/acd0 и точки монтирования /cdrom строчка будет выглядеть:
/dev/acd0 /cdrom cd9660 ro,noauto,-CKOI8-R 0 0
Для тех, кто еще не в курсе: cdrom не будет монтироваться автоматически при перезапуске системы (о чем говорит нам опция noauto). Однако, вместо "длиннющей" команды теперь нам достаточно набрать:
$ mount /cdrom
У меня все. Остальное вам на домашнее задание;-)
Дополнительная информация:
man mount_cd9660
man mount
Release Notes для FreeBSD-5.2
handbook