Посмотрел приведенные конфиги, у меня все это не работает. Заглянул в исходники hal-0.5.8.1, нашел единственный способ указать параметр iocharset - вызывающее приложение может его передать через stdin. Из конфига он вообще не читается. Отсюда два пути решения - вписать код, который будет читать из конфига или в коде указать отдельные параметры для монтирования vfat. Я пошел по второму пути. Моя системная кодировка cp1251 (define MOUNT_OPTIONS_VFAT "noexec,nosuid,iocharset=cp1251"). Теперь кодировка правильно выставляется для флэшек и усб-винтов. Если кому нужно, могу прислать пересобранный hal-storage-mount или hal_0.5.8.1-4_i386.deb. В syslog теперь пишутся параметры монтирования всех устройств, так оно поприятнее отлаживать.
Через конфиг отключим параметр utf8 (иначе iocharset будет проигнорирован). Параметр dmask= отключил, чтобы примонтированный винт сразу же был доступен на запись. /etc/hal/fdi/policy/01-charset.fdi <?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2"> <device> <match key="volume.fstype" string="vfat"> <remove key="volume.mount.valid_options" type="strlist">utf8</remove> <remove key="volume.mount.valid_options" type="strlist">fmask</remove> <remove key="volume.mount.valid_options" type="strlist">dmask=</remove> </match> </device> </deviceinfo> Пропатчим hal. --- hal-0.5.8/tools/hal-storage-mount.c 2006-09-20 00:23:25.000000000 +0400 +++ hal-0.5.8/tools/hal-storage-mount.c 2006-12-20 09:27:53.000000000 +0300 @@ -60,13 +60,16 @@ #ifdef __FreeBSD__ #define MOUNT "/sbin/mount" #define MOUNT_OPTIONS "noexec,nosuid" +#define MOUNT_OPTIONS_VFAT "noexec,nosuid,iocharset=cp1251" #define MOUNT_TYPE_OPT "-t" #elif sun #define MOUNT "/sbin/mount" #define MOUNT_OPTIONS "noexec,nosuid" +#define MOUNT_OPTIONS_VFAT "noexec,nosuid,iocharset=cp1251" #define MOUNT_TYPE_OPT "-F" #else #define MOUNT "/bin/mount" #define MOUNT_OPTIONS "noexec,nosuid,nodev" +#define MOUNT_OPTIONS_VFAT "noexec,nosuid,nodev,iocharset=cp1251" #define MOUNT_TYPE_OPT "-t" #endif --- hal-0.5.8/tools/hal-storage-mount.c 2006-09-20 00:23:25.000000000 +0400 +++ hal-0.5.8/tools/hal-storage-mount.c 2006-12-20 09:27:53.000000000 +0300 @@ -820,6 +820,17 @@ args[na++] = "-o"; mount_option_str = g_string_new (MOUNT_OPTIONS); + mount_option_str = g_string_new (MOUNT_OPTIONS_VFAT); + if (strlen (mount_fstype) > 0) + { + if (strcmp (mount_fstype, "vfat") != 0) + mount_option_str = g_string_new (MOUNT_OPTIONS); + } + else + { + if (libhal_volume_get_fstype (volume) != NULL && strcmp (libhal_volume_get_fstype (volume), "vfat") != 0) + mount_option_str = g_string_new (MOUNT_OPTIONS); + } for (i = 0; given_options[i] != NULL; i++) { g_string_append (mount_option_str, ","); g_string_append (mount_option_str, given_options[i]); --- hal-0.5.8/tools/hal-storage-mount.c 2006-09-20 00:23:25.000000000 +0400 +++ hal-0.5.8/tools/hal-storage-mount.c 2006-12-20 09:27:53.000000000 +0300 @@ -910,6 +910,9 @@ if (fwrite (hal_mtab_buf, 1, strlen (hal_mtab_buf), hal_mtab) != strlen (hal_mtab_buf)) { unknown_error ("Cannot write to /media/.hal-mtab~"); } + openlog ("hald", 0, LOG_DAEMON); + syslog (LOG_INFO, "=write to /media/.hal-mtab~ line '%s'=", hal_mtab_buf); + closelog (); fclose (hal_mtab); g_free (hal_mtab_buf); g_free (mount_dir_escaped);