Меню пользователя
Имя пользователя
Пароль
Запомнить меня
Поиск по сайту
Вход пользователей
Пользователь:

Пароль:

Запомнить меня

Забыли пароль?

Регистрация
Поиск
Кто активен
6 пользователь(ей) активно (6 пользователь(ей) просматривают Open Форум)

Участников: 0
Гостей: 6

далее...
Уважаемые пользователи форума! Внимание!
Темы, озаглавленные бездумно и не ясно для кого, изобилующие БОЛЬШИМИ БУКВАМИ, "!!!" или "???", нарушающие правила, написанные корявым русским языком, содержащие оскорбления, рекламу или клевету, написанные вне тематических разделах Форума, - будут закрываться или удаляться без специального предупреждения, а их Авторы будут удаляться или отправляться в бан! Надеемся на вашу сознательность и уважение к себе и ко всем участникам форума.
:: Правила Форума :: - - :: ББ-коды для использования на форуме ::

Просмотр этой темы:   1 анонимных пользователей


 Вниз   Предыдущая тема   Следующая тема  Зарегистрируйтесь для создания



Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH

Зарегистрирован:
20/8/2008 9:35
Из: АРК, Судак
Сообщений: 0
Уровень : NAN
HP : NAN / NAN
MP : NAN / NAN
EXP : NAN
Не в сети
Внимание всех, кто по разным причинам использует системную локаль отличную от UTF8!
Послу долгих ковыряний в сети и многодневных экспериментов удалось побороть проблему, которая имеется в КДЕ3, связанную с неправильным отображением присоединяемых устройств, а именно компакт и двд дисков, флешек и дискет. На счет внешних винчестеров - не гарантирую, тут все очень неавтоматически, но вполне может сказаться что и сработает!

В моей системе установлена локаль ru_RU.CP1251,
посему везде указываю для себя iocharset=cp1251. Для других локалей прописывайте там свою!

1) идем в папку /bin и создаем там подпапку /trying.
переносим файл /bin/mount в нее, то есть будет теперь /bin/trying/mount

2) создаем в /bin обработчик монтирования для флешек:
текстовый файл /bin/mount

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
additional_options=",iocharset=cp1251,codepage=1251"
echo $*
# Use correction
vfat=0
# Result Message (was used for debuging)
message=""
# Maximum parameters count
Num=0
# Filling the array of input parameters
for input_param in $*
do
let "Num++" # Increment Num
params[$Num]=$input_param
done
# Main checking cycle (check mount input parameters)
for ((i=1; i <= Num ; i++))
do
# Checking if FS type specified
if [ ${params[$i]} = "-t" ]; then
if [ ${params[$i+1]} = "vfat" ]; then
let "vfat = 1"
let "i++"
message=$message"Found FSType VFAT"
fi
# Checking if Mounting Options specified
elif [ ${params[$i]} = "-o" ]; then
let "i++" # go to the next parameter (mount options themself)
params[$i]=${params[$i]}"$additional_options" # update mount options
fi
done
# This part makes mounting with additional parameters or with standard parameters depending
# on filesystem type
if [ $vfat -eq 1 ]; then
# Filling new mount options
parameters=""
for (( i=1; i <= Num; i++ ))
do
parameters=$parameters"${params[$i]} "
done
# mount
/bin/trying/mount $parameters
else
/bin/mount_sr0 $*
fi
echo $parameters

3) аналогично далее для cd-rom (если монтируется по имени sr0)
текстовый файл /bin/mount_sr0

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
additional_options=",iocharset=cp1251"
echo $*
# Use correction
vfat=0
# Result Message (was used for debuging)
message=""
# Maximum parameters count
Num=0
# Filling the array of input parameters
for input_param in $*
do
let "Num++" # Increment Num
params[$Num]=$input_param
done

# Main checking cycle (check mount input parameters)
for ((i=1; i <= Num ; i++))
do
# Checking if FS type specified
if [ ${params[$i]} = "/dev/sr0" ]; then
if [ ${params[$i]} = "/dev/sr0" ]; then
let "vfat = 1"
let "i++"
message=$message"Found FSType CDROM"
fi
# Checking if Mounting Options specified
elif [ ${params[$i]} = "-o" ]; then
let "i++" # go to the next parameter (mount options themself)
params[$i]=${params[$i]}"$additional_options" # update mount options
fi
done

# This part makes mounting with additional parameters or with standard parameters depending
# on filesystem type
if [ $vfat -eq 1 ]; then
# Filling new mount options
parameters=""
for (( i=1; i <= Num; i++ ))
do
parameters=$parameters"${params[$i]} "
done
# mount
/bin/trying/mount $parameters
else
/bin/mount_cdrom $*
fi
echo $parameters

