12. Raspberry Pi で自宅サーバー
唐突にサーバー機が変更になりました。諸般の事情がありまして、

Raspberry Pi 1 Model B+ です。これに伴い、OSも ARM 系CPUに対応した Raspberry Pi 向け派生版 Debian の Raspbian になりました。この組み合わせに先代サーバー同様、Ruby + Phusion Passenger + Nginx + Sinatra の構成でこのサイトを稼働させております。
やはり Debian 系ということで、サーバー構築にあたっては従来の Ubuntu Server での経験がそのまま応用できることがほとんどでわりと楽でしたが、そうはいってもそのまんま同じというわけにもいかず、注意すべき点がいくつかありました。今回はそのへんについてご紹介。
1.OSインストールに必要なもの
- Raspberry Pi 1 Model B+ 本体
-
当たり前ですが、必須です。ケースは別売りです。テストだけならともかく、実際にサーバーとして使い続けるつもりならケースもあった方がいいでしょう。
- microSDカード
-
Raspberry Pi 1 Model B+ には SATA とかはない代わりにmicroSDカードスロットがあり、これが内部ストレージ用として使われます。
Raspberry Pi のサイトの SETUP のページ では「8GB・class4推奨」とあります。ただし、これは NOOBS という Raspberry Pi 用のインストールマネージャーを使う場合の話です。NOOBS を使うのが Raspbian あるいは他の Raspberry Pi 対応のOSインストールの常道なのですが、GUI とかサーバー用途には必要のないものまでインストールされてしまうため、NOOBS は使わず、ネットインストールでいきます。
Raspbian をネットインストールする場合、microSDカードは2GBでも足ります(やってみた)。あくまでOSだけのインストールですが。
実際に稼働しているこのサーバーでは追加でもろもろインストールしているのに加え各種データがあるので、2015年3月現在、8GBのmicroSDカードのざっと6割ほどが使用済みとなっています。ご参考まで。
- LANケーブル及び有線LANが使えるインターネット接続環境
-
ネットインストールにするのでインターネット接続環境も必須になります。Raspberry Pi 1 Model B+ には有線LANのインターフェイスが搭載されているので、これを使います。
- 電源ケーブル
-
ちょっと驚きですが、Raspberry Pi 1 Model B+ に電源ケーブルは付属していません。コストダウンのためでしょうが、「ケータイやスマホ用のMicroUSBアダプタを流用してね!」ってことらしいです。実際、ウチのスマホやタブレットの充電用のMicroUSBアダプタで動作しました。規格は5Vで700mA以上のものとなっています。
学習用途なら一時的に他の用途のものを流用してもいいでしょうが、サーバー用途では使いっぱなしになるので、わたしは別に ELECOM の MPA-ACMA2510WH というのを用意しました。
また、Raspberry Pi 1 Model B+ には電源スイッチもないので、電源ケーブルを接続するとすぐに動作し始めます。そのため、起動させる時は他の準備が終わった後で最後に電源ケーブルを接続します。
- キーボード
-
SSH を使ってリモートで操作するつもりでも、インストールの時は必要です。USB対応のもの。GUI を使わないならマウスは不要です。
- HDMI 対応のモニタと HDMI ケーブル
-
キーボード同様、SSH を使ってリモートで操作するつもりでも、インストールの時は必要です。
- microSDカードに書き込みができるPC
-
インストールイメージをダウンロードしてmicroSDカードに書き込むために必要です。OSは Mac OS でも Windows でも可ですが、わたしは Linux を使用していますので、以下の説明は Linux を前提にしています。
2.OSのインストール
Raspbian のインストーラーに raspbian-ua-netinst を使います。Raspbian のサイトでも、プレインストール・イメージではなく、インストーラーを使いたいならこちらを推奨するとあります。
まず、 こちらから インストーラーをダウンロードします。いくつか種類がありますが、microSDカードの書き込みに Linux を使用する場合は、下記のように拡張子が xz のイメージファイルを選びます。
raspbian-ua-netinst-<バージョン番号>.img.xz
ダウンロードしたインストーラーのイメージファイルをmicroSDカードに書き込むのですが、その前に書き込みに使用するカードライターのデバイス名をコマンド df 等でしっかり確認しておきます。
デバイス名の確認は大変重要です!
これをまちがうと、別のディスクを消去してしまうという怖ろしい事態が起こる可能性があります。くれぐれも慎重に!
microSDカードへの書き込みはスーパーユーザーになって行います。下記の例で書き込む場合、
- イメージファイルのファイル名: raspbian-ua-netinst-v1.x.x.img.xz
- イメージファイルがあるディレクトリ: /download
- 使用するカードライターのデバイス名: /dev/sdz
コマンド xzcat を次のように使います。
# xzcat /download/raspbian-ua-netinst-v1.x.x.img.xz > /dev/sdz
正常に書き込みが完了したら、Raspberry Pi 1 Model B+ にLAN・モニタ・キーボードを接続して、書き込み済のmicroSDカードをスロットに挿入します。
最後に電源ケーブルを接続すると起動し、自動的に Raspbian のインストールが始まります。何もする必要はありません。途中、
Warning: cannot read table of mounted file systems
とか、
dpkg: warning: ignoring pre-dependency problem!
といった警告がたびたび表示されますが、 raspbian-ua-netinst のサイト によりますと、「これらは想定されているものなので、放っといていい」そうです。
わたしが実際にインストールした時は、20分弱で終了しました。正常にインストールが完了していれば、再起動すると Raspbian が使えるようになります。
3.OSのインストール直後にしておくこと
インストール時に root のパスワードが raspbian に設定されているので、初回ログイン時はこれを使います。当然、危険なので最初にログインしたら、すぐに
# passwd
で root のパスワードを変更します。
raspbian は Debian の派生版なので、使い方はいっしょです。
まず、お決まりですが、
# apt-get update
# apt-get upgrade
で、システムを更新します。
インストール時には何も設定していないので、ロケールやタイムゾーンは日本対応になっていません。変更したい場合は、
# dpkg-reconfigure locales (ロケール設定)
# dpkg-reconfigure tzdata (タイムゾーン設定)
でどうぞ。
またインストール時にスワップファイルは作成されません。後でコンパイルするときにスワップがないと、途中で止まってしまうので自力で作成します。
# dd if=/dev/zero of=/swap bs=1M count=2048 && mkswap /swap
さらにスワップファイルがシステム起動時に自動でマウントされるよう、 /etc/fstab に以下の記述を追加するとよいでしょう。
/swap none swap sw 0 0
あと、 raspbian-ua-netinst のサイト によりますと、 raspi-copies-and-fills というメモリ管理効率を向上させるためのツールがあるよ、ということなのでインストールしてみてもいいかもしれません(効果のほどは確認していませんが・・・)。
# apt-get install raspi-copies-and-fills
メモリといえば raspbian は初期設定でGPU用に 64MB のメモリを割り当てているのですが、GUI を使わないならこんなに必要ありません。16MB で十分です。
GPU用のメモリ割り当てを変更する場合は、 /boot/config.txt に下記の設定を追記します(GPU用のメモリを 16MB へ変更する例)。
gpu_mem=16
設定変更は再起動後に反映されますのでコマンド free 等で確認を。ちなみにわたしがウチので確認したところ、
- 設定変更前 Mem: total 448288
- 設定変更後 Mem: total 497056
と、たしかにGPU用のメモリを減らした分、CPU用の割り当てが増えていました。
4.Ruby コンパイル・インストール
現在(2015年3月)の段階では最新の raspbian でも Debian Wheezy 相当となっていまして、Ruby2.x 系は公式パッケージでは提供されていません(最新が 1.9 系)。Ubuntu 14.04 でも頭を痛めた Ruby のバージョン問題 再び、ということになってしまいました。
しゃあないので、今回は Ruby のバージョン管理ツール rbenv とそのプラグインを使って Ruby2.x 系をコンパイル・インストールすることにしました。
まず、コンパイルに必要なライブラリ・ツール類を公式のパッケージからインストールします。下記例では Ruby だけでなく Phusion Passenger + Nginx のコンパイルに必要なものも同時にインストールしています。
# apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libcurl4-openssl-dev git
rbenv を使ってインストールすると、通常はインストールを実行したユーザーのローカル環境に Ruby を入れることになるのですが、ウチの場合は Phusion Passenger からも使えるようにしないといけないので、システムワイドにインストールします。
以下、
- rbenv のディレクトリ: /usr/local/rbenv
- rbenv のプラグインのディレクトリ: /usr/local/rbenv/plugins
- Ruby のディレクトリ: /usr/local/ruby
という前提で記述します。
Git で rbenv をクローンします。
# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
次に .bash_profile へ作業に必要な下記の設定を追加します。
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"
追加したらいったんログアウトしてから、ログインしなおして
# type rbenv
で、
rbenv は関数です
rbenv ()
{
local command;
command="$1";
if [ "$#" -gt 0 ]; then
shift;
fi;
case "$command" in
rehash | shell)
eval "`rbenv "sh-$command" "$@"`"
;;
*)
command rbenv "$command" "$@"
;;
esac
}
といった表示が出れば、設定が反映されています。
続いて rbenv のプラグイン2種を Git でクローンします。
その1・rbenv 環境下で Ruby のコンパイル・インストールを行う ruby-build 。
# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
その2・rbenv 環境下で新しいバージョンの Ruby をインストールした場合、毎回必要になるお約束コマンド "rbenv rehash" を使わずに済むようになる rbenv-gem-rehash 。
# git clone https://github.com/sstephenson/rbenv-gem-rehash.git /usr/local/rbenv/plugins/rbenv-gem-rehash
それから Ruby のディレクトリを作っておきます。
# mkdir /usr/local/ruby
で、また .bash_profile へ作業に必要な下記の設定を追加します。
export PATH=\"/usr/local/rbenv/plugins/ruby-build/bin:$PATH\"
export PATH=\"/usr/local/rbenv/plugins/rbenv-gem-rehash/etc/rbenv.d/exec:$PATH\"
export RBENV_ROOT=\"/usr/local/ruby\"
追加したら、またログアウトしてから、ログインしなおします。
それから
# rbenv install -l
とすると、インストール可能な Ruby のバージョンの一覧が表示されます。ここから使いたいバージョンを選んで Ruby のコンパイル・インストールを行うわけですが・・・、ここまで書いといてなんですが、Raspberry Pi 1 Model B+ は現在の基準ではかなり非力なため、Ruby のコンパイル・インストールには時間がかかります。わたしがバージョン 2.1.5 を選んだ時は2時間18分かかったような・・・。その点、ご了承の上、実行くださいませ。
# rbenv install 2.x.x
さらにインストールしたバージョンの Ruby をシステムワイドにします。
# rbenv global 2.x.x
これで Ruby のインストールはおわり。ウェブサーバーとして動かすために、わたしはさらに Phusion Passenger + Nginx + Sinatra を入れていますが、その手順は Ubuntu の場合 とほぼ同じなので略。
5.おまけ
せっかくの新しいサーバーですので、Apache Bench で負荷テストをしてみました。 ff1100 のとき と同様、リクエスト数を100、同時接続数を10、 サイトのトップページをリクエスト先にして測定。結果は以下の通り。
$ ab -n 100 -c 10 http://192.168.0.x/index2.htm
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.x (be patient).....done
Server Software:
Server Hostname: 192.168.0.x
Server Port: 80
Document Path: /index2.htm
Document Length: 13234 bytes
Concurrency Level: 10
Time taken for tests: 112.065 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 1348200 bytes
HTML transferred: 1323400 bytes
Requests per second: 0.89 [#/sec] (mean)
Time per request: 11206.535 [ms] (mean)
Time per request: 1120.654 [ms] (mean, across all concurrent requests)
Transfer rate: 11.75 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 1 0.5 1 4
Processing: 6404 10938 3178.5 12854 15120
Waiting: 6358 10892 3177.9 12766 15066
Total: 6406 10939 3178.5 12856 15121
Percentage of the requests served within a certain time (ms)
50 12856
66 12980
75 13056
80 13158
90 14443
95 14985
98 15088
99 15121
100 15121 (longest request)
うっ・・・、遅い。応答失敗はないけど、処理完了に112秒もかかってる。ff1100 と大差ないじゃん。CPUが AMD E-350 だった自作の先代機が2.4秒でしたから、新機種導入で大幅性能ダウンという結果に・・・(笑)。
同時に目視で状態を監視していたのですが、CPU使用率は最大で93.3%と見たことのない値が出ていました。やはりデータベース処理の負担が重いようで、瞬間的にCPU使用率の80%以上を食っていることがありました。
なお、リクエスト数を1000、同時接続数を100に負荷を上げてテストしたところ、意外なことに応答失敗はゼロ。ff1100 はタイムアウトでテストそのものを完了できず、先代機でも応答失敗が148あったのですが。もっとも処理完了に1106秒もかかりました。
それと、例によって サンワサプライの簡易検電器・TAP-TST8 ワットモニター を使って消費電力を計測してみました。
起動時最大 | 2.4W |
---|---|
起動後安定状態 | 2.1〜2.2W |
おお、これは素晴らしい! 先代機はもちろん ff1100 をもはるかに低い値で、低性能をガマンするに見合います。
あと、 lm-sensors を使って毎日CPUの温度を確認していますが、今のところ32〜49℃の範囲内で推移しています。本体・ケースともにファン等はなし。特に問題はなさそうですが、夏になったらどうかな・・・。