Чиним кодировку имен файлов в КДЕ на FLASH, CD/DVD, FLOPPY
Раздел : Секреты и Советы
Опубликовано SwitNJ [15/12/2008]
Итак.. окончательный результат.
Вроде бы все работает.
Проверялось на флешках, на оптических носителях (на дискетах к сожалению не успел (но проверял до этого в 11.0 - работало), так как с установкой опенсусе 11.1 из системы напрочь пропал /dev/fd0 - об этом глюке отдельно поговорить надо).

Итак.. по порядочку.
Во-первых - огромный респект товарищу AX (linux.org.ru), который помогал мне доводить до ума скрипт (http://www.linux.org.ru/view-message. ... ocache=-560865565#3314885)
Во вторых, спасибо тем кто откликнулся в помощи по работе с симлинками и с регэкспами (http://www.linux.org.ru/view-message. ... ocache=1594829517#3307630) (http://www.linux.org.ru/view-message. ... ocache=-707814850#3305032). Очень познавательно вышло.

А теперь по сути.

А) идем в папку /bin и переименовываем /bin/mount в /bin/mount_true

Б)создаем сам скрипт /bin/mount (права выставить в root:root , rwx r-x r-x)

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"
log_name="/var/log/mount.log"

echo "Sended to mount:" | tee -a "$log_name"
echo $* | tee -a "$log_name"
echo $* | iconv -f UTF-8 -t cp1251 | tee -a "$log_name"

# Get mount point name
mount_point=`expr "$*" : '.*\(/media/[^ \t\n]*\)'`
# Get try mount point name
try_mount_point=`echo $mount_point | iconv -f UTF-8 -t cp1251`
# Create symlink in /media/ directory
if [ ! "$try_mount_point" == "$mount_point" ] && [ ! -e "$try_mount_point" ];then
ln -s "$mount_point" "$try_mount_point"
fi

# Removing [,]utf8[=true][,]
parameters=`echo $* | sed -r s/"(,utf8(=true)?|utf8(=true)?,)"//`

echo "Removing UTF8:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\):alnum:*\)' > /dev/null ); then
# update mount options for cdrom
parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\):alnum:*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat:blank:\)' > /dev/null ); then
# update mount options for other
parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo "Corrected for CD/DVD/USB(vfat)/FLOPPY:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# mount
/bin/mount_true $parameters


Как это работает?
1) скрипт перехватывает параметры, передаваемые в mount
2) выделяется имя точки монтирования. если она на utf8 (то есть отображается крокозябрами) то имя приводится к нормальному, путем создания символической ссылки в виде правильного имени на корявое. если такая ссылка уже есть или название ссылки английское - оставляем как есть. ЭТО ВАЖНО, так как оптические диски с метками на русском языке просто напросто не будут монтироваться вообще.
3) из параметров монтирования удаляется опция (,)utf8(=true). если ее оставить то никакие iocharset не помогут.
4) если это оптический диск (cd/dvd) то добавляем опции ",iocharset=cp1251"
5) если это диск с vfat или же это флоппик - добавляем в опции ",iocharset=cp1251,codepage=1251"
6) производим монтирование с поправленными опциями.

Побочный эффект:
1) на экран попадает отладочная информаци (можете сами закоментировать строки с echo ... | tee -a ...
2) после переустановки системы или обновления системы монтирования (что редко оооочень) нужно положить скрипт куда следует заново - смотри пункт А)
3) создаются симлинки в кириллице на автоматические точки монтирования с неправильной кодировкой. По извлечении диска симлинки становятся мертвыми.
Решение:
3.1) создаем файлик /bin/delsymlinks с правами на выполнение для всех.

#!/bin/bash
for link in $(find /media -type l); do test -e $link || rm $link ; done


3.2) идем в /etc/crontab и добавляем туда строку

*/1 * * * * root /bin/delsymlinks

3.3) выполняем от пользователя root перезагрузку шедулера:

service cron restart (по крайней мере в 11.1 оно так)

Все! После этого каждую минуту запускаемый скрипт проверяет папку /media/ на наличие мертвых симлинков и в случае обнаружения - удаляет их.
И более НИЧЕГО не нужно шаманить ни в каких fstab, hal и прочих,
потому как первое неудобно а второе вообще никак толком не работает.
Что касается версий окружения - будет работать везде, независимо от версии КДЕ, может даже и под ГНОМОМ, а какая ему разница?
Скажу только что в КДЕ 4.1 более недоступна функция просмотра опций монтирования для устройств, как было в 3.5.. там хоть можно было снять "монтировать в утф8".

А! и еще.. если что-то от руки не получается примонтировать по команде mount - выполяйте с консоли команду mount_true заместо mount.

Обсуждение ЗДЕСЬ