4) аналогично далее для cd-rom (если монтируется по имени cdrom)
текстовый файл /bin/mount_cdrom

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
additional_options=",iocharset=cp1251"
echo $*
# Use correction
vfat=0
# Result Message (was used for debuging)
message=""
# Maximum parameters count
Num=0
# Filling the array of input parameters
for input_param in $*
do
let "Num++" # Increment Num
params[$Num]=$input_param
done

# Main checking cycle (check mount input parameters)
for ((i=1; i <= Num ; i++))
do
# Checking if FS type specified
if [ ${params[$i]} = "/dev/cdrom" ]; then
if [ ${params[$i]} = "/dev/cdrom" ]; then
let "vfat = 1"
let "i++"
message=$message"Found FSType CDROM"
fi
# Checking if Mounting Options specified
elif [ ${params[$i]} = "-o" ]; then
let "i++" # go to the next parameter (mount options themself)
params[$i]=${params[$i]}"$additional_options" # update mount options
fi
done

# This part makes mounting with additional parameters or with standard parameters depending
# on filesystem type
if [ $vfat -eq 1 ]; then
# Filling new mount options
parameters=""
for (( i=1; i <= Num; i++ ))
do
parameters=$parameters"${params[$i]} "
done
# mount
/bin/trying/mount $parameters
else
/bin/mount_fd0 $*
fi
echo $parameters

5) аналогично для дисковода (имя /dev/fd0)
текстовый файл /bin/mount_fd0

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
additional_options=",iocharset=cp1251"
echo $*
# Use correction
vfat=0
# Result Message (was used for debuging)
message=""
# Maximum parameters count
Num=0
# Filling the array of input parameters
for input_param in $*
do
let "Num++" # Increment Num
params[$Num]=$input_param
done

# Main checking cycle (check mount input parameters)
for ((i=1; i <= Num ; i++))
do
# Checking if FS type specified
if [ ${params[$i]} = "/dev/fd0" ]; then
if [ ${params[$i]} = "/dev/fd0" ]; then
let "vfat = 1"
let "i++"
message=$message"Found FSType FLOPPY"
fi
# Checking if Mounting Options specified
elif [ ${params[$i]} = "-o" ]; then
let "i++" # go to the next parameter (mount options themself)
params[$i]=${params[$i]}"$additional_options" # update mount options
fi
done

# This part makes mounting with additional parameters or with standard parameters depending
# on filesystem type
if [ $vfat -eq 1 ]; then
# Filling new mount options
parameters=""
for (( i=1; i <= Num; i++ ))
do
parameters=$parameters"${params[$i]} "
done
# mount
/bin/trying/mount $parameters
else
/bin/trying/mount $*
fi
echo $parameters


всем этим файлам нужно присовить владельца root:root
и дать права на выполнение для всех и запись только для рута, остальным на чтение

как видно эти скриптовые файлики ссылаются друг на друга, то есть при вызове команды mount идет проверка параметров по цепочке - сначала для устройств с явно указаной системой vfat (флешки и разделы винчестера), затем оптические устройства по имени вначале для sr0 (для opensuse 11.0 - дефолтное имя в HAL) затем по имени cdrom, а затем для флоппи привода (дисковода).

Естественно расчитано это все только на то, что приводов по одной штуке в системе, то есть еслли несколько дисководов или оптических приводов - естественно нужно расширять скрипты.

После того как эти файлы созданы и им назначены соответствующие права - работает все на ура!

ЕДИНСТВЕННОЕ УСЛОВИЕ: при первом использовании устройства нужно в конквероре правой кнопкой мыши вызвать свойства тома, найти опции монтирования и убрать галочку с "монтировать в UTF8" - только после этого имена будут показываться правильно.
Для умников: Без скриптов эта галочка до одного места, так как КДЕ плевать хотел на то, что если не используется УТФ8, то по логике нужно прописать -o iocharset=<locale> . Если бы он это делал все работало бы искаропки, как говорится.

Теперь просьба: товарищи, которые сильны в написании bash-скриптов и их отладке! Пожалуйства, оптимизируйте эти скрипты по возможности до одного файла с интуитивно понятным описанием внутри, а то я как-бы понять могу, но сам исправить - не шарю

Отправлено: 27/11/2008 18:24

Отредактировано пользователем SwitNJ 27/11/2008 18:45:34
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH
Web-мастер
Зарегистрирован:
13/3/2008 21:03
Из: open-suse.ru
Сообщений: 1
Уровень : 1
HP : 0 / 0
MP : 0 / 0
EXP : 0
Не в сети
в статьи надо бы ло забацать, если это уже основной варинат решения, а здесь оставить ветку как обсуждение статьи.
Сделать?

