はじめに
CentOS等のパッケージ管理があるLinuxのディストリビューションにおいて、ソフトをソースからインストールするのは極力やめた方がよいです。
昔はそうでもなかったのですが、現在、たいていのソフトは新しいVerがでるとすぐにパッケージがリリースされますので、ソースからインストールしなければいけない場面は、そんなにない…と思います。
ソースからインストールしない方がよい理由は以下の通りです。
導入
サーバーにmemcashedをインストールしたのでmuninで監視することにしました。
memcashedをmuninで監視するはとても簡単…muninがインストールされていれば、多分デフォルトでmemcashed監視用のスクリプトがついてくるので、スクリプトにシンボリックリンクをはるだけ…なのですが、何を血迷ったのか、当時の私はmuninをソースからインストールするという手順を実行していました。
その結果
/etc/init.d/munin-node start
すると、ソースからインストールしたmuninが起動します。
これはまずい…ということで、ソースからインストールしたmuninを削除するべく行動し始めました。
ソースからインストールしたソフトをアンインストールする
「ソースからインストールしたソフト アンインストール」でぐぐると
make uninstall
してみろ、そんなオプションがあったらラッキー、と書いてありました。
残念ながらmuninにuninstallというオプションはありませんでした。
インストールされたファイルを削除していく
find / -name munin
で、見つかったそれっぽいディレクトリを削除していきます。
CentOS等のパッケージ管理があるLinuxのディストリビューションにおいて、ソフトをソースからインストールするのは極力やめた方がよいです。
昔はそうでもなかったのですが、現在、たいていのソフトは新しいVerがでるとすぐにパッケージがリリースされますので、ソースからインストールしなければいけない場面は、そんなにない…と思います。
ソースからインストールしない方がよい理由は以下の通りです。
- ソースからインストールしたソフトは、何がどこに入ったか、make installのログ等を追わないと分からない
- インストールはmake insatllでめっちゃ簡単にインストールできるが、アントンストールは手動
- パッケージ管理されているソフトと競合する
導入
サーバーにmemcashedをインストールしたのでmuninで監視することにしました。
memcashedをmuninで監視するはとても簡単…muninがインストールされていれば、多分デフォルトでmemcashed監視用のスクリプトがついてくるので、スクリプトにシンボリックリンクをはるだけ…なのですが、何を血迷ったのか、当時の私はmuninをソースからインストールするという手順を実行していました。
その結果
- ソースからインストールしたmunin
- パッケージを使ってインストールしたmunin
/etc/init.d/munin-node start
すると、ソースからインストールしたmuninが起動します。
これはまずい…ということで、ソースからインストールしたmuninを削除するべく行動し始めました。
ソースからインストールしたソフトをアンインストールする
「ソースからインストールしたソフト アンインストール」でぐぐると
make uninstall
してみろ、そんなオプションがあったらラッキー、と書いてありました。
残念ながらmuninにuninstallというオプションはありませんでした。
インストールされたファイルを削除していく
find / -name munin
で、見つかったそれっぽいディレクトリを削除していきます。
rm -rf /opt/munin
rm -rf /opt/munin/log/munin
rm -rf /etc/opt/munin
rm -rf /var/opt/munin
そして、
パッケージでインストールしたmuninの設定ファイルは
/etc/munin/munin-node.conf
一方ソースからインストールしたmuninの設定ファイル
/etc/opt/munin/munin-node.conf
/etc/munin/munin-node.confを見に行くように変更しなければいけません。
Starting Munin Node: ERROR: Cannot open '/etc/opt/munin/munin-node.conf': at /usr/sbin/munin-node line 60
ですので、 /usr/sbin/munin-nodeのline 60を確認します。
/usr/sbin/munin-nodeを読む
munin-nodeは先頭行に
#!/usr/bin/perl -wT
と書いてあるperlのスクリプトです。
60行目の内容は以下の通りです。
$config->parse_config_from_file($conffile);
$conffileの定義は以下の通りです。
my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin-node.conf";
$Munin::Common::Defaults::MUNIN_CONFDIRに/etc/opt/muninが入っているのですが、$Munin::Common::Defaults::MUNIN_CONFDIRがどこで定義されているか、さっぱり分かりませんでした。
/usr/sbin/munin-nodeにおいて、$Munin::Common::Defaults::MUNIN_CONFDIRの前に書いてある内容は以下の通りです。
Perlをちゃんと扱っている方であれば、
/usr/local/share/perl5/を消す
$ find / -name Munin
したら
/usr/share/perl5/vendor_perl/Munin/Common/Defaults.pm
/usr/local/share/perl5/Munin/Common/Defaults.pm
の2つがひっかかりました。
前者には
our $MUNIN_CONFDIR = q{/etc/munin};
後者には
our $MUNIN_CONFDIR = q{/etc/opt/munin};
と書いてあったので、後者がいらないと分かりました。
もう一つのサーバーとディレクトリの構造を見比べたら、もう一つのサーバーには、そもそも/usr/local/share/perl5/がなかった…つまりmuninをソースからインストールしたときに作られたディレクトリでしたので、ディレクトリごと削除しました。
※ソースからインストールすると/use/localにいろいろ入るので、ここを見てみるべきでした…というか、make installしたときのログを見ればよかったのですが…
そして、
/sbin/service munin-node start
Starting Munin Node: ERROR: Cannot open '/etc/opt/munin/munin-node.conf': at /usr/sbin/munin-node line 60
パッケージでインストールしたmuninの設定ファイルは
/etc/munin/munin-node.conf
一方ソースからインストールしたmuninの設定ファイル
/etc/opt/munin/munin-node.conf
/etc/munin/munin-node.confを見に行くように変更しなければいけません。
Starting Munin Node: ERROR: Cannot open '/etc/opt/munin/munin-node.conf': at /usr/sbin/munin-node line 60
ですので、 /usr/sbin/munin-nodeのline 60を確認します。
/usr/sbin/munin-nodeを読む
munin-nodeは先頭行に
#!/usr/bin/perl -wT
と書いてあるperlのスクリプトです。
60行目の内容は以下の通りです。
$config->parse_config_from_file($conffile);
$conffileの定義は以下の通りです。
my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin-node.conf";
$Munin::Common::Defaults::MUNIN_CONFDIRに/etc/opt/muninが入っているのですが、$Munin::Common::Defaults::MUNIN_CONFDIRがどこで定義されているか、さっぱり分かりませんでした。
/usr/sbin/munin-nodeにおいて、$Munin::Common::Defaults::MUNIN_CONFDIRの前に書いてある内容は以下の通りです。
use strict; use warnings; # Trust PERL5LIB from environment use lib map { /(.*)/ } split(/:/, ($ENV{PERL5LIB} || '')); use Getopt::Long; use Munin::Node::Config; use Munin::Common::Defaults; use Munin::Node::OS; use Munin::Node::Server; my $servicedir = "$Munin::Common::Defaults::MUNIN_CONFDIR/plugins"; my $sconfdir = "$Munin::Common::Defaults::MUNIN_CONFDIR/plugin-conf.d"; my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin-node.conf";
Perlをちゃんと扱っている方であれば、
- $ENV{PERL5LIB}はperl -e 'foreach(@INC){print "$_\n";}'で確認できる
- $Munin::Common::Defaults::MUNIN_CONFDIRは、$ENV{PERL5LIB}に格納されているディレクトリの中にあるMunin/Common/Defaults.pmのour $MUNIN_CONFDIRに書いてある
/usr/local/share/perl5/を消す
$ find / -name Munin
したら
/usr/share/perl5/vendor_perl/Munin/Common/Defaults.pm
/usr/local/share/perl5/Munin/Common/Defaults.pm
の2つがひっかかりました。
前者には
our $MUNIN_CONFDIR = q{/etc/munin};
後者には
our $MUNIN_CONFDIR = q{/etc/opt/munin};
と書いてあったので、後者がいらないと分かりました。
もう一つのサーバーとディレクトリの構造を見比べたら、もう一つのサーバーには、そもそも/usr/local/share/perl5/がなかった…つまりmuninをソースからインストールしたときに作られたディレクトリでしたので、ディレクトリごと削除しました。
※ソースからインストールすると/use/localにいろいろ入るので、ここを見てみるべきでした…というか、make installしたときのログを見ればよかったのですが…
$ perl -e 'foreach(@INC){print "$_\n";}'
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
なので、 /usr/share/perl5/vendor_perlよりも、/usr/local/share/perl5の方を先読みするということも確認できました。
この後、もう少し紆余曲折があった(muninのVerが2系になっていて、今使っている1系のrpmがなかなか見つからなかった)のですが、最終的に/sbin/service munin-node startできるようになりました。
以上で3時間かかりました。
学んだこと
なので、 /usr/share/perl5/vendor_perlよりも、/usr/local/share/perl5の方を先読みするということも確認できました。
この後、もう少し紆余曲折があった(muninのVerが2系になっていて、今使っている1系のrpmがなかなか見つからなかった)のですが、最終的に/sbin/service munin-node startできるようになりました。
以上で3時間かかりました。
学んだこと
- ソースからインストールするとアンインストールが大変
- パッケージでインストールされたソフトの設定ではなく、ソースからインストールしたソフトの設定が優先されることがある
- Perlを知らないと困ることがある
- 簡単な作業でも眠いときに作業しない