Debian noroot 環境に Linuxbrew を導入する

# はじめに

[Debian noroot][DBNR] とは、 [Android OS][ANDR] 上において root 権限を取ることなく [Debian 環境][DEBI]を構築するためのアプリケーションです。
CPU の性能とメモリ容量が潤沢にある Android 端末であれば、 [Debian noroot][DBNR] の導入によって Android 端末上で非常に軽快な [Debian 環境][DEBI]を実現することができます。

ここで、 [Debian noroot 環境][DBNR]の制約上、 [Debian noroot 環境][DBNR]において動作に問題のあるパッケージが存在する場合、当該パッケージのソースコードを修正してビルドし、 [Debian noroot 環境][DBNR]上に導入する手法を取ることにより、問題の解決が可能になることがあります。

また、 [Debian 環境][DEBI]において、　```apt-get``` コマンドを用いてパッケージを導入する場合、安定性の観点より、当該パッケージのバージョンが最新のバージョンと比較して古いバージョンとなっている事が多い為、当該パッケージをソースコードからビルドし、[Debian noroot 環境][DBNR]上に導入する場合があります。

このような場合、当該パッケージのソースコードを手動でダウンロードした上でビルドし、 ```/usr/local``` のような適当なディレクトリにインストールする手法が取られますが、そのまま適当なディレクトリにソフトウェアをインストールすると、ソフトウェアをアップグレードしたりアンインストールする場合に作業が非常に煩雑になる問題が発生します。

ここで、 Linux の各ディストリビューション上におけるソースコードの取得及びビルドに基づいたパッケージ管理システムである [Linuxbrew][BREW] を [Debian noroot 環境][DBNR]に導入すると、ソフトウェアのソースコードの取得及びビルドにおいて、ライブラリ等の依存関係及び差分ファイルの適用等をコマンドライン上から容易に体系的かつ統合的に行うことが出来、かつ [Debian noroot 環境][DBNR]に対応したソフトウェアを容易に導入することが可能になります。

本稿では、[Debian noroot 環境][DBNR]に [Linuxbrew][BREW] を導入する手法について記述します。

本稿では最初に、 "[Linuxbrew に依存する Debian パッケージの導入][CHAP01]" の章において、 [Linuxbrew][BREW] の導入にあたって必要となる [Debian][DEBI] パッケージをインストールする手法について述べます。

次に、 "[Linuxbrew の導入][CHAP02]" の章において、 [Linuxbrew][BREW] の本体のリポジトリを導入する為の具体的な手法について述べます。

最後に、 "[結論][CHAP03]" の章において本稿の結論について述べます。

なお、本稿においては、 [Linuxbrew][BREW] に関する各種用語等の詳細に関しては、具体的な説明を割愛致します。 [Linuxbrew][BREW] に関する詳細については、 [Linuxbrew の公式ページ][BREW] 及び [Linuxbrew][BREW] 本体のリポジトリに同梱する各種ドキュメントを参照して下さい。 

# Linuxbrew に依存する Debian パッケージの導入

まず [Debian noroot 環境][DBNR]に [Linuxbrew][BREW] を導入する為には、[Linuxbrew の公式ページ][BREW]を参考にして、

- ソースコードをビルドするために必要なパッケージをインストールする為のメタパッケージである ```build-essential```
- ソースコードのダウンロードを行う [Curl][CURL] を導入するためのパッケージである ```curl```
- [Linuxbrew][BREW] の本体等の記述言語となる [Ruby][RUBY] を導入するパッケージである ```ruby```
- [Linuxbrew][BREW] を [git][GITS] のリポジトリとして管理する為のパッケージである ```git```

等の [Debian][DEBI] パッケージを下記のように導入する必要があります。

```shell-session
 $ sudo apt-get install build-essential curl file git python-setuptools ruby
```

また必要に応じて、任意に以下のパッケージを [thermes 氏][THER]による "[Linuxbrew のススメ][THBR]" の記事を参考にして下記のように導入します。

```shell-session
 $ sudo apt-get install m4 texinfo libbz2-dev libcurl4-openssl-dev libexpat-dev libncurses-dev zlib1g-dev gettext
```

以上の [Debian][DEBI] パッケージの導入により、 [次章][CHAP02]にて述べる [Linuxbrew][BREW] の本体のリポジトリの導入が可能になります。

# Linuxbrew の導入

