четверг, 26 февраля 2009 г.

[solved] CIFS home vs KDE & OpenOffice

Тачка с Gentoo Linux включена в домен.
Домашние папки - примонтированные шары.

В начале kde'шной сессии получаем сообщение:


startkde: Call to lnusertemp failed (temporary directories full?). Check your installation.


Давайте же разберемся, почему такое происходит!
lnusertemp - прога, которая создает папки
/tmp/kde-$USER
/tmp/ksocket-$USER
/var/tmp/kdecache-$USER
и делает на них символические ссылки
$KDEHOME/tmp-$HOSTNAME
$KDEHOME/socket-$HOSTNAME
$KDEHOME/cache-$HOSTNAME

( $KDEHOME - это обычно ~/.kde или ~/.kde4 )

Тут мы видим две причины проблемы:
1. Не во всех дистрах users могут по дефолту писать в /var/tmp
2. Ну какие могут быть симлинки на шаре? ^_^

Замечу, что lnusertemp ничего не делает, если заранее создать папки
$KDEHOME/tmp-$HOSTNAME
$KDEHOME/socket-$HOSTNAME
$KDEHOME/cache-$HOSTNAME
- и кеды успешно запускаются... но временные файлы на шаре - это ... кхм... немного медленно ^_^

Что ж, напишем свою замену lnusertemp'у: хоть cifs и не понимает симлинков (а ntfs-то, кстати, понимает!), перед "mount -obind" он не устоит ^_^

Создадим где-нибудь файлик bindusertemp и напишем в нем:


#!/bin/bash

host=$( hostname )
user=$1

for target in "tmp" "cache" "socket";
do
umount ~/.kde4/$target-$host
rm -rf ~/.kde4/$target-$host
mkdir ~/.kde4/$target-$host
chown -R $user ~/.kde4/$target-$host
rm -rf /tmp/k$target-$user
mkdir /tmp/k$target-$user
chown -R $user /tmp/k$target-$user
mount -obind /tmp/k$target-$user ~/.kde4/$target-$host
done


Строчку host= $( hostname ) я добавил потому, что в переменной окружения HOSTNAME у меня нету постфикса с доменом.

Что побиндили, то надо бы когда-нибудь и разбиндить!

Пишем в unbindusertemp:


#!/bin/bash

host=$( hostname )
user=$1

for target in "tmp" "cache" "socket";
do
umount ~/.kde4/$target-$host
rm -rf ~/.kde4/$target-$host
rm -rf /tmp/k$target-$user
done




Эти файлы надо запускать от имени рута. Для подобных случаев мудрецы древности придумали suid-бит в правах файла... но потом стали еще мудрее и написали sudo ^_^.
Добавим в /etc/sudoers две новые строчки:

ALL ALL = NOPASSWD: /абсолютный путь/bindusertemp
ALL ALL = NOPASSWD: /абсолютный путь/unbindusertemp



Теперь пришла пора модифицировать скрипт startkde.

До запуска lnusertemp (Но после создание kdehome!) пишем

sudo /root/bin/bindusertemp $USER

А в конце скрипта добавим

sudo /root/bin/unbindusertemp $USER

Все строчки, связанные с lnusertemp можно просто закомментировать (а можно и не комментировать - ничего не изменится ^_^ )


Вуа-ля! Теперь кеды работают с хоумом-шарой.



А не возниклет ли подобных проблем с другими приложениями? Еще как возникнет!
В первую очередь глючит OpenOffice: он пишет, что не может создать lockfile.
Это лечится проще и без ковыряния в недрах: дом надо просто-напросто монтировать с опцией nobrl.
Еслы хоумы подключаются при помощи модуля pam-mount, то отвечающая за них часть в /etc/security/pam_mount.conf.xml будет выглядеть примерно так:


<volume
user="*"
fstype="cifs"
server="csfs"
path="home$/%(USER)"
mountpoint="~"
options="rw,workgroup=CS,iocharset=utf8,
codepage=cp866,sec=ntlmv2,nobrl"
/>


эх... не у мею я писать гайды :] .. но мож кому и поможет ^_^

1 комментарий: