読者です 読者をやめる 読者になる 読者になる

はてダ

はてブロなのにはてダ!!!!!

/usr/local とは何なのか

*nix

ソースからソフトウェアをビルドしてインストールするときに使う /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 の使い分けは確認出来たものの、アンインストールの課題は残った形に。

参考資料