本章では最初に、 "[Linuxbrew 本体のリポジトリの導入][SEC0201]" の節において、 [Linuxbrew][BREW] の本体のリポジトリを導入する為の具体的な手法について述べます。

次に、 "[環境変数の設定][SEC0202]" の節において、 [Linuxbrew][BREW] に関連する環境変数の設定について述べます。

そして、 "[Linuxbrew の動作確認][SEC0203]" の節において、導入を行った [Linuxbrew][BREW] の正常な動作の確認手法について述べます。

最後に、 "[Tap リポジトリ z80oolong/debian-noroot の導入][SEC0204]" の節において、 [Debian noroot 環境][DBNR]に対応したソフトウェアを導入するための Formula 群を集めた Tap リポジトリである [z80oolong/debian-noroot][HBZD] の導入手法について述べます。

## Linuxbrew 本体のリポジトリの導入

まず最初に、下記のコマンドを実行して [Linuxbrew][BREW] 本体のリポジトリを導入します。

```shell-session
 $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
なお、 [32 bit ARM アーキテクチャ][ARMP]及び [64 bit x86 アーキテクチャ][X86P]以外を搭載した携帯端末にインストールされた [Debian noroot 環境][DBNR]に [Linuxbrew][BREW] を導入する場合、前述の [Linuxbrew][BREW] の本体のリポジトリを導入するコマンドを実行すると、途中で [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]の bottle ファイルの取得に失敗して、導入作業が正常に行われません。

従って、これらの携帯端末における環境の場合は、 "[Linuxbrew の自動的なインストールスクリプトが異常終了する場合における代替の導入手法][ZOQ2]" の投稿に基づき、 [Linuxbrew の開発コミュニティ][BREW]による [Linuxbrew][BREW] のインストールスクリプトに代えて、[導入作業に関する問題を回避した代替のスクリプト][GIT1] (以下、代替スクリプトと記述) を実行する必要があります。

代替スクリプトの起動方法は、 [Linuxbrew 公式ページ][BREW]による [Linuxbrew][BREW] のインストールスクリプトの起動方法とほぼ同じですが、 [ruby 処理系][RUBY] をソースコードからインストールする場合に ```libssl-dev, readline, libyaml, libgdbm-dev, libdb-dev``` が必要となることから、予め代替のスクリプトの起動前に、 [Linuxbrew][BREW] に依存するシステムのパッケージの他に、これらのパッケージをインストールする必要が有ります。

```
 $ sudo apt-get install libssl-dev libreadline6-dev libyaml-dev libgdbm-dev libdb-dev
```

次に、以下のコマンドを実行して [Linuxbrew][BREW] 本体のリポジトリを導入します。

```
 $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/z80oolong/linuxbrew-altinstall/master/install.sh)"
```

上記コマンドにより、 [Linuxbrew][BREW] 本体のリポジトリがディレクトリ ```/home/linuxbrew/.linuxbrew``` に導入されます。

[Debian noroot 環境][DBNR]上では、ディレクトリ ```/home``` が一般ユーザに対して書き込み可能な権限となっているために、**環境変数等の設定に関わらず、 [Debian noroot 環境][DBNR]における [Linuxbrew][BREW] の本体のリポジトリの導入先は、ディレクトリ ```/home/linuxbrew/.linuxbrew``` に固定されます。**

## 環境変数の設定

次に、各種 ```brew``` コマンドの実行等を可能にするために、下記の通りに bash の初期化ファイル ```${HOME}/.bashrc``` に追記を行い、 bash の再起動を行います。

```sh:${HOME}/.bashrc
...
export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"                    # Linuxbrew の本体のリポジトリが存在するディレクトリ。
export PATH="${HOMEBREW_PREFIX}/sbin:${HOMEBREW_PREFIX}/bin:$PATH"     # 環境変数 PATH にディレクトリ ${HOMEBREW_PREFIX}/sbin 及び ${HOMEBREW_PREFIX}/bin を追記。
export MANPATH="${HOMEBREW_PREFIX}/share/man:${MANPATH}"               # 環境変数 MANPATH, INFOPATH についても同様。
export INFOPATH="${HOMEBREW_PREFIX}/share/info:${INFOPATH}"
export HOMEBREW_NO_AUTO_UPDATE=1                                       # brew install コマンドが毎回実行される度に Linuxbrew の本体のリポジトリが自動的に update されるのを抑止。
...
```
特に、 [Debian noroot 環境][DBNR]上において ```brew install``` コマンド等を迅速化するために、**環境変数 ```HOMEBREW_NO_AUTO_UPDATE``` を 1 に設定し、 ```brew install``` コマンド等が毎回実行される度に [Linuxbrew][BREW] の本体のリポジトリが自動的に更新されるのを抑止します。**
この場合、 [Linuxbrew][BREW] の本体のリポジトリを更新するには、手動で明示的に ```brew update``` を実行する必要があります。

また、 [Linuxbrew][BREW] が [Debian 環境][DEBI]の実行に影響を与えるのを避けるために、**環境変数 ```LD_LIBRARY_PATH``` の値は空とすることを強く勧めます。**

## Linuxbrew の動作確認

[前節][SEC0202]の設定を完了した後は、下記のコマンドを実行して、 [Linuxbrew][BREW] が正常にインストールされていることを確認します。

```shell-session
 $ brew doctor
