(人に伝える用のメモ書きです.)
まず,Linuxでアプリケーションを使用したい場合,大きく以下の3つのやり方がある.
[方法A] パッケージマネージャを使用してバイナリを取得
apt, snap, dnf, yumなどを使用してインストールする方法.今ではこれが最も一般的かと思います.バイナリの取得,依存関係にあるソフトウェアの取得,それぞれのインストールまで一気通貫でやってくれます.その代わり,sudo権限が必要ですね.
例:
sudo apt update
sudo apt install xxxx -y
xxxx
[方法B] Webサイトなどからバイナリを取得
あらかじめ各環境向けのバイナリをビルドしていてくれて,ダウンロードしてそのまま使用できるタイプもありますね.今や,こちらを使用するように誘導しているソフトウェアはほとんどなくなり,パッケージマネージャを使用するよう示されているところが多いですね.
例:
wget https://example.com/xxxx
chmod +x xxxx
./xxxx
[方法C] ソースコード,依存ソフトウェア,ビルドツールを入手し,自前でバイナリをビルド
依存するソフトウェアやビルドツールがあれば,手元でビルドして使うこともできます.主にソースコードに手をいれて動作を変えたいとき・sudo権限がないが特定のアプリケーションを使用したい場合向けですね.
例:autotoolsを採用しているソフトウェアの場合 (他にCMake, Ninjaなどもある)
(事前に依存するソフトウェアの準備が完了しているものとする)
git clone https://example.com/xxxx.git
cd xxxx
./autogen.sh
./configure --some-configuration-options
make -j$(nproc)
# この段階ですでに build/xxxx などにバイナリが出来ている.
# ./build/xxxx などで直接実行することが可能
sudo make install # 実行すると,システム全体で使用できるようになる
xxxx
本題
ここでは方法Cを前提として,同一アプリケーションの複数のバージョンをホスト内に存在させ,適宜使い分ける方法を示す.
mkdir ~/a && cd ~/a
git clone https://example.com/xxxx.git && cd xxxx
vi somefile
〜
make -j$(nproc) # バイナリファイルが ~/a/xxxx/build/xxxx に生成される
mkdir ~/b && cd ~/b
git clone https://example.com/xxxx.git && cd xxxx
vi somefile
〜
make -j$(nproc) # バイナリファイルが ~/b/xxxx/build/xxxx に生成される
この段階で,2種類のバイナリをそれぞれ実行できる.
適宜両者を使い分けたいだけであれば,ここまででもOK.
Open vSwitchなど,システムにインストールしたほうが運用上使いやすいのであれば,
cd ~/a/xxxx && sudo make install
や
cd ~/b/xxxx && sudo make install
により,適宜使用したい方をインストールしなおすことで使い分けられる.
このとき,make -j$(nproc) などによる再ビルドは不要.あくまで make install のみ.
ただし,依存ソフトウェアやKernelがいつの間にかアップデートされていたりすると,うまく動作しない場合がある.その時は再度ビルドが必要.(make clean でビルド成果物を削除してから再度ビルド,インストール.)
注意点
- 現在使用していない方を make install する前に,現在使用しているアプリケーションを停止させる.(OVSであれば,ovs-ctl stop など.)
- もし止め忘れて新しい方で make install してしまったときは,
- 単一のバイナリを実行するだけのソフト
→ ps aux | grep xxxx でPIDを特定して kill する.pkill でもよい. - いろんなところから適宜実行されるソフト (OVSなど)
→ 元の方で再度 make install しなおして停止する
- 単一のバイナリを実行するだけのソフト
- もし止め忘れて新しい方で make install してしまったときは,
- ソフトウェアによっては,使用するパラメータをファイルやデータベースで保持している場合がある.その場合,バイナリの切り替えだけでは動作が思うように切り替わってくれない.
- ファイルやデータベースも複数作成して,それぞれ紐づけるなどの対応が必要
- OVSを使用していて,仮想スイッチの構成は同一でよい場合,あえてデータベースは複数作成せず,同一のものを複数のバイナリで参照させることもできる.