ソースからソフトウェアをビルドしてインストールするときに使う /usr/local ディレクトリだけど、/opt ディレクトリとの住み分けとか、 そもそも標準はどうなっているのかとか、まともに知らんかったので Filesystem Hierarchy Standard を確認してみた。
/usr/local は何をすべきところなのか?
- 他のホストと共有されない
- 既存のシステムの破壊防止
- FHS 準拠のソフトウェアをインストールする
/usr/localディレクトリ下自体が FHS 準拠になる
/usr/local ディレクトリは、システム管理者がソフトウェアをローカルにインストールするために用いる。 /usr/local ディレクトリとして隔離されるため、同名のファイル名で既存のファイルを上書きするなどして、 /usr ディレクトリを含め、システムが破壊されてしまうことが防止される。
また、 /usr/local ディレクトリ下は FHS 準拠のディレクトリ構造を取り、bin, etc, games, include, lib, man, sbin, share, src 以外のディレクトリを直下においてはならない。したがって、インストール後に、FHS 準拠のディレクトリ構造が展開されるソフトウェアをインストールするのに用いる。FHS 準拠というのは、./configure --prefix=/usr/local としたときに、/usr/local/bin に実行可能ファイルが、/usr/local/etc に設定ファイルがインストールされるといった、一般的な UNIX ソフトウェアのことと考えて間違いはないはず。例えば、 apache とか nginx とか。
あと、おそらくだけど、/usr が読み取り専用 (read-only) として規定されているから、/usr/local も読み取り専用と思われる。
--prefix=/usr/local/apache はダメ
/usr/local ディレクトリ下自体が FHS 準拠になることから、/usr/local/apache というように、ソフトウェア別にディレクトリを切り分けてはならない。
/usr と /usr/local の住み分け
/usrは、他の FHS 準拠ホストと共有される可能性がある/usr/localは、他の FHS 準拠ホストと共有される可能性がない/usrのソフトウェアをアップデート・置換する目的以外の場合、/usr/localにインストールする
/usr は、 FHS 準拠の複数ホスト間で共有される可能性がある。したがって、/usr ディレクトリにはホスト固有情報を設置してはならない。
/usr/local の説明によれば、/usr ディレクトリ内のソフトウェアをアップデート・置換する目的以外は、/usr/local をソフトウェアのインストール先とするようにとされている。したがって、新規ソフトウェアをインストールする際は、基本的に、 /usr ではなく /usr/local を用いる方針で間違いはない。
/opt と /usr/local の住み分け
/optは、/opt/{package,provider}というディレクトリ構造を取る/optは、 package, provider ごとにディレクトリを切り分けても良い/usr/localは、 package, provider ごとにディレクトリを切り分けてはならない
前述のとおり、/usr/local ディレクトリ下は FHS 準拠となるから、ソフトウェア名でディレクトリを切り分けることができない。一方で、/opt はソフトウェア名でディレクトリを切り分けることができる。また、 /opt/bin, /opt/doc, /opt/include, /opt/info, /opt/lib, /opt/man の各ディレクトリは予約済み (reserved) ディレクトリで、システム管理者はこのディレクトリを使うことができる。
なので、今まで --prefix=/usr/local/apache などという指定をしてきたけど、本当は --prefix=/opt/apache が正しかった。
アンインストールの課題
/optを使う?- paco を使う?
- dpkg, rpm 形式にしておく?
ソフトウェアごとにディレクトリを切ることで、ディレクトリごと削除すればいいので、アンインストールが簡単になる。ただ、 FHS の規定通りに /usr/local へインストールすると、他のバイナリと混ざってしまうため、アンインストールが困難になる。 では、ソフトウェアごとにディレクトリを切ることが許されている /opt 以下にインストールするべきなのだろうか。ただ、 /usr/local は、パスが通っているし FHS 準拠でだから、アンインストールが困難な点を除けば、最善の方法に思える。 dpkg, rpm 形式にしておくのがいいんだろうか。 paco や make -n install を用いてアンインストールに備えることもできるけど。。。あと、chroot でサンドボックスを作成して、サンドボックス内で変更ファイルを洗い出す方法も Stackoverflow あたりで見かけたんだけど、履歴に残ってない…どういうこっちゃ。この課題については、どうにもスッキリしない…
というわけで、/usr/local と /usr と /opt の使い分けは確認出来たものの、アンインストールの課題は残った形に。