KDE, монтирование дисков, кодировка

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: Нарисовал патч.

22 thoughts on “KDE, монтирование дисков, кодировка”

  1. Сегодня с удивлением обнаружил этот же эффект.. Сначала думал, что это недостаток реализации именно в KDE на FreeBSD. Не могли бы вы держать меня в курсе данной ситуации?
    Заранее благодарен!

    Jay

    1. Я в этой записе напишу если какие новости будут. В конец добавил ссылку на баг в KDE.

      1. Если не трудно – отправьте мне на мыл.. а то обратно на fstab + kwikdisk переходить не прет совершенно..

        Jay

    1. А он на нее разве не накладывается? я внимательно не смотрел, но мне казалось, что должно – там почти никаких изменений не было. На всякий случай – патч относительно 3.5.5a

  2. А я сделал так:
    Создал три файла (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. Если у Вас другая система или кодировка, то отредактируйте эти файлы.

    1. И что будет, когда ты воткнешь флэшку без таблицы разделов? Или когда воткнешь 3 флэшки? Или когда подключишь читалку всяких SD CompactFlash и т.п.
      В общем это костыли. Правильный способ – это все-таки HAL.

  3. Люди добрые, подскажите. Установил SLackware Linux 12, с ним идет HAL 0.5.9, KDE 3.5.7.
    версии софта новее, а проблема такаяже
    на сколько я понимаю у меня HAL более новый, на сколько он совместим с этим патчем? как лутше поступить? если я пересоберу ядро с указанием кодировок, это поможет?

  4. Хм… странно, а какая у тебя конфигурация?
    у меня Слака, 12ая, я ее руссифицировал (во всяком случае мне так кажется:)
    локаля поставил KOI8-R
    проблем с русским в другом софте не наблюдалось
    (нет, были пляски с бубном в сетевых ресурсах самба, но man libsmbclient спас)
    а вот кодировки в автомонтировании победить я так и не смог, в итоге пересоьрал ядро где явно указал 866 для фата и кои8р для локали
    обе проблемы я описал у себя в блоге
    http://skonev.blogspot.com/2007/08/salckware-linux-12-kde.html
    посмотри пожлауйста, может я в чемто не прав, подскажешь?

    1. Всё работает – в смысле патч накладывается. Кстати пересобирать надо не весь кде, а только kdebase.

    1. Эх, никто не собрал? попробую сам на выходных, в этом деле новичек

      1. вот был бы тебе признателен, а то самому уж больно неохота возиться, хоть режь. Кстати, в идеале такой пакет пропатченый хорошо бы закинуть куда-нибудь типа linuxpackages.net . Но это я уж размечтался 🙂

  5. Я сейчас веду неравный бой в слаке со своей видеокартой, если к выходным спарвлюсь, на выходных пакет соберу, ну я тут еще отпишусь по ходу событий

  6. Столкнулся с такой же проблемой, когда решил в своем Дебиане сделать локаль 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

    Удачного вам монтирования 😉
    У меня отлично работает без патчей.

  7. да, чуть не забыл, чтоб это работало, надо перед монтированием флешки убрать галочку в опциях “кодировка UTF-8”. Это можно сделать, нажав правой кнопкой мыши на устройстве (в system:/media/) и выбрав “Свойства”, а далее вкладку “Монтирование”

    1. А вот это уже зло.
      Да и скрипт не маленький и не тривиальный, в отличие от патча. И нарушает пакетную систему. =\

      1. Зато не требуется кеды компилить и ставить заново.
        Я ж не заставляю его юзать, это просто вариант решения проблемы 😉
        PS: Сделанное своими руками для удовлетворения собственных потребностей злом не считаю 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *