stowによるローカルパッケージ管理

stowによるローカルパッケージ管理方法を記す。

導入

何か新しいソフト(パッケージ)をパソコンにインストールするとき,方法がいろいろある。例えば,インストーラーを使ったり,ソースコードから自分でインストールしたりだ。こうしたパッケージのインストールを管理するために,OSごとにパッケージマネージャーが存在する。

WindowsであればNuGetやChocolatey,LinuxであればAPT (Debian系),yum/DNF (RedHat 系),MacであればMacportsやhomebrew,FreeBSDであればports,Cygwinであればapt-cygなどが該当する。

これらのパッケージマネージャーを使えば,コマンド一発で必要なソフトをインストールできて楽だ。しかし,以下のような欠点もある。

パッケージマネージャーの欠点
  • OSごとにコマンドが異なる
  • 管理者権限が必要
  • インターネット接続が必要
  • OSにインストールするため影響範囲が大きい
  • 最新(開発版)ソースをインストールできない

客先のパソコンや,レンタルサーバーでの利用を考えると,特に管理者権限が必要なのがネックになる。

これらの問題を解決するために,ローカルでパッケージ管理する方法がある。ローカルでパッケージを管理するとは,ソースコードから自分でソフトをビルドしてインストールすることだ。

単純に自分でビルド・インスト―ルすると,どのパッケージがインストールされているかの把握や,アンインストール方法などけっこう煩雑である。これを簡単にするために,ローカルパッケージマネージャーが存在する。

具体的にはstowporg (旧: paco) が存在する。それぞれで同じようなことができるのだが,porgには以下の欠点がある。

porg(paco)の欠点
  • glibcに依存しているため,FreeBSDやMac,Cygwinなどglibcを使えない環境では利用不可能
  • 一時的に管理中のソフトのバージョンを差し替えるといったことが手間

stowでmake installしたパッケージを管理

そのため,stowを使ったローカルパッケージ管理がオススメだ。

stowはPerlで作られており,Perlがインストールされていれば使うことができる。また,C++で作られている xstowも存在する。こちらはオプションが多く,stowのほぼ上位互換でもある。ただし,xstow自身のインストールにC++コンパイラー (g++) が必要であるため,stowのほうがインストールは楽だ。

2014年頃から,自分でソースコードからビルドしたソフトはstowで管理している。今後もそうするつもりでいる。そこで,stowのインスト―ル方法と簡単な使い方を解説する。

なお,stowという英単語には「ものをしまい込む」といった意味がある。

インストール

Ubuntu 16.04にインストールする手順を記す。

インストール情報
項目 説明
配布元 Stow – GNU Project – Free Software Foundation
インストール手順 INSTALL.md – stow.git – stow
依存先 GNU Make, Perl 5.6.1+
依存元
ビルド環境 Ubuntu 16.04

以下の手順を実行することで,$HOME/.local/stow/stow-2.2.2にstowがインストールされ,$HOME/.local/{bin,share}にstow-2.2.2でインストールしたファイルが展開される。

インストール手順
LOCAL=~/.local
PKG=stow
VER=2.2.2

mkdir -p $LOCAL/src
cd $LOCAL/src

## Download
wget -nc http://ftp.gnu.org/gnu/$PKG/$PKG-$VER.tar.bz2
tar -xf $PKG-$VER.tar.bz2

## Build
cd $PKG-$VER
./configure --prefix=$LOCAL/stow/$PKG-$VER
make && make install

## Stow
cd $LOCAL/stow
./stow-$VER/bin/stow $PKG-$VER

インストールが完了したら,パスの設定をしておく。以下の内容を~/.profile~/.bashrcなどに記述しておく。

LOCAL=~/.local
PATH="$LOCAL/bin:$PATH"
LD_LIBRARY_PATH="$LOCAL/lib64:$LOCAL/lib:$LD_LIBRARY_PATH"
LDFLAGS="-L$LOCAL/lib64 -L$LOCAL/lib"
CPATH="$LOCAL/include:$CPATH"
PKG_CONFIG_PATH="$LOCAL/lib/pkgconfig:$PKG_CONFIG_PATH"
MANPATH="$LOCAL/share/man:$MANPATH"
MANDATORY_MANPATH="$MANPATH:$MANDATORY_MANPATH" # for Busybox
INFOPATH="$LOCAL/share/info:$INFOPATH"

export PATH LD_LIBRARY_PATH CPATH PKG_CONFIG_PATH LDFLAGS export MANPATH MANDATORY_MANPATH INFOPATH

使い方

stowの大まかな構成と使い方について説明する。

stowは,stowディレクトリーに一度自力でビルドしたソフトをインストールし,そこからシンボリックリンクを貼り,通常利用するbinlibディレクトリーにパスを通すことでローカルパッケージ管理を実現している。

そのため,違うバージョンのソフトへの差し替えはシンボリックリンクを差し替えるだけでよく,簡単にバージョンを切り替えられる。

stowの使い方について解説したスライドがあるので,以下に掲載しておく。

stowの作業フロー図

上記のフロー図を踏まえて,stowでのローカルパッケージ管理フローは以下のとおりとなる。

