Когда-то давно, когда Линукс не умел работать с двух(и более)байтными кодировками (как UTF-8/16, UCS-x и т.п.), я и тогда пользовался Линуксом, потому что и тогда он мне тоже нравился. И кодировкой в нём была установлена KOI8-U, потому что украинский язык я тоже люблю. Так вот, тогда я тоже в этом самом линуксе записывал CD и DVD диски. Записывал их с расширениями Rock Ridge и Joliet в файловой системе iso9660. Но если с Joliet всё понятно, в ней все имена файлов хранятся с использованием кодировки UTF-16, которая и в Африке всегда UTF-16, то с Rock Ridge всё гораздо интереснее. Имена файлов в расширениях Rock Ridge могут быть записаны в любой кодировке и сама кодировка Rock Ridge ни коим образом не интересует, главное, чтобы длина имени файла не превышала 255 байтов. Но раньше я об этом не знал. Узнал я об этом только недавно, когда попытался свои старые CD/DVD диски, записанные с расширениями Rock Ridge в кодировке KOI8-U, прочитать в системе Ubuntu Linux 11.04 с локалью uk_UA.UTF-8. Естественно, в именах файлов написанных кириллицей, я увидел "кракозяблы".
читать дальшеСначала я был очень удивлён, обнаружив, что в опциях монтирования для iso9660 отсутствуют опции для перекодирования имён файлов в расширениях Rock Ridge. Но потом я понял, что удивляться, в общем-то, нечему, например для ext2/3/4 подобные опции тоже отстутствуют, но тут вроде понятно, файловая система extX изначально разрабатывалсь для жёстких дисков, а жесткие диски подключаются к другой системе гораздо реже, чем CD/DVD диски... Так что для Rock Ridge опции перекодирования могли бы и сделать... Но не сделали.
Поиск по интернету тоже не очень обрадовал, единственное решение, которое предлагали на сайте www.gentoo.ru, монтировать с опцией -o norock для отключения использования Rock Ridge и использования вместо него расширений Joliet. Мда... До этого я и сам додумался в первую очередь, но это хорошо, если расширения Joliet записаны на диск, а если записаны только Rock Ridge? Отключить Rock Ridge и смотреть на имена файлов в голом iso9660 (вида /2000____/02___LIV.MP3;1)? Такая перспектива меня тоже не вдохновляла.
Пропахав интернет-поисковики ещё пару раз, наткнулся на такую интересную штуку, как fuse-convmvfs, файловую систему в пространстве пользователя, которая позволяет примонтировать папку с неправильной кодировкой имён файлов в другую папку с перекодированными именами файлов (поддерживаются все кодировки, поддерживаемые iconv). "Вот оно, спасение!", - подумал я, и опробовал сию чудо-систему в действии, работает! Кстати, в Midnight Commander (у меня версия 4.7.5) в свойствах панели тоже можно выбрать перекодирование, но работать оно будет только в mc, что не всегда удобно.
скрипт для автоматизацииВроде бы всё, можно радоваться и наслаждаться, но необходимость каждый раз делать это всё ручками меня не прельщала. Поэтому страсть к изобретению велосипедов взбурлила во мне я решил написать скрипт, который будет это всё делать автоматически и прикрутить его к убунтовскому автомонтёру udisks. И таки написал и прикрутил. Благо, линукс предоставляет огромные просторы для велосипедостроителей.
Вот сам скрипт, который сначала обнаруживает, есть ли на диске расширения Rock Ridge, если нет, то просто передаёт все опции команде mount и диск монтируется как обычно, а если есть, то с помощью enca определяет кодировку имён файлов, после чего монтирует диск командой mount как обычно, создаёт рядом с точкой монтирования ещё одну папку с суффиксом "-convmvfs", куда монтируется каталог через fuse-convmvfs с перекодированными именами. После извлечения диска, fuse-convmvfs автоматически отмонтируется и папка с суффиксом "-convmvfs" удаляется. Скрипт заточен под Ubuntu Linux 11.04 и его udisks, но при желании, его легко переделать.
как прикрутить скрипт к udisksТеперь как же это всё прикрутить к udisks. Здесь описано как пропатчить udisks для изменения опций монтирования различных файловых систем, я делал по аналогии с тем описанием, но менял другие куски кода.
Сначала необходимо скачать исходные коды udisks:
mkdir udisks
cd udisks
apt-get source udisks
После, отредактировать src/device.c, нужно найти строки:
n = 0;
argv[n++] = "mount";
argv[n++] = "-t";
argv[n++] = fstype;
argv[n++] = "-o";
argv[n++] = mount_options;
argv[n++] = device->priv->device_file;
argv[n++] = mount_point;
argv[n++] = NULL;
и строку
argv[n++] = "mount";
заменить на:
if (g_strcmp0 (device->priv->id_type, "iso9660") == 0)
{
argv[n++] = "mountrr";
}
else
{
argv[n++] = "mount";
}
Затем, собрать и установить, предварительно положив мой скрипт в /bin
sudo apt-get build-dep udisks
debuild
cd ..
sudo dpkg -i udisks_1.0.2*.deb
Для отката к обычному udisks:
apt-get install --reinstall udisks