超小型SBC『LicheePi Nano』を触る! その2 〜microSDからOS起動・カーネルビルド編〜
前回の記事ではLicheePi nanoの構成の説明やSPIフラッシュからのOS起動から自作プログラムの実行までをまとめていました。
今回はラズパイのようにmicroSDからOS起動する方法と、LicheePi nano用Linuxカーネルのビルド方法をまとめていきます。
学習内容
事前実践準備
- 前回記事の確認
- LicheePi Nano本体
- USBシリアル変換モジュール(cp2104等)
- ブレッドボードなどの配線機材
- Arduino IDE(シリアル通信ソフトならなんでも良い)
- 電子工作・UART通信の配線知識
- Linuxの基礎知識
dd
コマンドの基礎知識- Docker環境・基礎知識
筆者開発環境
- MacBookPro 2017
- ArduinoIDE: 1.8.10
- Docker: Docker version 19.03.5, build 633a0ea
参考ページ
https://steward-fu.github.io/website/mcu/lichee-nano/flash_image.htmsteward-fu.github.io
まずはラズパイのセットアップ同様OSイメージをダウンロードします。
ダウンロードは以下のリンクから行います。
https://github.com/steward-fu/lichee-nano/releases/download/v1.0/image.7z
ダウンロードができたら早速解凍します。
解凍したディレクトリのNano_tf_480272.dd.zip
ファイルを解凍します。
Macでは標準のソフトでは解凍できないので、以下のソフトをインストールします。
解凍するとNano_tf_480272.dd
ファイルができます。

ラズパイのセットアップでは.img
ファイルを使いますが今回は.dd
ファイルを使用することになります。
この形式はイメージの書き込みに使うEtcherなどに対応していないので、dd
コマンドを使用して書き込みます。
microSDをパソコンに差し込んで、microSDのデバイスディレクトリを探します。
Macであれば、『ディスクユーティリティ』アプリを起動して確認できます。
筆者環境では上の図から/dev/disk2
がmicroSDのデバイスディレクトリであることがわかりました。
次に、microSDを『ディスクユーティリティ』アプリでアンマウントしてdd
コマンドの書き込み対象にできるようにします。
そしてターミナルで、解凍したNano_tf_480272.dd
ファイルと同じディレクトリまで移動して以下のコマンドでmicroSDにOSを書き込みます。 SDのデバイスディレクトリ
には先ほど調べたディレクトリを指定しますが、間違えると操作しているパソコンのシステムが起動不可状態になってしまいますので、絶対に間違えないようにしましょう。
$ sudo dd if=./Nano_tf_480272.dd of=SDのデバイスディレクトリ bs=1m
microSDへの書き込みが終わったら、microSDをアンマウントしてパソコンから取り外します。
これでOSブートmicroSDの用意ができました。
2. microSDからOSを起動してみる
出来上がったmicroSDを早速LicheePi nanoに差し込んで起動していきます。
機器の準備は、前回記事同様USBシリアル変換モジュールを通して操作をしていくのでUART接続します。
接続できたら、ArduinoIDEのシリアルモニタなどからLicheePi nanoからの通信を確認します。
無事microSDからのOS起動ができると、下の図のようなログが出た最後にログインなしでコマンドが使える状態になっていれば成功になります。


試しにカーネルバージョンを確かめてみます。
コマンドは他のLinux同様$ uname -r
で調べられます。

前章で作成したmicroSDにはOSバージョン4.15.0-rc8-licheepi-nano+
がインストールされましたが、この章ではこれを(2020/1/26現在)最新のバージョン5.2にアップデートしていきます。
RaspbianやUbuntuでは自身でLinuxカーネルをビルドしてアップデートすることができますが、LicheePi nanoにはWiFiが標準ではついてない上にコンパイラらしきものが見当たらないので不可能かと思われます。
なので、他のパソコンでビルドする必要があります。
今回は方法として、Dockerコンテナ上で行うことにしました。
Dockerでビルドする利点としては、ビルド対象がArmコア向けなのでツールチェーンのインストールが必要でパソコンの環境汚染を避けるためなどが挙げられます。
早速以下のリポジトリからDocker-composeファイルを入手してコンテナを立ち上げてみましょう。
ターミナルでクローンしたディレクトリで$ docker-compose up
でコンテナを立ち上げます。
コンテナの立ち上がりには必須パッケージやGitリポジトリのクローンが含まれているので少々時間がかかります。
下の図のようにFinish!
と表示されたら次の工程になります。

コンテナが立ち上がったら、コンテナに入って作業をします。
先に以下のコマンドでコンテナIDを確認します。
$ docker ps

IDが確認できたら、以下のコマンドでコンテナに入ります。
$ docker exec -it コンテナID /bin/bash

コンテナに入れたら以下のコマンドでカーネルビルドをしていきます。
質問がたくさん出てきますが、特にこだわりがなければEnter
キーを長押しで構いません。 ビルドにもかなり時間がかかるので、気長に待ちます。
# Dockerコンテナで実行 $ cd ./linux $ CROSS_COMPILE=/usr/bin/arm-none-eabi- make ARCH=arm
ビルドが終わると、先ほどcd
コマンドで移動したlinux/
ディレクトリのarch/arm/boot/
ディレクトリにzImage
ファイルと、arch/arm/boot/dts/
ディレクトリにsuniv-f1c100s-licheepi-nano.dtb
ファイルがあります。zImage
ファイルはカーネルの本体で、suniv-f1c100s-licheepi-nano.dtb
ファイルはデバイスツリーファイルになります。
これらをコンテナ内から、ホスト側(Dockerを動かしているパソコン)にコピーするために以下のコマンドをホスト側のターミナルで実行します。
# ホスト側で実行 $ docker cp コンテナID:linux/arch/arm/boot/zImage ./ $ docker cp コンテナID:linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb ./
zImage
とsuniv-f1c100s-licheepi-nano.dtb
が準備できたら、LicheePi nanoの電源を落としてからmicroSDを抜き出して、ビルド作業をしたパソコンに刺します。
microSDがマウントされると、『Finder』やファイル操作アプリからマウントされたボリュームを確認すると以下のような三つのファイルが確認できます。

このうち、zImage
とsuniv-f1c100s-licheepi-nano.dtb
を先ほどDockerコンテナからコピーしたものと置き換えます。 置き換えたらパソコンからmicroSDを取り出して、LicheePi nanoに差し込んで起動します。
シリアルモニタで、OSが起動できたことが確認できたらOSのバージョンを確認します。

このようにしてカーネルのアップデートが完了しました。
コメント
コメントを投稿