第12回: ラズパイをROM化する その1(カスタムカーネルのインストール)

ラズパイの電源を落とすときには「sudo poweroff」等のコマンドを実行する必要がある。いきなり電源を抜くとSDカード上のファイルシステムが破損し、最悪起動できなくなる場合があるからだ。

しかし、組込機器のように好きなタイミングで自由に電源を切りたい…という需要は当然ある。

そこで、先人達の知恵に拝借すると…

  • カーネルに「aufs」というファイルシステムを組み込む。
  • 「fsprotect」というソフトウェアを導入する。

ことにより、SDカードに対するライトアクセスが抑止される…。言い換えればROM化が実現できるとのこと。

ところで、ライトアクセス禁止でファイルの更新が出来なきゃOSがまともに動作しないんじゃね?…という疑問が湧くのは当然である。

その答えは、リードオンリーであるSDカード上のファイルシステムに、RAMディスクをオーバーレイさせることによって、ファイルの更新はRAMディスクに記録される…何とも絶妙な仕組みである。

今回は、ラズパイROM化のために、aufsを組み込んだカスタムカーネルのインストールに挑戦する。

 

 

ラズパイ公式に「Kernel Building」について記載がある。このページを参考に、aufsを組み込んだカスタムカーネルをビルドする。

カーネルのビルドには、ラズパイ上でビルドする「ローカルビルディング」と、別のLinux機でコンパイルする「クロスコンパイル」の2通りがあるが、ここでは、クロスコンパイルによるカーネルビルドの方法について紹介する。

0. ツールチェーンのダウンロード

これからの作業はUbuntu等が動作しているラズパイとは別のLinux機での作業になる。

このシリーズを順にセットアップを続けてきたなら、第10回にてツールチェーンをUbuntuが動作しているLinux機にインストール済ではあるが再掲。

 

 

1. カーネルのソース

ソースの入手は次のとおり。

 

2. カーネルのバージョン

エディタでMakefileを開く

 

先頭3行はカーネルのバージョン。この場合は、4.4.14。

これからaufsを組み込んだカスタムバージョンをビルドする。後で違いを判別できるように「EXTRAVERSION」編集し、「-aufs」を加えた。

 

3. aufsの導入

gitから「aufs-standalone」を入手する。

 

aufs-standaloneのブランチを確認する。

 

カーネルのバージョン4.4.14に近い、aufs4.4をチェックアウトする。

 

aufs4.4のREADMEを参考に、カーネルのソースにパッチを当てる。

 

次に、いくつかのファイルをコピー

 

4. 「.config」ファイルの作成(失敗)

4と5は、カーネルビルドに失敗するので、読むだけに留めて実行しないこと。

環境変数「KERNEL」を定義する。また、カーネルビルドの設定ファイル「.config」をデフォルト設定で生成する。

Pi1とPi2&3ではコマンドが異なるので注意

Pi1用。Pi Zeroもこちら。

Pi2&3用はこちら。

 

「.config」にaufs関連の編集を加える。その為のユーティリティ「menuconfig」を起動する。

 

「File Systems」>「Miscellaneous filesystems」の順に辿って「Aufs」を見つけたら、スペースキーを押して*マークを付ける。

スクリーンショット 2016-07-02 14.53.43

<Save>を選択して「.Config」に設定を保存する。あとは、<Exit>を何度か選択してmenuconfigを終了する。

スクリーンショット 2016-07-02 14.54.33

 

5. カーネルのビルド(失敗)

4と5は、カーネルビルドに失敗するので、読むだけに留めて実行しないこと。

次のコマンドでカーネルをビルドする….。Yes or No…..。次から次へと質問攻めにあう。何かおかしいのでCTRL+Cで強制終了する。

スクリーンショット 2016-07-02 15.09.09

おそらくは、menuconfigで変更を加えた「.config」に不具合があるのだろう。

失敗版「.config」の、aufsに関係する部分をgrepで抜き出した。これが後に成功に導く。

 

6.「.config」ファイルの作成(成功)

試行錯誤の上、うまくいく方法を見つけたので紹介する。

環境変数「KERNEL」を定義する。また、カーネルビルドの設定ファイル「.config」をデフォルト設定で生成する。

 

Pi1とPi2&3ではコマンドが異なるので注意

Pi1用。Pi Zeroもこちら。

 

 

Pi2&3はこちら。

 

menuconfigを使うと失敗するのは学習済み。手動で「.config」を編集し、最後尾に次の内容を加える

これは、5でmenuconfigが生成した内容そのもの。menuconfigが生成したaufsに関する部分のみを流用し、デフォルトの「.config」に付け加える作戦。

 

7. カーネルのビルド(成功)

次のコマンドでビルドする。正しい「.config」のおかけで今度はビルドに成功する。

 

8. カスタムカーネルのインストール

RaspbianがインストールされているラズパイのSDカードを、カードリーダーを用いてUbuntuに接続する。そして、元々インストールされているカーネルを、今回ビルドしたカスタムカーネルに更新する。

まず、UbuntuにマウントしたSDカードの名称を次のコマンドで調べる。

 

「sdb」がRaspbianがインストールされているSDカードである。

2つのパーティションがある。
「sdb1」は「/boot」にマウントされる、「fat32」フォーマットのファイルシステムである。
「sdb2」は「/」にマウントされる「ext4」フォーマットのファイルシステムである。

なお、NOOBSによりRaspbianをインストールした場合、更に多くのパーティションが見つかるらしい。詳しくはこちら

 

SDカードをマウントするディレクトリを作成してマウントする。

 

モジュールをインストールする。

 

カーネルとDevice Tree blobsをインストールする。

 

SDカードをアンマウントする。

 

9. カスタムカーネルでラズパイ起動

カスタムカーネルをインストールしたSDカードをラズパイに挿入し、いざ起動!!

起動後、カーネルのバージョンを表示すると…
カーネルのバージョンに「-aufs」が追加されている。確かにカスタムカーネルが動いているのが確認できた。

 

以上、カーネルへのaufsの組込が完了した。

なお、カーネルをアップデートするコマンド「rpi-update」を実行すると、せっかくのカスタムカーネルがデフォルトのカーネルで上書きされてしまう。カスタムカーネルのバージョンアップは、面倒でもソースからビルドする必要がある。

次回は「fsprotect」を導入する。


☝ 目次

☜ 第11回: ラズパイのリモート開発環境の構築 その3

第13回: ラズパイをROM化する その2(fsprotectのインストール)


2016-07-02 作成
2016-07-04 更新

1 Comment

  1. Pingback: IFW on Raspberry Pi 3準備その1 – STUDIOR

Leave a Comment

メールアドレスが公開されることはありません。