解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【Gentoo】Portage でのコンパイルは RAM 上でも可能

近年に Gentoo の導入が容易になった要因の一つとして、SSD の普及と高耐性化、それとRAMの容量の増大も挙げられます。

ソースコードからビルドする作業において、HDD上でビルドするとオーバーヘッドが何かにつけて大きくなります。 tarball をダウンロードして、それを展開するだけでも、オーバーヘッドは時間がかかります。 そして、コンパイルするのにもまた、いちいち読み出して書き込んでということをしますから、時間がかかります。 電力消費と発熱もやはり、増大します。

SSD上でビルドすれば速くなります。電力消費と発熱も少なくて済みます。 SSDは書き換え回数で寿命がありますが、最近のSSDは高耐性・長寿命になりました。

それでも、SSDの寿命がより縮んでしまうことはたしかです。 そこで、ビルドするディレクトリをRAM上に置く、具体的には tmpfs を使用する、というわけです。

/var/tmp/portage を tmpfs で mount しよう

Gentoo のデフォルトのパッケージマネージャである Portage は、 ビルド作業をデフォルトでは /var/tmp/portage で行います。

そして、これらのビルドも、インストールも、サンドボックス化、つまりシステム本体に直接にはインストールしない仕様になっています *1 。 したがって、インストールすべき「イメージ」も /var/tmp/portage 内にインストールしてから、システム本体にコピーするという処理を行っています。

だから、 /var/tmp/portage を tmpfs にして、つまり主にRAMを使用して(ただしスワップアウトすることもある)動的に確保するファイルシステムにすれば、 SSD 本体の書換は最小限で済みます。

zram のようなRAMディスクではなく tmpfs の方が良い理由は、

  • 実際に必要な容量しか消費せずに済む
  • RAMが足りなくなったらスワップアウトしてくれる

からです。

ちなみに元来は、 /var/tmp というディレクトリは、(/tmp なら中身が消えるのと異なり)再起動しても削除されるとは限らないという仕様であることが、 File Hierarchy Standard で決まっています。

それが tmpfs だと再起動時に消えてしまいますが、 /var/tmp/portage の中身は、 インストールに成功したパッケージのイメージは(不要だから)消したい人の方が多いでしょう(実際に、デフォルトでは消されます)。 インストールに失敗したものを精査するのでも、システム(マシン)自体を再起動してから精査するという状況でない限りは、再起動したら/var/tmp/portageのデータが消えても支障ありません。

/var/tmp/portage を tmpfs にする設定方法

/var/tmp/portage を tmpfs にする具体的な方法は、 Gentoo Wiki など各種情報があります。(Portage TMPDIR on tmpfs - Gentoo Wiki) 簡単に言えば、 /etc/fstab

none /var/tmp/portage tmpfs defaults,uid=portage,gid=portage,size=5g 0 0

などとして、RAMの容量を遣い切らない適度な範囲でRAMを確保します(上記では、 5GB にしている)。

ChromiumLibreOfficeなど、ビルドすると領域消費量の異様に大きいパッケージに関しては、上記 Gentoo Wiki での記事にも、特定パッケージだけを/var/tmp/portageでビルドさせないための設定方法が書いてあります。 (もっとも、LibreOfficeThunderbirdFirefox も、バイナリパッケージがあります。 Google Chrome をインストールして構わなければ、 Chromium は不要でしょう。)


この投稿は、Gentoo Advent Calendar 2015 - Qiita 9日めの記事です。

*1: Portage ではなく従来の make install をやるのでは、システム本体(いわゆる「本番環境」)にいきなりインストールしてしまいます。何をインストールしたのかという履歴も保存されません。Portage は、サンドボックス化することでインストールしたものの記録もとりますので、アンインストールもうまくやれるようになっているわけです。