google web font

воскресенье, 15 августа 2010 г.

Монтируем флэшку с опцией shortname=lower

SOLID — гибкий, как скала.
И такой же настраиваемый.
Я бы тоже подумал: "Что за фигня, о чём тут можно вообще рассуждать? Берём и монтируем!". Однако же, не берём и монтируем, а если у нас KDE-4 и его автомонтирование, то мы долго и усердно сношаем мозг. Причём вполне успешно.

Для затравки объясню суть проблемы. У нас есть SD-флэшка, которая используется фотоаппаратом по прямому назначению. При этом форматировать её может только сам фотоаппарат, иначе он не хочет её использовать. Никакой метки (LABEL) для файловой системы фотоаппарат не ставит, UUID тоже получается интересный: 0000-0001. Файлы пишет с именами в формате 8.3, длинные имена не использует. Проблема в том, что раньше, в третьих кедах, эта флэшка монтировалась с именами в нижнем регистре, а сейчас в четвёртых — имена в верхнем регистре. Это привело к повтору фотографий и некоторым проблемам с синхронизацией. В общем, надо сделать, чтобы монтировалось с именами в нижнем регистре, для этого нужно в опции монтирования добавить параметр shortname=lower.


Сначала кратко перескажу путь самурая. Перво-наперво мы понимаем, что сегодня в линуксе для монтирования съёмных накопителей используется HAL. Это значит, что все параметры, которые связаны с этим действом, должны храниться где-то в его настройках, это fdi-файлы. Находим нужный, смотрим что надо — ничего не помогает. Короче, в этих файлах хранится список допустимых опций, а какие из них использовать — зависит от программы, их использующей. shortname является допустимой, но кедовый монтировщик нас не спрашивает, какое значение мы хотим использовать, он ставит mixed и доволен.
Ищем обходные пути: pmount. Оказывается, этот зверь делает то же самое: ставит mixed и никак не настраивается. Понимая, что истина где-то рядом, гуглим до посинения. Выясняется, что настраивается это только в гномьем автомаунтере, для этого есть какая-то тулза, которая пишет всё, что надо, в гномий реестр и является страшной, как смерть линуксоида. Если бы не краткий пересказ, то читателя тоже в этом месте охватило бы отчаяние, подобное тому, которое меня придавило, когда я сегодня снова унюхал знакомый запах дыма торфянников.
Но на самом деле плакать рано, есть же ещё fstab. То есть на высоком уровне "линукс для десктопа" сделать ничего не получилось, ни красиво, ни не очень красиво, поэтому придётся спуститься на более низкий уровень и сделать красиво тут. fstab означает, что папку для конкретно этой флэшки нужно создать заранее и не удалять её, кроме того, есть ещё несколько недостатков. Но на самом деле тут тоже всё просто: UUID в fstab'е кедовый монтировщик не понимает, LABEL на fs отсуствует, прописывать путь к устройству не канает, потому что он может (и будет) меняться. fstab отпадает.

Спускаемся на самый низкий уровень, ни о каком юзабилити речь уже не идёт. В конце концов, мы же линуксоиды, а не виндоюзеры какие-нибудь, нам важно в потрохах поковыряться, а если при этом ещё и результата достигнуть — так вообще считай повезло. В общем, самый простой путь, как оказалось, — пропатчить нафиг pmount и kdelibs. Изменить надо всего одну строчку, вот патчи:
pmount
--- src/fs.c 2009-09-15 00:54:54.000000000 +0400
+++ src/fs.c 2010-08-15 00:51:59.000000000 +0400
@@ -21,7 +21,7 @@
static struct FS supported_fs[] = {
{ "udf", "nosuid,nodev,user", 1, "000", ",iocharset=%s" },
{ "iso9660", "nosuid,nodev,user", 1, NULL, ",iocharset=%s" },
-    { "vfat", "nosuid,nodev,user,quiet,shortname=mixed", 1, "077", 
+    { "vfat", "nosuid,nodev,user,quiet,shortname=lower", 1, "077", 
",iocharset=%s",",fmask=%04o,dmask=%04o"},
{ "hfsplus", "nosuid,nodev,user", 1, NULL, 0 },
{ "hfs", "nosuid,nodev,user", 1, "077", NULL, 
kdelibs
--- solid/solid/backends/hal/halstorageaccess.cpp.orig 2010-08-15 01:41:17.000000000 +0400
+++ solid/solid/backends/hal/halstorageaccess.cpp 2010-08-15 01:41:27.000000000 +0400
@@ -332,7 +332,7 @@
         else if (halOptions.contains("iocharset="))
             options<<"iocharset=utf8";
         if (halOptions.contains("shortname="))
-            options<<"shortname=mixed";
+            options<<"shortname=lower";
         if (halOptions.contains("flush"))
             options<<"flush";
     }

Счастливые обладатели LFS просто применяют патчи. Гентушники кладут pmount и kdelibs в оверлей /usr/local/portage, подкладывают патчи в соответствующие каталоги files, прописывают эти патчи в ебилды, не забывают сделать ebuild {} digest и переконпеляют pmount и kdelibs. Пользователи бинарных дистров шлют эти патчи в багзиллы своих дистров.

P.S. патчи выложены только для ознакомления, любая попытка скопипастить патч закончится фейлом. © все права сохранены. На самом деле, мне просто лень замарачиваться с оформлением, может, и сработают, если скопипастить.

P.P.S. Лично мне кстати, исправление kdelibs не помогло, потому что они у меня по каким-то причинам вообще не добавляют эту опцию при монтировании. Так что я конечном итоге я прописал в fstab по имени устройства.

Комментариев нет:

Отправить комментарий