Отправлено: 28/11/2008 7:13
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH

Зарегистрирован:
20/8/2008 9:35
Из: АРК, Судак
Сообщений: 0
Уровень : NAN
HP : NAN / NAN
MP : NAN / NAN
EXP : NAN
Не в сети
в статью рано, ибо решение что называется очень сырое, хоть и работоспособное.
Товарищ AX на linux.org.ru подсказывает что скрипт можно сделать намного проще при помощи регэкспов, но я в этом деле не соображаю. Если он откликнется и поможет доделать дкрипт, то я бы вообще хотел статейку общую выложить о настройке машин под опенсусе на локаль 1251 (для сращивания с виндовым окружением, включая сеть). У меня лично это больная тема, ибо в корпорации таких машинок много. Можно сказать, что с этим скриптом завершился бы большой этап по интеграции...

Отправлено: 28/11/2008 15:53
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH
Web-мастер
Зарегистрирован:
13/3/2008 21:03
Из: open-suse.ru
Сообщений: 1
Уровень : 1
HP : 0 / 0
MP : 0 / 0
EXP : 0
Не в сети
ну ладно тогда, подождем немного, а как прояснится дайте знать, опубликуем обязательно ну и естессна желаю успехов и чтобы все получилось как хотелось

Отправлено: 29/11/2008 17:11
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH

Зарегистрирован:
20/8/2008 9:35
Из: АРК, Судак
Сообщений: 0
Уровень : NAN
HP : NAN / NAN
MP : NAN / NAN
EXP : NAN
Не в сети
Итак.. окончательный результат.
Вроде бы все работает.
Проверялось на флешках, на оптических носителях (на дискетах к сожалению не успел (но проверял до этого в 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.

Отправлено: 15/12/2008 15:59
_________________
стиль жизни
"эксперимент -> 3.14$дец -> чтение документации"
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH

Зарегистрирован:
3/12/2008 6:40
Из: Красноярск
Сообщений: 0
Уровень : NAN
HP : NAN / NAN
MP : NAN / NAN
EXP : NAN
Не в сети
Простите за банальность, это проблема всех пользователей кед касается? Сколько пользовался не замечал проблем с кодировкой на носителях, только на ресурсах сети(SMB, ftp...), по дефолту в кедах стоит cp1251.

Отправлено: 15/12/2008 17:34
_________________
openSUSE 11.2(x86) || Linux 2.6.31 || KDE 4.4

AMD Sempron(tm) 2600+ || RAM 1.5 Gb || ATI Radeon 9600


Было бы сказано, а забыть успеем
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH

Зарегистрирован:
20/8/2008 9:35
Из: АРК, Судак
Сообщений: 0
Уровень : NAN
HP : NAN / NAN
MP : NAN / NAN
EXP : NAN
Не в сети
вам наверное просто повезло, в отличии от моих 30 машинок начиная от 10.3 и до 11.1 включительно :)
есть разница между прописать локаль для отдельной программы и локаль для всей системы. у меня последний случай. когда кде работает под утф8 - никаких проблем и в самом деле нету.
Что касается среды выполнения - всех КДЕ поголовно. В гноме вроде бы есть свой монтировщик, но я не любитель гнома и ничего про него сказать не могу, за исключением того что у него все настройки раскиданы нелогично и их через зад делать надо.

Отправлено: 15/12/2008 17:45
_________________
стиль жизни
"эксперимент -> 3.14$дец -> чтение документации"
Перенести сообщение в другую программу Трансфер


Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH

Зарегистрирован:
3/12/2008 6:40
Из: Красноярск
Сообщений: 0
Уровень : NAN
HP : NAN / NAN
MP : NAN / NAN
EXP : NAN
Не в сети
SwitNJ в любом случае, огромное Вам спасибо за проделанную работу!

Отправлено: 15/12/2008 17:56
_________________
openSUSE 11.2(x86) || Linux 2.6.31 || KDE 4.4

AMD Sempron(tm) 2600+ || RAM 1.5 Gb || ATI Radeon 9600


Было бы сказано, а забыть успеем
Перенести сообщение в другую программу Трансфер



 Наверх   Предыдущая тема   Следующая тема

 Зарегистрируйтесь для создания


Вы можете просматривать темы.
Вы не можете начинать темы.
Вы не можете отвечать в теме.
Вы не можете редактировать свои сообщения.
Вы не можете удалять свои сообщения.
Вы не можете создавать опросы.
Вы не можете голосовать.
Вы не можете прикреплять файлы к сообщениям.
Вы не можете писать без одобрения сообщений.

[Расширенный поиск]


open-suse.ru