ヤルキデナイズド

Unclassified Articles on Software and IT

Raspberry Pi の Arch Linux にスワップを設定して Ruby をビルドする

何も考えずに rbenv install 2.0.0-p247Ruby をビルドしたところ、メモリ不足でプロセスが kill されてしまった。もともとメモリが512MBしかないうえに tmpfs がその半分を利用し、デフォルトではスワップ領域も設定されていないので、大きなアプリケーションのビルドは厳しいようだ。

そこでスワップファイルをスワップ領域として使うように設定する(参考:Swap (日本語) - ArchWiki):

# スワップ領域が設定されていないことを確認する
# 何も出力されなければ OK
$ swapon -s

# 空のスワップファイルを作る
# dd でもいいが fallocate を使うほうが速い
$ sudo fallocate -l 1G /var/swapfile

# スワップファイルをフォーマットする
$ sudo mkswap /var/swapfile

# スワップ領域を有効にする
$ sudo swapon /var/swapfile

# スワップ領域が設定されたことを確認する
$ swapon -s
Filename                                Type            Size    Used    Priority
/var/swapfile                           file    1048572 0       -1

# 起動時にスワップ領域をマウントするよう /etc/fstab に設定を追加する
$ sudo sh -c 'echo "/var/swapfile none swap defaults 0 0" >> /etc/fstab'

これでスワップ領域を設定できた。ついでに /tmp ディレクトリのサイズも拡張してしまおう。

/tmp ディレクトリは tmpfs によってメモリ上に確保されており、デフォルトでは実メモリの半分の容量がディレクトリサイズの上限となっている(RaspberryPi ModelB では230MB程度)。 /tmp は systemd が自動的にマウントするので、 systemd の設定ファイルを追加してマウント時にサイズを指定してやればよい(参考:systemd (日本語) - ArchWiki):

# デフォルトのマウント設定ファイルは /usr/lib/systemd/system/tmp.mount
# この一部を上書きする設定ファイルを以下のディレクトリに入れる
$ sudo mkdir -p /etc/systemd/system/tmp.mount.d
$ cd /etc/systemd/system/tmp.mount.d

# デフォルトのオプションに `size=1G` を追加したものを *.conf に保存する
# ここでは increase-size.conf とした
$ sudo sh -c 'echo "[Mount]\nOptions=mode=1777,strictatime,size=1G" >> increase-size.conf'

# 設定をリロードする
$ sudo systemctl --system daemon-reload

# 追加した設定ファイルがロードされたか確認する
$ systemctl status tmp.mount
tmp.mount - Temporary Directory
   Loaded: loaded (/usr/lib/systemd/system/tmp.mount; static)
  Drop-In: /etc/systemd/system/tmp.mount.d
           └─increase-size.conf # ←これがあれば OK
(後略)

# /tmp を再マウントする
$ sudo systemctl restart tmp.mount

# 追加した設定を使ってマウントが行われたか確認する
$ systemctl status tmp.mount
(中略)
  Process: 3014 ExecRemount=/bin/mount tmpfs /tmp -t tmpfs -o remount,mode=1777,strictatime,size=1G (code=exited, status=0/SUCCESS)
  # ↑size=1G が反映されていれば OK

# /tmp ディレクトリのサイズを確認する
$ df -h
(中略)
tmpfs           1.0G     0  1.0G   0% /tmp # ←1.0Gになっていれば OK

これで Ruby をビルドする準備が整った。

$ rbenv install 2.0.0-p247

数時間かかるので気長に待つ。