雑多開発ブログ(仮)

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

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

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

環境

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することによってセグメンテーション違反を解消することはできました。なぜ解消できたか不明な為、あくまで自分用の一時的な対処法です。