```

**ここで、 [Debian noroot 環境][DBNR]の実行に必要となる環境変数 ```LD_PRELOAD``` の設定に関する警告を除き、**警告及びエラーが表示されなければ問題なく [Linuxbrew][BREW] がインストールされています。

そして、下記コマンドを実行して、実際に [Linuxbrew][BREW] に ```hello``` コマンドの導入を行います。

```shell-session
 $ brew install -dv hello
```

この時、**ソースコードからの ```hello``` コマンドのビルドに非常に時間が掛かりますが、我慢強くインストールの完了を待つ必要があります。この場合、 Android 端末に CPU の性能とメモリ容量が潤沢にあれば、別に他の必要な [Android OS][ANDR] アプリを起動して [Linuxbrew][BREW] でのインストールの完了を待っても構いません。**

上記コマンドによる ```hello``` コマンドのインストールが完了した後は、下記のようにして問題なく [Linuxbrew][BREW] に ```hello``` コマンドの導入が行われていることを確認します。

```shell-session
 $ which hello
 /home/linuxbrew/.linuxbrew/bin/hello
 $ hello
 世界よ、こんにちは！
 $
```

## Tap リポジトリ z80oolong/debian-noroot の導入

最後に下記のコマンドを実行して、 [Linuxbrew][BREW] のリポジトリに、 [Debian noroot 環境][DBNR]に対応した各種ソフトウェアの導入を可能にするための Formula 群を含む Tap リポジトリである [z80oolong/debian-noroot][HBZD] を導入します。

```shell-session
 $ brew tap z80oolong/debian-noroot
