OpenLDAPをインストールする(トラブルシュート)
せっかくSolaris系OSを使用するわけなので、Solarisコンテナを使用したい。
コンテナついでに、PAMのLDAPモジュールを利用してユーザの一元管理をと
一意奮闘しております。
今回は、SUNWopenldapパッケージを使用したのですが、
妙なところでハマッたのでそのメモ。
※シューティングメモのため細かい内容は今回は割愛します
まずはパッケージをインストール
OpenSolarisは便利です。
pkgコマンドを利用すると、インストールされていないパッケージを
リモートのパッケージリポジトリからインストールできます。
# #パッケージを調べる。結果はSUNWopenldap # pkg search openldap # #SUNWopenldapの依存パッケージを調べる。 # pkg contents -m SUNWopenldap # #依存パッケージのインストール状況を調べる # pkg info SUNWcsl SUNWlibsasl SUNWlibnet SUNWicu SUNWopenssl SUNWopenldap # #パッケージ管理されているのでとりあえず、依存パッケージ全部入れちゃえ # pkg install -v SUNWcsl SUNWlibsasl SUNWlibnet SUNWicu SUNWopenssl SUNWopenldapこれで、インストール完了です。
設定ファイルが/etc/openldapに保存されますので、自己の環境にあわせ、
slapd.confを設定します。
なお、起動・停止スクリプトも一緒にインストールされるので、
以下の部分はそのままにしました。
pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args
いざslapdを起動する
Solaris10から、SMF(Service Management Facility)というサービス
管理機能が追加されました。OpenSolarisも例外なくSMFがあります。
※SMFについてはいつか別の機会にふれたいと思います。
今回インストールした、SUNWopenldapパッケージもSMFにより
サービスの制御が可能です。
# svcs -a | grep ldap disabled 21:45:28 svc:/network/ldap/client:default disabled 21:45:54 svc:/network/ldap/server:openldap_24 # svcadm enable -t svc:/network/ldap/server:openldap_24よし!! これで起動
# ps -ef | grep slapdと思いきや、slapdのプロセスが、、、無い。
さて、原因追求。
svcsコマンドでサービスの起動状況を確認し、maintenace状態であることがわかった。
svcs -vx でSMFのメッセージを確認する。
# svcs -a | grep openldap_24 maintenance 22:50:45 svc:/network/ldap/server:openldap_24 # svcs -vx svc:/network/ldap/server:openldap_24 (slapd - OpenLDAP LDAP server) State: maintenance since 2010年04月xx日 xx時xx分xx秒 Reason: Method failed repeatedly. See: http://sun.com/msg/SMF-8000-8Q See: man -M /usr/openldap/man -s 8 slapd See: http://www.openldap.org See: /var/svc/log/network-ldap-server:openldap_24.log Impact: This service is not running.とりあえず、logファイルを確認すると、
[ 4月 xx xx:xx:xx Method "stop" exited with status 2. ] [ 4月 xx xx:xx:xx Executing stop method ("/usr/bin/kill `cat /var/run/openldap/slapd.pid`"). ] cat: /var/run/openldap/slapd.pid: cannot open [No such file or directory]pidファイルが無いとおっしゃっています。
/var/runのサブディレクトリopenldapということでこいつが存在しないことが
原因だとわかり、
# mkdir /var/run/openldap # chown openldap:openldap /var/run/openldap # svcadm enable svc:/network/ldap/server:openldap_24 # svcs -a | grep openldap_24 online 21:45:54 svc:/network/ldap/server:openldap_24これで無事起動!!
ほんとの原因は /var/run に
さて、これで設定完了と思いつつ、OS再起動。
ところが、再起動後プロセスを確認するとslapdは起動していなかった
ログファイルを確認すると、前回と同じくpidファイルが開けないと書いてある
また、/var/runを除いてみても、先に作成した/var/run/openldapが存在しない。
感に任せて dfをたたく、、、
# df -h Filesystem Size Used Avail Use% Mounted on rpool/ROOT/opensolaris 19G 3.0G 16G 17% / swap 923M 312K 923M 1% /etc/svc/volatile /usr/lib/libc/libc_hwcap1.so.1 19G 3.0G 16G 17% /lib/libc.so.1 swap 923M 4.0K 923M 1% /tmp swap 923M 40K 923M 1% /var/run rpool/export 16G 21K 16G 1% /export rpool/export/home 16G 21K 16G 1% /export/home rpool/export/home/hoge 16G 8.8M 16G 1% /export/home/hoge rpool 16G 79K 16G 1% /rpoolいやな予感的中。
/var/runがswapデバイスにのっていた。 swapデバイスとはその名の通り、swap領域を利用しているため、
揮発性のある領域で、OSの再起動をすると消えてしまうのである。
トラブルシュート
/var/run/openldapディレクトリが、OS起動毎になくなってしまうことが
原因のため、起動スクリプトの修正を行う必要がある。
まずは、どんなスクリプトが呼び出されているか確認する必要があるため
SMFの制御ファイルであるマニフェストと呼ばれるXMLベースのファイルを確認する
# vi /var/svc/manifest/network/ldap/ldap-olslapd.xml : : <exec_method type='method' name='start' exec='/usr/lib/slapd -u openldap -g openldap -f /etc/openldap/slapd.conf' timeout_seconds='60'> <method_context> <method_credential user='openldap' group='openldap' privileges='basic,net_privaddr' /> </method_context> </exec_method> <exec_method type='method' name='stop' exec='/usr/bin/kill `cat /var/run/openldap/slapd.pid' timeout_seconds='60' /> : : :マニフェストの一部で、
上記の通り、起動・停止がハードコーディングされてる。
そこで、下記のような起動スクリプトを/etc/openldap/slapdrc.shとして作成しました
※あくまで暫定の起動スクリプトです。
#!/bin/sh CONF_FILE='/etc/openldap/slapd.conf' RUN_DIR='/var/run/openldap' RUN_UID='openldap' RUN_GID='openldap' start() { if [ ! -d $RUN_DIR ]; then /usr/bin/mkdir -p $RUN_DIR /usr/bin/chown $RUN_UID:$RUN_GID $RUN_DIR fi /usr/lib/slapd -u $RUN_UID -g $RUN_GID -f $CONF_FILE } stop() { if [ -f $RUN_DIR/slapd.pid ]; then /usr/bin/kill `cat $RUN_DIR/slapd.pid` fi } case $1 in start) start;; stop) stop;; esac
また、マニフェスト上で実行ユーザ・グループがopenldapになっているため、
<method_credential user='openldap' group='openldap' privileges='basic,net_privaddr' />セキュリティ上好ましくありませんが、下記のようにパーミッションを設定
# chmod +x slapdrc.sh # chmod u+s slapdrc.sh
続いて、マニフェストを以下のように修正します。
<exec_method type='method' name='start' exec='/etc/openldap/slapdrc.sh start' timeout_seconds='60'> <method_context> <method_credential user='openldap' group='openldap' privileges='basic,net_privaddr' /> </method_context> </exec_method> <exec_method type='method' name='stop' exec='/etc/openldap/slapdrc.sh stop' timeout_seconds='60' />修正したマニフェストをsvccfgコマンドを利用して登録します
# svccfg import /var/svc/manifest/network/ldap/ldap-olslapd.xml
以上で、OS再起動後もslapdが立ち上がるようになります。
もっとも、作成したスクリプトは暫定的なものですので、
セキュリティを考慮して作り直す必要がありますが、それはまた別の機会に