Note: This info is outdated.
Внимание: Эта информация устарела.
Пересадил жену из Гнома в КДЕ (3.5). В первую очередь из-за убожества под названием Наутилус, который используется в Гноме в качестве файл-менеджера.
Ну и столкнулся во всей красе со странными опциями монтирования при монтировании флешек из конкверора.
Итак, для монтирования используется hal. Hal, в общем-то, настроен так, чтобы vfat монтировался с iocharset=,codepage=:
gq@vice:~$ cat /etc/hal/fdi/policy/codepage.fdi <?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2"> <device> <match key="volume.fstype" string="vfat"> <merge key="volume.policy.mount_option.utf8" type="bool">false</merge> <merge key="volume.policy.mount_option.iocharset=koi8-r" type="bool">true</merge> <merge key="volume.policy.mount_option.codepage=866" type="bool">true</merge> </match> </device> </deviceinfo>
И pmount-hal монтируется все правильно:
gq@vice:~$ PMOUNT_DEBUG=1 pmount-hal `hal-find-by-property --key volume.fstype --string vfat` drive: /org/freedesktop/Hal/devices/storage_serial_JetFlash_TS1GJF2B_6110074164F2F66B volume: /org/freedesktop/Hal/devices/volume_uuid_4CEA_FA17 device: /dev/sdd1 label: JETFLASH fstype: vfat options: codepage=866,iocharset=koi8-r umask: (null) spawnv(): executing pmount 'pmount' '-t' 'vfat' '-c' 'koi8-r' '/dev/sdd1' 'JETFLASH' spawn(): pmount terminated with status 0
Но вот KDE на это сильно наплевать, он монтирует с непонятно откуда берущимися опциями:
gq@vice:~$ mount | grep JETFLASH /dev/sdd1 on /media/JETFLASH type vfat (rw,noexec,nosuid,nodev,noatime,uid=1000,utf8,shortname=lower)
Начал отлаживать. Konqueror вызывает kio_media_mounthelper. Этот бинарник поставляется пакетом kdebase-kio-plugins. Скачал исходники. Оказалось и впраду, при монтировании KDE не смотрит на volume.policy.mount_option, а параметры там берутся из настроек, которые доступны по правой кнопке мыши на сменном носителе. Вот только возможности глобальной настройки там нету, а даже если бы и была – там нет возможности задать codepage и iocharset.
Такая вот фигня. В принципе я понимаю, почему они используют свой механизм задания опций – хочется тотального гуя, но все же, игнорировать настройки hal, это как-то не комильфо.
Рисую патч.
Upd: оказывается там все еще запутанней. volume.policy.mount_option вроде как deprecated =\ Написал в список рассылки hal – посмотрим, что они скажут, и, в случае чего, это будет временный патч, “чтобы русский работал”.
Баг на тему в багтрекере КДЕ: http://bugs.kde.org/show_bug.cgi?id=133456
В списке рассылки пока молчат =\.
Upd2: Нарисовал патч.
Сегодня с удивлением обнаружил этот же эффект.. Сначала думал, что это недостаток реализации именно в KDE на FreeBSD. Не могли бы вы держать меня в курсе данной ситуации?
Заранее благодарен!
—
Jay
Я в этой записе напишу если какие новости будут. В конец добавил ссылку на баг в KDE.
Патч написал.
Если не трудно – отправьте мне на мыл.. а то обратно на fstab + kwikdisk переходить не прет совершенно..
—
Jay
Смотри следующую запись в блоге.
А для 3.5.6 патч будет?
А он на нее разве не накладывается? я внимательно не смотрел, но мне казалось, что должно – там почти никаких изменений не было. На всякий случай – патч относительно 3.5.5a
А я сделал так:
Создал три файла (media_mount_cd.desktop, media_mount_disk.desktop и media_mount_floppy.desktop) в кодировке utf8 и поместил их в /opt/kde3/share/apps/konqueror/servicemenus/
Содержимое файлов:
— media_mount_cd.desktop —
[Desktop Action Монтировать в кириллице]
Exec=kio_media_mounthelper -u %u; mkdir /media/cd; mount /dev/hdc /media/cd -o iocharset=cp1251; konqueror %u
Icon=cdrom_mount
Name=Монтировать в кириллице
[Desktop Entry]
Actions=Монтировать в кириллице
ServiceTypes=media/cdrom_unmounted,media/cdwriter_unmounted,media/dvd_unmounted
— media_mount_disk.desktop —
[Desktop Action Монтировать в кириллице]
Exec=kio_media_mounthelper -u %u; mkdir /media/disk; mount /dev/sda1 /media/disk -o iocharset=cp1251; mount /dev/sdb1 /media/disk -o iocharset=cp1251; konqueror %u
Icon=usbpendrive_mount
Name=Монтировать в кириллице
[Desktop Entry]
Actions=Монтировать в кириллице
ServiceTypes=media/removable_unmounted,media/camera_unmounted
— media_mount_floppy.desktop —
[Desktop Action Монтировать в кириллице]
Exec=kio_media_mounthelper -u %u; mkdir /media/floppy; mount /dev/fd0 /media/floppy -o iocharset=cp1251; konqueror %u
Icon=3floppy_mount
Name=Монтировать в кириллице
[Desktop Entry]
Actions=Монтировать в кириллице
ServiceTypes=media/floppy5_unmounted,media/floppy_unmounted
Теперь при монтировании достаточно выбрать в меню “Монтировать в кириллице” и всё OK.
PS. Система OpenSUSE 10.2, системная кодировка CP1251. Если у Вас другая система или кодировка, то отредактируйте эти файлы.
И что будет, когда ты воткнешь флэшку без таблицы разделов? Или когда воткнешь 3 флэшки? Или когда подключишь читалку всяких SD CompactFlash и т.п.
В общем это костыли. Правильный способ – это все-таки HAL.
Люди добрые, подскажите. Установил SLackware Linux 12, с ним идет HAL 0.5.9, KDE 3.5.7.
версии софта новее, а проблема такаяже
на сколько я понимаю у меня HAL более новый, на сколько он совместим с этим патчем? как лутше поступить? если я пересоберу ядро с указанием кодировок, это поможет?
У меня все работает (KDE 3.5.7, HAL 0.5.9.1).
Хм… странно, а какая у тебя конфигурация?
у меня Слака, 12ая, я ее руссифицировал (во всяком случае мне так кажется:)
локаля поставил KOI8-R
проблем с русским в другом софте не наблюдалось
(нет, были пляски с бубном в сетевых ресурсах самба, но man libsmbclient спас)
а вот кодировки в автомонтировании победить я так и не смог, в итоге пересоьрал ядро где явно указал 866 для фата и кои8р для локали
обе проблемы я описал у себя в блоге
http://skonev.blogspot.com/2007/08/salckware-linux-12-kde.html
посмотри пожлауйста, может я в чемто не прав, подскажешь?
Всё работает – в смысле патч накладывается. Кстати пересобирать надо не весь кде, а только kdebase.
эх, бинарничек бы мне для слакваря 12 …
Эх, никто не собрал? попробую сам на выходных, в этом деле новичек
вот был бы тебе признателен, а то самому уж больно неохота возиться, хоть режь. Кстати, в идеале такой пакет пропатченый хорошо бы закинуть куда-нибудь типа linuxpackages.net . Но это я уж размечтался 🙂
Я сейчас веду неравный бой в слаке со своей видеокартой, если к выходным спарвлюсь, на выходных пакет соберу, ну я тут еще отпишусь по ходу событий
Столкнулся с такой же проблемой, когда решил в своем Дебиане сделать локаль ru_RU.KOI8-R.
Короче, попарился денек и скриптик сворганил.
Для тех, кому лень заниматься пропатчиванием KDE, думаю данный скриптик будет в самый раз. Он практически ничем не ограничивает (по крайней мере, я не нашел такого извратного способа монтирования, при котором получил бы отказ).
Итак, при монтировании независимо от того, через хал мы монтируем или через другое “место”, все-равно юзается бинарник /bin/mount, куда посылаются параметры монтирования.
Предлагаю создать папку /bin/trying и переместить данный бинарник туда, а вместо него в папке /bin создать исполяемый скриптик с именем mount следующего содержания:
#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need :)
# Additional mounting options (cyrillic correction)
additional_options=",iocharset=koi8-r,codepage=866"
# 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 (additional mount options ON). "
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
Удачного вам монтирования 😉
У меня отлично работает без патчей.
да, чуть не забыл, чтоб это работало, надо перед монтированием флешки убрать галочку в опциях “кодировка UTF-8”. Это можно сделать, нажав правой кнопкой мыши на устройстве (в system:/media/) и выбрав “Свойства”, а далее вкладку “Монтирование”
А вот это уже зло.
Да и скрипт не маленький и не тривиальный, в отличие от патча. И нарушает пакетную систему. =\
Зато не требуется кеды компилить и ставить заново.
Я ж не заставляю его юзать, это просто вариант решения проблемы 😉
PS: Сделанное своими руками для удовлетворения собственных потребностей злом не считаю 🙂