OpenLDAP2.4の”bdb_db_open: db_open(/var/db/openldap-data/id2entry.bdb) failed: No such file or directory (2)”と言うエラーについて


CentOS6.2に対してyumでopneldapをインストールすると2.4がインストールされます。
これがなかなかの曲者で、動的データベースと呼ばれるbdbに対して設定ファイルを書き込む仕様が標準となりました。
なお、動的データベースは、2.3から搭載されている機能で、設定を変更した場合に即座に反映されるものですが、取り扱いが非常に厄介な物でもあります。

OpenLDAP2.4の初期構築時に、slapd.confに設定した内容を動的データベースに書き込むには、以下のコマンドを実行します。

slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chomd -R ldap:ldap /etc/openldap/slapd.d/*

しかしここで起動をしようとしても、失敗する事が有ります。
そこでslpatestコマンドで設定ファイルを確認すると、

bdb_db_open: db_open(/var/db/openldap-data/id2entry.bdb) failed: No such file or directory (2)

というエラーが出ていませんか?
実際に/var/db/openldap-data/の中を見ても、id2entry.dbと言うファイルが存在しない事に気づきます。
しかしどうやっても出来ず色々調べていたところ、適当に*.ldifをslapaddで追加すると、このファイルが出来上がる事がわかりました。
こんな感じです。

slapadd -l /etc/openldap/schema/core.ldif
chown -R ldap:ldap /var/lib/ldap/*

これで起動できるようになりました。
バグなんでしょうかね。でも少なくとも4年前からこの仕様が続いている様です。

Linux同士でSSH鍵交換


SSH経由でリモートサーバのコマンドを実行する場合など、SSH鍵やパスフレーズをプログタム内に記述して実装する事になります。
その際の鍵交換の方法を紹介するサイトで、わかりやすく整理されている情報が無かったので、改めてご紹介します。

SSHの接続元(クライアント)で鍵を作成

まずはSSHの接続元であるクライアントで以下を実行して、公開鍵と秘密鍵を作成します。

ssh-keygen -t rsa

秘密鍵と公開鍵の保存先+ファイル名を聞いて来ますので、以下の様に保存します。
(作成した鍵ファイルは、プログラムから指定する事になります。)

Enter file in which to save the key (/root/.ssh/id_rsa): 保存先

次にパスフレーズを入力します。
これも、プログラムから指定するパスフレーズになります。

Enter passphrase (empty for no passphrase): 任意のパスフレーズを入力
Enter same passphrase again: もう1回入力

作成した公開鍵を、scpで接続先サーバの接続先ユーザのホームディレクトリの.sshディレクトリ内にコピーします。または、作成した公開鍵をcatなどで開き中身をコピーして、接続先サーバに保存してもOKです。

例1) 192.168.0.1のホストにrootでSSH接続したい場合

scp 作成した公開鍵 root@192.168.0.1:/root/.ssh/

例2) 中身をコピーする場合(例ではrootに接続)
接続元サーバで、

cat 作成した公開鍵

の中身のテキストをコピーして、
接続先サーバで、

vi /root/.ssh/id_rsa.pub
コピーしたテキストを貼付け

SSH接続元で必要な作業は以上の通りです。

SSH接続先(SSHサーバ)の設定

コピーしたファイルの中身を、接続先のユーザの、.ssh/authorized_keysファイルに記述します。

cd 接続先ユーザのホームディレクトリ/.ssh/
cat id_rsa.pub >> authorized_keys 

次にsshの設定を変更します。

vi /etc/ssh/sshd_config
----これらがコメントアウトされていた場合、コメントアウトを解除----
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
--------------------------------------------------------
service sshd restart

以上で設定完了です。

OpenLDAP2.4の設定変更について


OpenLDAP2.4で、slapd.conf内の設定、特にドメインやManagerのパスワードを変更した場合は、以下の作業が必要になります。

アカウントのデータが削除されるので注意!!

1. /etc/openldap/slapd.d/と、/var/lib/ldap/以下を削除

rm -rf /etc/openldap/slapd.d/*
rm -rf /var/lib/ldap/*

2. DB_CONFIGをコピーしてパーミッションを変更

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap/DB_CONFIG 

3. slapd.d以下のファイルを作成し、パーミッションを変更

slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap:ldap /etc/openldap/slapd.d

4. slapd.confを編集し、OpenLDAPを再起動

以上で設定変更が反映されます。
間違っていたらご指摘下さい。

OpenLDAP2.4の Invalid credentials (49)について

OpenLDAP2.4以降に採用された、設定関係も丸ごとDBに突っ込む仕様ですが、全く以て使い辛く情報も少ないですよね。
期待のマルチマスター構成も、こんなんじゃ使い物になる以前の問題です。

このDBに構成情報を持たせる事が元で、 Invalid credentials (49)のエラーにはまっている方多いんじゃないでしょうか。
パスワードも絶対間違ってないのに的な。。。
そうゆう時は以下の様にして、ディレクトリを丸ごと吹き飛ばしてサービス再起動したりするといきなり直ったりするかもしれません。

rm -rf /etc/openldap/slap.d

そもそも、今まで通りにslap.confで運用したい場合は、slapd.confの中で、以下の部分をコメントアウトすると、今までの様に使いやすいOpenLDAPを使用できます。

# enable on-the-fly configuration (cn=config)
#database config
#access to *
#       by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
#       by * none

# enable server status monitoring (cn=monitor)
#database monitor
#access to *
#       by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
#       by dn.exact="cn=Manager,dc=my-domain,dc=com" read
#       by * none

CentOS6.xになってから、OpenLDAP2.4が標準になり、FreeRadiusも2系になり、色々と変わっていますね。
しかもいい方向にはあまり変わっていないようで、どうしちゃったんだろって感じですね。

CentOS6のインストールがテキストモードになってしまう


CentOSでは、OSをインストールする際に652MB以上のメモリを搭載していなければ、強制的にテキストモードでのインストールになってしまいます。

テキストモードのインストールは、CentOS5.xでもそうでしたが、パーティションを自由に切ることができません。
さらに、CentOS6では、パッケージの選択もできなくなってしまいました。
一応推奨のパーティションサイズでインストールされると言ったメッセージが書かれてはいるのですが、Linuxをインストールするにあたり、推奨値でインストールする意味があるのか、個人的には疑問です。

CentOS6では、ディスク容量に応じてファイルシステムが切られるような機能がありますが、/homeがディスクの半分を使ったりしてしまうので、ちょっと辛いです。
パッケージも不要なものは入れないのが割と一般的なのではないかと思いますが、どうなんでしょうか。

メモリの最小値は、勿論仮想マシンでも同じですのでご注意ください。

CentOS6でXen4を利用する


CentOS6の標準のYumリポジトリから、なんとXenが消えてしまいました。。。
そうですよね。。KVMよりなんですもんね。
でもこのサイトで、CentOS6でもちゃんとXenが動く方法を紹介してくれています。
http://www.ayutaya.com/2011/05/22/xen4-sl6-dom0/

Xenはカーネルをビルドする必要があるので、こういったインストール方法で無ければ複数の物理環境でXenを動かすなんてのは非現実的です。
ですのでこのサイトの管理者様と、リポジトリを公開している方に感謝です!
これでIntelVTやAMD-Vに未対応のCPUにもまだまだ活躍の場が残せそうですね!!

Zabbix構築時のエラー


統合監視ツールで今はやりのZabbixをインストールしてみました。
バージョンは1.8.4です。
その際に出たエラーと対応手順を紹介します。

エラーメッセージ

configure: error: Not found mysqlclient library

これは、zabbixをソースをconfigureしようとしたときに出ました。
MySQLのクライアントライブラリが無いってゆうメッセージです。
ですが、自分の環境では、MySQL5.1.55をフルコンポーネントでソースからインストールしているので、無いはずもありません。
なので、configureオプションで、以下のようにMySQLのパスを明示的に指定します。

--with-mysql=/usr/local/mysql/bin/mysql_config\

これでちゃんとconfigureできました。

エラーメッセージ

error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

これはzabbixのインストールが完了して、いざ起動しようとしたときに出たエラーです。
またMySQLのクライアントライブラリがないゆうてますね。
ありますよちゃんと。
このメッセージをやっつけるには、”/etc/lo.so.conf”を開いて、

/usr/local/mysql/lib/mysql/

てな感じで、MySQLのクライアントライブラリがあるディレクトリを記入します。
その後、

ldconfig


を叩けば、やっとzabbixが起動するようになりました。。
これから設定です。ちゃんと出来るかなー??

LVS(ipvs)の冗長化


LVSの構築の為に、以下のサイトを参考にされてる方は多いのではないでしょうか。

DSAS開発者の部屋
http://dsas.blog.klab.org/archives/50678999.html

この記事の最後で、LVSを冗長化する方法を紹介していますが、何やらややこしい事になってます。
リアルサーバ用のVIP(バーチャルIPアドレス)と、VRRPを使用したLVS用のIPアドレスがあって、VRRPのアドレスからVIPのアドレスにルーティングしてから、リアルサーバに振り分けるような構成です。
因みにVIPとVRRPは一つに纏めちゃってOKです。とりあえず、こちらのブログと同じDSR構成ではできました。
言い方を変えると、KeepalivedでVRRPを設定すれば、OSでVIPを設定する必要が無いという事ですね。

それと、このブログでは、順を追って説明しているが為に、

ipvsadm -A ~
ipvsadm -a ~

といった形で、まず手打ちでバランシングの設定をしてますね。
で、うまくバランシングできたことを確認し、次にリアルサーバのヘルスチェック機能を構築するために、Keepalivedの構築に移ります。
その際に、まずはじめに

ipvsadm -C

でバランシング設定をクリアし、それからKeepalivedの設定をしています。
これが間違いとかそうゆう話ではなくて、初めからKeepalivedを使用すると決めている(Heartbeatでも同じ)なら、ipvsadmコマンドで手打ちで設定する必要は無いと言うことです。この説明が欲しいですね。。
間違って手打ちとKeepalivedの両方でバランシングの設定をしてしまっている人、結構いるんじゃないでしょうか。
Keepalivedがipvsに対しちゃんとバランシングの設定を行いますので、Keepalivedの起動後に、

ipvsadm -L

を打ってみると、ちゃんと設定されている事がわかります。
これと同じく、VIPも、KeepalivedのVRRP機能でOSに対して設定してくれますので、

ip addr show

などで確認してみてください。

LVS+ldirectordのエラーメッセージ


LVS+ldirectordによる負荷分散を構成しようとして、出力されたエラーと対処法を紹介します。

エラーメッセージ(1)

/etc/init.d/ldirectord: line 33: /etc/ha.d/shellfuncs: そのようなファイルやディレクトリはありません

⇒touchして、”/etc/init.d/ldirectord”ファイルを作ります。中身は空でOKです。

エラーメッセージ(2)

Error [10079] reading file /etc/ha.d/ldirectord.cf at line 8: Unknown command real=192.168.11.71:80 gate 1

“/etc/ha.d/ldirectord.cf”ファイルの行頭にスペースなんかが入っていたりすると出力されます。tabに変更です!

XenでDomainUにネットワークを追加する方法


色んなサイトでも紹介されてるけど、ちょっと長ったらしくてめんどそうだったり、
実際うまく行かなかったりするので、自分がうまく行ったときの方法をご紹介。

以下は物理NICを追加するわけではなく、dummyのネットワークをDomain0に追加して、
DomainUでeth0(物理NICにくっつく)とeth1(dummyにくっつく)を使用する例です。
dummyでなく、物理NICでも応用できるので適宜読み替えてください。

まず、”/etc/modprobe.conf”に以下行を追加してDomain0を再起動。

# vi /etc/modprobe.conf
alias dummy0 dummy
options dummy numdummies=1

再起動後にifconfigすると、dummyのネットワークが見えてるはず。

# ifconfig | grep dummy
dummy0    Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX

次に、”/etc/xen/scripts/”以下に適当な名前のファイルを作って、こんな感じに記述します。

# vi tekitou
#!/bin/sh
dir=$(dirname "$0")
"$dir/network-bridge" "$@" vifnum=0 netdev=eth0
"$dir/network-bridge" "$@" vifnum=1 netdev=eth1

※ vifnumの意味は、xenbr(Domain0上の仮想スイッチ)の番号
  netdevは、xenbrに対応するDomainUからみえるNICの名前

そして、xendの設定ファイル、”/etc/xen/xend-config.sxp”で読み込むネットワーク構成参照ファイルの部分を、今作ったファイル名に変更。

# vi /etc/xen/xend-config.sxp
(network-script network-bridge)
  ↓
(network-script tekitou)

最後に、各DomoinUの設定ファイル(”/etc/xen/”以下にあるよ)のvifの部分を、こんな風に書き換えます。

vif = ["bridge=xenbr0","bridge=xenbr1"]

これでDomainUを起動すれば、あとはDomainU内のeth0とeth1を設定&起動すれば繋がります。
ちなみに、eth1側にdummyネットワークがくっつくから、dummyネットワークで外部には繋がらないので注意!!

<2011.2.19追記>
仮想マシンに対するインターフェイスの記述に関してですが、macアドレスを記載しないと、仮想マシンを起動する度に新しいmacアドレスがランダムに振られてしまいます。

これでは仮想マシンから見ると毎回新規のインターフェイスを追加したかのように見えてしまい、そうなると、もともとの仮想マシンのeth0や、eth1が、eth0.bakやeth1.bakになり、新規のeth0とeth1が出来てしまい、仮想マシンの起動の都度、インターフェイスの設定をしなければならない事態に陥ります。

これを避けるためには必ずmacアドレスを以下のようにして追加します。

vif = ["mac=00:XX:XX:XX:XX:XX,bridge=xenbr0","mac=00:XX:XX:XX:XX:XX,bridge=xenbr1"]
(XXの部分は任意の数字)