Debian7.3でsudoができないエラー

所用でDebian7.3を入れることになった。

いつも通り手順に従ってサックリインストールをしたんだけれど、sudoができない。
sudoができないと話にならない。

エラーの内容は以下の通り。

$ sudo ls
[sudo] password for yousan:
sudo: PERM_ROOT: setresuid(0, -1, -1): Operation not permitted
sudo: unable to open /var/lib/sudo/yousan/1: Operation not permitted
sudo: ls: command not found

うーん、setresuidっていうのでエラーが出てる。setresuidってユーザのUIDを切り替えるときに使う関数で、sudoなんかはモロに使ってるんだけど、こいつがエラーを出している模様。
ググってみると同様のエラーが報告されてた。

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=658896

2012年の3月にすでに確認されていたらしい。
内容では
libnss-ldapの代わりにlibnss-ldapdを使え
nscdの代わりにnslcdを使え
とのこと。今回問題が起きた環境はldapでの認証を使っていたのでこの対処をしてみることに。

shell> aptitude purge libnss-ldap nscd
shell> aptitude install libnss-ldapd nslcd

サックリいれかえたらうまくsudoが使えるようになりました。
今後はこれらの二つを使っていこうと思います。

Subversionのサーバをsvnからhttpに切り替えた時に作業ディレクトリで起こったエラー

0. サブバージョンを置き換えたらエラー発生

Subversionのサーバをsvnからhttpに切り替えたんだけど、作業ディレクトリ側でエラーが発生した。
当初Subversionはsvnservによって、svnプロトコルでやりとりを行っていた。svn coとかするときにsvn://で始まるURLを使っていた、ということですね。

<br />shell&gt; svn co svn://svn.example.com/hogerepo/<br />

LAN内で利用する分には不満がなかったんだけど、外部のインターネット越しに利用するとなると色々と不便があったのでHTTPで外部からも取得できるように変更した。
svnプロトコル自体を公開すれば良いじゃないか、という意見もあるかもしれないけれど、色々と考えた結果apache経由のhttpのみを公開することに。その辺の移行も大変だったけれど、それはまた別の機会に。

今回svn -> httpにする事で、今までチェックアウトしてきた作業ディレクトリで、svnの操作が行えなくなってしまった。もちろんプロトコルを変えたので当然と言えば当然。今回はこの動かなくなってしまった作業ディレクトリのリポジトリ参照先を変更することに。

1. 発生するエラー

まず現状のエラーを確認。

<br />shell&gt; svn update<br /> Updating '.':<br /> svn: E000061: Unable to connect to a repository at URL '<span style="text-decoration: underline;">svn://svn.example.com/hogerepo</span>'<br /> svn: E000061: Can't connect to host '<span style="text-decoration: underline;">svn.example.com</span>': Connection refused<br />

svn.example.comへ接続できない、と怒られていますね。もちろんこれはsvnservの廃止、httpの移行を行ったのでsvn.example.comへsvnプロトコルではアクセスできない、ということですね。

2. svnの参照リポジトリの変更

svnコマンドには参照リポジトリの変更というものがある。今回はそれを利用する。まず前段階として現在どういったリポジトリを参照しているか、を確認する。

<br />shell&gt; svn info | grep URL<br />URL: <span style="text-decoration: underline;">svn://svn.example.com/hogerepo</span><br />

svn infoで出力される情報の内、URLの項目を調べておく。今回の件ではsvn://svn.example.com/hogerepo が該当する。
今回の svn -> http の移行はプロトコルの変更のみで、svnサーバの名前は従来と同様に svn.example.com で行くこととなった。
(実際にはsvn_test.example.comのように移行時には別のサーバを立て、移行作業が完了した後にsvn.example.comの指すホストを書き換えている)
今回の移行はサーバのリポジトリの配下にあるリポジトリ構造、ディレクトリ構造もそのまま引き継いだので、

svn://svn.example.com/hogerepo
というリポジトリが
http://svn.example.com/hogerepo
になるだけとなった。

ちなみにリポジトリの配下のディレクトリ(ここではhogerepoリポジトリにあるディレクトリ)以下を変更する場合も同様。
さてこのURLを使って、以下のようにsvn switchを発行してやる。

<br /></span><span style="line-height: 1.714285714; font-size: 1rem;">shell&gt; svn switch --relocate </span><span style="text-decoration: underline;">svn://svn.</span><span style="text-decoration: underline;">example.com/hogerepo </span><span style="text-decoration: underline;">http://svn.example.com/hogerepo<br />

これで完了。簡単ですね。

ちなみに今回はサーバの移行をディレクトリを丸ごとコピーしたんだけれど、場合によってはリポジトリをダンプして読ませて、といった他のケースも有り得る。そうなってくるとこの作業ディレクトリの指すリポジトリ変更にはちょっと問題があったりする。具体的にはUUIDと呼ばれるリポジトリを一意に識別するものがあるのですが、これが一致しないとsvn switchの段階で怒られてしまいます。

この件に関しては下記に解決方法の一例があるので参照を。

svn switch –relocate: wrong uuid?