わらばんし仄聞記

南の国で引きこもってるWeb屋さん

KDMでのログインが出来ない

openSUSE12.2がリリースされたので、手元にある12.1のマシンをアップデートしてみた。
更新終わってから再起動したら、どうもうまくログイン出来なくなってしまったので、その時の状況と解消までのメモ。

状況

KDMのログインマネージャから、パスワードを入力してログイン。無事にログイン成功して処理が進んだように見えるが、少しするとまたログイン画面に戻ってきてしまう。
パスワードの入力を誤ったかとも思ったが、意図的に間違ったパスワードを入力するとログイン失敗した旨のメッセージがでてくるので、パスワードに問題があったわけでは無さそう。だがログイン出来ない。

調査

Xの起動に問題があるのか?

ログイン画面からctrl+alt+F1でテキストモードへ移動。
問題の、KDMからログイン出来ないユーザーで入り、startxを実行してみる。

$ startx

 ---------------------------------------------------------------------------
xauth:   file  /home/warabanshi/.serverauth1234 does not exist

Fatal server error:
cannot move old log file "/var/log/Xporg.0.log" to "var/log/Xorg.0.log.old"

xinit server error
 ---------------------------------------------------------------------------
and drops me back to the prompt. Then I get some info that says:

"xinit failed. /usr/bin/Xorg is not set uid" (could this be the problem?)
"if so either use a display manager or adjust /etc/permissions.local"

これについては/usr/bin/Xorgの実行権限が足りない模様。
なので、ひとまずrootユーザーでstartxを試してみたら無事にXが起動。続いて、

# chmod 4755 /usr/bin/Xorg

としてスティッキービットを付けてから一般ユーザーでstartxを試してみたら、これも無事に起動。
これで大丈夫かなーと思って、この状態で再起動。KDMからログインを試してみたけど状況は改善されず。KDMからログインするのとCLIからstartxするのは色々扱いが違うんですね・・・。

KDMからとstartxでは何が違うのか?

こちらをちょっと見てみると、どうもstartxはxinitのwrapperのようで。

どうしたものか・・・

さて、ここでKDMからログインしようとしていたユーザーのホームディレクトリを見て、ログイン処理毎に更新されているファイルを探してみると.xsession-errorsなるファイルが。中身には

/etc/X11/xim: Checking whether an input method should be started.
sourcing /etc/sysconfig/language to get the value of INPUT_METHOD
INPUT_METHOD is not set or empty (no user selected input method).
Trying to start a default input method for the locale en_US.UTF-8 ...
Checking for a default input method in /etc/X11/xim.d/en/
sourcing /etc/X11/xim.d/en/40-ibus ...
/etc/X11/xim.d/en/40-ibus started sucessfully
OpenSSL version mismatch. Built against 1000005f, you have 1000103f

との事。最後の行がもう核心に触れている訳ですが、せっかくなのでもうちょっと追いかけてみる。
なんか /etc/X11 辺りで処理してそうなので、ここらで .xsession-errors というファイルを作っている箇所を探してみると

$ grep -r .xsession-errors /etc/X11
/etc/X11/xdm/Xsession:for errfile in   "$HOME/.xsession-errors" \ 

ナイスな反応が。
/etc/X11/xdm/Xsessionをのぞいてみると、exec_login()なんてのが見受けられ、中では

case "${cmd}" in
csh|tcsh)
    exec -l -a ${cmd} ${shell}         -c 'exec $argv:q'  "${@}"    ;;
bash*|zsh)
    exec -l -a ${cmd} ${shell} --login -c 'exec "${@}"' - "${@}"    ;;
dash|pdksh|*pcksh|ksh*)
    exec -l -a ${cmd} ${shell} -l      -c 'exec "${@}"' - "${@}"    ;;
 *) 
    exec -l -a ${cmd} ${shell}         -c 'exec "${@}"' - "${@}"    ;;
esac

なんてことが為されている。自分はbashなので、ここで実行されている命令は

exec -l -a bash /bin/bash --login -c 'exec /etc/X11/xdm/sys.xsession' - /etc/X11/xdm/sys.xsession

となる。
xdmなんてキーワードが出てきた辺り、ログインマネージャに近づいた感じがしますね。
次はこのsys.xsessionをのぞいてみると

if test "$usessh" = yes -a -d "$HOME/.ssh" && sshagent=$(type -p ssh-agent) ; then 

とかなんとかで、sshがある場合には専用の処理が入るわけですね。
この先については冗長なので割愛。
ここで出てきたssh。実は先に.xsession-errorsにて

OpenSSL version mismatch. Built against 1000005f, you have 1000103f

なんて事を言われてたわけですが、どうもsshの実装時に想定されていたopensslのbuildを今回openSUSE12.2へ更新した事で新しく入ったopensslが上回ってしまった模様。ちなみにbuild 1000005fはOpenSSL 1.0.0eに該当します。
今回の更新で入ったopensslは1.0.1c。この差によってssh周りが正常に機能せず、それがログイン時の処理にも影響が及ぼしていたわけですね。

解決

一番スマートな解決としてはリポジトリにあるopensshの最新版がその辺のバージョンをちゃんとしてくれることではありますが、悠長に待つのもやってられない。かと言ってパッケージでまとめてあるこの辺を自分でコンパイルしたopensshで上書きしたら、次回の更新時に変な事になりそうで嫌だ。
という訳で、一時的に二つのバージョンを共存させることにしました。
後でパッケージのアップデートが出たら、今回入れたopensshは削除する方向で。

とりあえずはインストール

$ tar zxf openssh-6.0p1.tar.gz
$ cd openssh-6.0.1
$ ./configure --prefix=/usr/local/openssh
$ make
# make install

あとはこのopensshが優先的に使われるようになっていればOKということで

$ vi ~/.bashrc
export PATH=/usr/local/openssh/bin:/usr/local/openssh/sbin:$PATH

を追加してやることで、無事起動するようになりましたとさ。