stowでのローカルパッケージ管理フロー
  1. ローカルパッケージのルートディレクトリー (/usr/local/~/.localなど。以後は$LOCALで表記) を用意。
  2. ソースコードをダウンロードして,インストール先に$LOCAL/stow/パッケージ名-バージョンを指定してビルド・インストール。
  3. インストール後,$LOCAL/stowディレクトリー (stowディレクトリー) に移動し,stow パッケージ名-バージョンを実行 (stow -d $LOCAL/stow パッケージ名-バージョンのように-dでstowディレクトリーを指定しても可)。
  4. $LOCAL/stow/パッケージ名-バージョン/配下から$LOCAL/配下にシンボリックリンクが貼られる。
  5. パッケージを無効化したい場合,$LOCAL/stowに移動して (-dで指定しても可),-Dオプションパッケージを指定すれば,シンボリックリンクが解除される (stow -d $LOCAL/stow -D パッケージ名-バージョン)。

なお,stowコマンドでパッケージのシンボリックリンクを貼るときに,ディレクトリーが存在しない場合,stowが自動でディレクトリーを作成する。また,パッケージが一つも存在しない場合は自動的にディレクトリーを削除してくれるので,自分でディレクトリーを用意する必要はない。

エラー対応

stowでいくつかのパッケージを管理しているとエラーが起きてしまうことがある。

senooken% 2-0: stow readline-7.0
WARNING! stowing readline-7.0 would cause conflicts:
  * existing target is stowed to a different package: share/info/dir => ../../stow/stow-2.2.0/share/info/dir
All operations aborted.

これは,stowで展開しようとしたとき,share/info/dirファイルが複数のパッケージで競合したために発生する。

この問題を回避するには,stowのオプションに--ignore=dirを指定する。–ignoreオプションで競合したときに無視するファイルを指定できる。値にはPCRE形式の正規表現も利用可能であり,dir以外にも競合した場合に指定すれば回避できる。

毎回オプションを手動で指定するのが面倒であれば,以下のようなalias~/.profile~/.bashrcなどに記述してやれば以後はひとまず問題ない。

alias stow="stow --ignore='dir|gschemas.compiled|icon-theme.cache'"

なお,xstowにはこの競合時の対応方法が用意されている。こちらは余裕があれば調査して記事にする。

ローカルパッケージの管理場所

stowでローカルパッケージ管理する場所について記述しておく。

基本的にstowでローカルパッケージ管理する場所はユーザーの自由だが,標準として推奨されているディレクトリーがあるのでそちらに準拠しておくのがよい。

標準としては,FHS (File Hierarchy Standard) とfreedesktop.orgのDesktop base directory specの2種類が存在する。FHSはUNIX系OSで標準的なディレクトリー構成を定めたものであり,freedesktop.orgはUNIX系OSのデスクトップ環境について仕様を定めている。

それらで定義されているパッケージ管理と関連するディレクトリーを以下にまとめる。

標準的なパッケージの管理場所
ディレクトリー 標準 説明
/ FHS OSに必要なものを管理している場所。
/usr FHS パッケージマネージャーやOSが管理している場所。
/opt FHS 追加のソフトウェアパッケージの管理場所。
/usr/local FHS システム管理者が自分でインストールする場所。
$HOME/.local freedesktop.org ユーザー個別のデータファイルのインストール場所。

標準に従うと,ユーザーやシステム管理者が自分でインストール場所として選べるのは,/opt, /usr/local, $HOME/.localの3箇所のみとなる。

これらの使い分けは以下の通りに行うのがよいだろう。

  • システム全体で使いたい場合:/usr/localにインストール。
  • 特定のユーザーだけが使う場合:$HOME/.localにインストール。
  • /optには,BlueGriffon,JavaFXのGUI BuilderであるSceneBuilderなど特定のパッケージを配置。

/usr/localはアクセスに管理者権限が必要なので,ユーザー権限だけでインストールする場合,$HOME/.local一択となる。

これらのパッケージは自分の名前のディレクトリーを持っており,/opt/パッケージ名のディレクトリー構成となっている。パッケージの内のディレクトリー構成もばらばらであることがある。stowで管理するパッケージはAutotoolsで作られるようなディレクトリー構成({bin,lib,share}など)に適しているため,これらのサードパーティ製のパッケージの管理は,全体で使いたい場合は/opt,ある特定のユーザーだけが使う場合は$HOME/.local/optなどに配置するのがよいだろう。

$HOME/.localはあまりみなれないかもしれないが,このディレクトリーはPythonやRubyのパッケージマネージャーpipとgemがローカルにパッケージをインストールする際に使っている。そのため,既存のツールとの親和性も高く,余計なディレクトリーを作る必要がなくなるので,このディレクトリーで管理するのが望ましい。

まとめ

stowによるローカルパッケージ管理について解説した。レンタルサーバーや最新版,開発版を試したい場合など,パッケージマネージャーに頼らず自分でインストールする必要になることがある。そうしたときに,stowで管理しておくと統一的に扱えて効率がいい。

実際にはApach HTTP ServerなどAutotoolsの形式に準拠していないパッケージもあるので全てでstowの管理が使えるとは限らない。しかし,stowによりかなりのパッケージに対応できる。

今後,このブログでソフトのインストールには,stowを使うので,初見の人はこの記事を参照してもらうことになるだろう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です