雑多開発ブログ(仮)

Raspberry piでrails sを実行するとエラーがでる時の対処法

この対処法は原因解決の理由が不明の部分がある為、あくまで自分用の覚え書きです。

以下の環境でrails s -b 0.0.0.0を実行するとエラーが出て正常に動作しませんでした。

環境 Raspberry pi 3 model B Raspbian 9.4 Ruby 2.4.0 Rails 5.2.1

rubyrailsの導入方法はこちらを参考にさせていただきました。

qiita.com

いろいろ弄っていたら問題なくrails sできるようになったので、自分用に残しておきます。

結論

Bus Errorの解消法

rails sの時にBus Errorが発生する場合、config/boot.rbを編集し require bootsnap/setup を削除するかコメントアウトすれば解消できます。

Segmentation faultの解消法

rails new xxx を実行する際に末尾に--skip-bundleを加えて実行します。このオプションをつけるとbundle installが自動で実行されません。 処理が終わったあとアプリケーションディレクトリにcdしbundle installを行います。
このようにrails newの時にbundle installをskipすると、何故かrails sを実行した際にSegmentation faultエラーで詰まらなくなります。

概要

rails new xxxをした後にrails s -b 0.0.0.0を実行した際、下記のエラー文が出ました。

$ rails s -b 0.0.0.0
/home/hoge/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/compile_cache/iseq.rb:18: [BUG] Bus Error at 0x1a632ab
ruby 2.4.0p0 (2016-12-24 revision 57164) [armv7l-linux-eabihf]

~長文省略~

どうやらBus Errorとやらで正常に動作していないようです。
rails Raspberry pi Bus Error で検索した結果、以下のサイトがヒットしました。

romkey.com

どうやらbootsnapがRuby VMと相性が悪いそうです。この問題は少なくともRuby 2.4.1から2.5.1までに見られているそうです。
つまる所、bootsnapが有効だとBus Errorが出るようなので、config/boot.rbを編集しbootsnapを無効にしてあげれば解消できました。
ところがBus Errorを解消した後、rails sをすると下記のエラー文が出ました。

$ rails s -b 0.0.0.0
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
/home/hoge/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb:54: [BUG] Segmentation fault at 0xe92d000e
ruby 2.4.0p0 (2016-12-24 revision 57164) [armv7l-linux-eabihf]

~長文省略~

なにやらrb-inotifyというgemでセグメンテーション違反が発生しているようです。セグメンテーション違反とはWikipediaによると

セグメンテーション違反(英語:segmentation fault)はソフトウェアの実行時に起きる特定のエラー条件である。segfault(セグフォールト)と略される場合がある。 セグメンテーション違反はアクセスが許可されていないメモリ上の位置、もしくは許可されていない方法(例えばリードオンリーの位置へ書き込みをしようとする、もしくはオペレーティングシステムの部分を上書きしようとする)でメモリ上の位置にアクセスしようとするときに起こる。
セグメンテーション違反 - Wikipedia

なるほど?正直な所、自分にはどうすれば解決するかわかりませんでした。しかし結論で述べたようにrails newを実行する際にbundle installをskipし、後ほどbundle installすることによってセグメンテーション違反を解消することはできました。なぜ解消できたか不明な為、あくまで自分用の一時的な対処法です。

おわりに

ラズパイはサーバーサイドの勉強をする際にあるといろいろと便利ですね。手軽にいじれて異常が出ても初期化が簡単で。ただなにか問題が起きた時にどのように解決すればいいのか調べるのが難しいと個人的には感じたので自分用も踏まえて記事にします。この記事が誰かの役に立てば幸いです。