難しいって本当?@完全削除

先日ソースからコンパイルしてインストール
したものは、完全アンインストールが難しいと
書きましたがその一例(言い訳?)です。(笑

例として昨日ご紹介したReadyMedia(minidlna)のソースから
./configureでMakefileを生成して中身を覗いてみます。
601行16706文字(スペース除く)もあるので、
全部はこぴぺしませんけど。。

 *1行が長すぎて改行されているところは、
  編集せずにそのままにしてあります。

am__is_gnu_make = test -n ‘$(MAKEFILE_LIST)’ && test -n ‘$(MAKELEVEL)’
am__make_running_with_option = \
case $${target_option-} in \
?) ;; \
*) echo “am__make_running_with_option: internal error: invalid” \
“target option ‘$${target_option-}’ specified” >&2; \
exit 1;; \

↑ こんな感じのが延々と300行続きます。

↓ で、ここらあたりに注目します。

bindir = ${exec_prefix}/bin  300行目あたり
exec_prefix = ${prefix}    それより11行下
prefix = /usr/local 更に18行
sbindir = ${exec_prefix}/sbin 更に3行下

アルファベット順なので順番はちょっと違いますが、
prefix = /usr/local で
/usr/local下をベースディレクトリとしています。
実行ファイルを置くのは /usr/local/bin や
/usr/local/sbin となっています。
exec_prefixは通常prefixと同じディレクトリになります。

これらはインストール時の慣例で、特に置き場所を
探すのが難しいというわけではありませんが、
/usr/local/bin や/usr/local/sbinではなく
rpmパッケージでインストールした時の一般的な
ディレクトリである/usr/binや/usr/sbinなどと
するために、prefix = /usr などと変更できたり
するので、一応確認する必要はあるでしょう。 

さて難しいのはこの辺から。。

アンインストール時に残骸を残さずに綺麗に
お逝きいただくには、インストール時になにが
どこに配置されたかを詳しく知る必要があります。
以下の情報を元に探しだして消し去らなくてはなりません。

ーーー 以下インストール情報 ーーーー

install-sbinPROGRAMS: $(sbin_PROGRAMS)
@$(NORMAL_INSTALL)
@list=’$(sbin_PROGRAMS)’; test -n “$(sbindir)” || list=; \
if test -n “$$list”; then \
echo ” $(MKDIR_P) ‘$(DESTDIR)$(sbindir)'”; \
$(MKDIR_P) “$(DESTDIR)$(sbindir)” || exit 1; \
fi; \
for p in $$list; do echo “$$p $$p”; done | \
sed ‘s/$(EXEEXT)$$//’ | \
while read p p1; do if test -f $$p \
; then echo “$$p”; echo “$$p”; else :; fi; \
done | \
sed -e ‘p;s,.*/,,;n;h’ \
-e ‘s|.*|.|’ \
-e ‘p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/’ | \
sed ‘N;N;N;s,\n, ,g’ | \
$(AWK) ‘BEGIN { files[“.”] = “”; dirs[“.”] = 1 } \
{ d=$$3; if (dirs[d] != 1) { print “d”, d; dirs[d] = 1 } \
if ($$2 == $$4) files[d] = files[d] ” ” $$1; \
else { print “f”, $$3 “/” $$4, $$1; } } \
END { for (d in files) print “f”, d, files[d] }’ | \
while read type dir files; do \
if test “$$dir” = .; then dir=; else dir=/$$dir; fi; \
test -z “$$files” || { \
echo ” $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files ‘$(DESTDIR)$(sbindir)$$dir'”; \
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files “$(DESTDIR)$(sbindir)$$dir” || exit $$?; \
} \
; done

make uninstall コマンドでお逝きになるのは
以下の情報から環境設定ファイルを削除する程度で
あることが分かります。
ま、これすらないMakefileよりはマシ。。。と言った
ところでしょう。

ーーーー 以下アンインストール ーーーー

uninstall-sbinPROGRAMS:
@$(NORMAL_UNINSTALL)
@list=’$(sbin_PROGRAMS)’; test -n “$(sbindir)” || list=; \
files=`for p in $$list; do echo “$$p”; done | \
sed -e ‘h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)’ \
-e ‘s/$$/$(EXEEXT)/’ \
`; \
test -n “$$list” || exit 0; \
echo ” ( cd ‘$(DESTDIR)$(sbindir)’ && rm -f” $$files “)”; \
cd “$(DESTDIR)$(sbindir)” && rm -f $$files

ーーーー 以下省略 ーーーー

WindowsOSにしてもアンインストールしたつもりでも
レジストリには大量の情報が残置されています。
某有名ベンダーのセキュリティソフトなどは、アンインストール
したはずなのに、OS起動時の画面にロゴマークがでました。w
もちろんバグでしょうけどね。
ちなみにSOSが出たのでそれをぶち消しに行ってみると。。。
レジストリ内を商品名で検索したところ100以上のヒットが!
それらを全て削除してみるとロゴが出なくなりました。(笑

その点Linux系のパッケージでのインストールは楽ちんです。
アンインストール時には依存性により一緒にお逝きになる
モノすべてを表示してくれるので、気づかずにヤバいものを
消してしまうことはありませんから。

たとえば他のスパム避けに変更したいので
spamassasssinをアンインストールする場合。

# yum remove spamassasssin

削除:
spamassassin x86_64 3.3.1-3.el6 @updates 3.1 M
依存性関連での削除をします。:
amavisd-new x86_64 2.8.0-1.el6.rf @rpmforge 2.9 M

トランザクションの要約
====================================
削除 2 パッケージ

インストール済み容量: 6.0 M
これでいいですか? [y/N]

amavisd-newをアンインストールしても良い場合はyですが
拙宅サーバーのようにamavisdでウィルスメールを振り分けや
削除しているような時はprocmailなどに切り替えない限り
アンインストールできません。
一旦Nにしてyumから抜けた後、rpmコマンドに--nodeps
オプションで、依存性を無視してspamassasssinのみを削除します。

# rpm -e --nodeps spamassasssin
(# rpm -e spamassasssin では依存性を引きずるのでだめですよ。)

設定ファイルはバックアップとして残りますが、***.conf.rpmsave
のように必ず末尾に.rpmsaveが付与されます。
ワイルドカードを使ってfindコマンドで*.rpmsaveとすれば
見つけ出すのは簡単です。
必要ないので削除する場合はすぐに見つけることができるし、
再インストール時などで以前の設定を引き継ぐ時は、
***.conf.rpmsaveを***.confに戻してやればよいのです。

今日の結論

アンインストールまで考えると、できる限り
rpmパッケージを見つけて、パッケージ管理
することを強く推奨します。

yumとrpmは両者ともパッケージ管理のコマンドですが、
その違いなどは次回に。

*注
 難しいと言う主原因は拙生が無類の面倒くさがり屋なためであり
 マメな方はこの作業を得意としているのかもしれませぬ。

HOME

おすすめ