```

これにより、 "[Debian noroot 環境において dropbear に基づく SSH サーバを導入する][ZOLQ]" の投稿で述べた ```dropbear``` デーモン等の各種 [Debian noroot 環境][DBNR]に対応したソフトウェアの導入が可能になります。

なお、 Tap リポジトリ [z80oolong/debian-noroot][HBZD] 及び Tap リポジトリに含まれる Formula に関する詳細については、 Tap リポジトリに同梱した [README.md][HZDR] 及び [FormulaList.md][HZDF] を御覧下さい。

# 結論

本稿において、 Linux の各ディストリビューション上におけるソースコードの取得及びビルドに基づいたパッケージ管理システムである [Linuxbrew][BREW] を [Debian noroot 環境][DBNR]に導入するために、まず最初に、ソースコードをビルドするために必要なパッケージをインストールする為のメタパッケージである ```build-essential``` を始め、 [Linuxbrew][BREW] に依存する各種 [Debian][DEBI] パッケージの導入を行いました。

次に、 [Linuxbrew][BREW] の本体のリポジトリの導入及び、環境変数 ```PATH``` 等の [Linuxbrew][BREW] の実行に必要な環境変数の設定等を行った後に、 ```brew doctor``` コマンド等を実行して実際に [Linuxbrew][BREW] が問題なく導入されているかを確認しました。

最後に、 ```brew tap``` コマンドの実行によって [Debian noroot 環境][DBNR]に対応した各種ソフトウェアの導入を可能にするための Formula 群を集めた Tap リポジトリである [z80oolong/debian-noroot][HBZD] の導入を行うことにより、 [Debian noroot 環境][DBNR]において [Linuxbrew][BREW] に基づいた各種ソフトウェアの導入が可能となりました。

# 謝辞

本稿の記述に当たって、最初に [Android OS][ANDR] 端末上で非常に軽快な [Debian 環境][DEBI]を実現することを可能にした [Debian noroot 環境][DBNR]の開発者である [pelya 氏][PELY]に心より感謝致します。

次に、 [Debian 環境][DEBI]への [Linuxbrew][BREW] の導入の詳細に関しては、 [thermes 氏][THER]による "[Linuxbrew のススメ][THBR]" の投稿を大いに参考にしました。 [thermes 氏][THER]に心より感謝致します。

そして、 [Linuxbrew][BREW] の本体のリポジトリの開発を行っている [Shaun Jackman 氏][SHAU]を始めとする [Linuxbrew][BREW] の開発コミュニティの各氏に心より感謝致します。また、 [Linuxbrew][BREW] の詳細に関しては、 [Linuxbrew 公式ページ][BREW]も併せて参考にしました。

最後に、 [Debian noroot 環境][DBNR]と [Android OS][ANDR] 及び [Debian 環境][DEBI]の全ての事に関わる全ての皆様に心より感謝致します。

# 追記とお断り

## 2018/01/22 現在の追記とお断り

[64 bit ARM アーキテクチャ等の環境で動作する Debian noroot 環境への Linuxbrew の導入に関する問題の解決手法][ZOQ2]について加筆を行い、本稿を改稿致しました。どうか御了承下さい。

## 2018/02/04 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプトの作成と公開][GIT1]に伴い、本稿を改稿致しました。どうか御了承下さい。

## 2018/06/08 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプト][GIT1]の更新と、代替スクリプトの実行手法の変更に伴い、本稿を改稿致しました。どうか御了承下さい。

## 2018/10/11 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプト][GIT1]の実行の際に、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]をソースコードからコンパイルする際に必要となるパッケージについて訂正を行いました。どうか御了承下さい。

<!-- 各章及び各節へのリンク一覧 -->

[CHAP01]:#linuxbrew-に依存する-debian-パッケージの導入
[CHAP02]:#linuxbrew-の導入
[CHAP03]:#結論
[SEC0201]:#linuxbrew-本体のリポジトリの導入
[SEC0202]:#環境変数の設定
[SEC0203]:#linuxbrew-の動作確認
[SEC0204]:#tap-リポジトリ-z80oolongdebian-noroot-の導入
[SEC0205]:#32-bit-arm-及び-64-bit-x86-アーキテクチャ以外を搭載した携帯端末での導入について

<!-- 外部リンク一覧 -->

[DBNR]:https://play.google.com/store/apps/details?id=com.cuntubuntu&hl=ja
[ANDR]:https://www.android.com/intl/ja_jp/
[DEBI]:https://www.debian.org/index.ja.html
[BREW]:http://linuxbrew.sh/
[THER]:https://qiita.com/thermes
[THBR]:https://qiita.com/thermes/items/926b478ff6e3758ecfea
[LDNT]:https://github.com/z80oolong/homebrew-debian-noroot/
[CURL]:https://curl.haxx.se/
[RUBY]:https://www.ruby-lang.org/ja/
[GITS]:https://git-scm.com/
[THER]:https://qiita.com/thermes
[THBR]:https://qiita.com/thermes/items/926b478ff6e3758ecfea
[HBZD]:https://github.com/z80oolong/homebrew-debian-noroot
[ARMP]:https://www.arm.com/
[X86P]:https://www.intel.co.jp/content/www/jp/ja/homepage.html
[ZOLQ]:https://qiita.com/z80oolong/items/7bdfc322fa586f5d4a30
[ZOQ2]:https://qiita.com/z80oolong/items/61feb20a9356532a15da
[ZOQ3]:https://qiita.com/z80oolong/items/61feb20a9356532a15da#64-bit-arm-アーキテクチャの環境に導入する場合
[ZOQ4]:https://qiita.com/z80oolong/items/61feb20a9356532a15da#64-bit-arm-アーキテクチャの環境以外に導入する場合
[HZDR]:https://github.com/z80oolong/homebrew-debian-noroot/blob/master/README.md
[HZDF]:https://github.com/z80oolong/homebrew-debian-noroot/blob/master/FormulaList.md
[GIT1]:https://github.com/z80oolong/linuxbrew-altinstall
[RUBY]:https://www.ruby-lang.org/ja/
[PELY]:https://github.com/pelya
[SHAU]:http://sjackman.ca/