HaLake Magazine

コワーキングスペースHaLakeの技術情報発信サイト!IoT,AR,VRなど最新技術情報をお届け!

超小型SBC『LicheePi Nano』を触る! その2 〜microSDからOS起動・カーネルビルド編〜

f:id:takumishinoda:20200126133654j:plain

前回の記事では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

参考ページ

steward-fu.github.io

目次

  1. LicheePi nano用LinuxをmicroSDに書き込む
  2. microSDからOSを起動してみる
  3. 最新LicheePi nano用Linuxカーネルのビルド(任意)

1. LicheePi nano用LinuxmicroSDに書き込む

まずはラズパイのセットアップ同様OSイメージをダウンロードします。
ダウンロードは以下のリンクから行います。

https://github.com/steward-fu/lichee-nano/releases/download/v1.0/image.7z

ダウンロードができたら早速解凍します。
解凍したディレクトリのNano_tf_480272.dd.zipファイルを解凍します。
Macでは標準のソフトでは解凍できないので、以下のソフトをインストールします。

The Unarchiver

The Unarchiver

  • MacPaw Inc.
  • ユーティリティ
  • 無料
apps.apple.com

解凍するとNano_tf_480272.ddファイルができます。

f:id:takumishinoda:20200126163022p:plain
ファイルを解凍する

ラズパイのセットアップでは.imgファイルを使いますが今回は.ddファイルを使用することになります。
この形式はイメージの書き込みに使うEtcherなどに対応していないので、ddコマンドを使用して書き込みます。
microSDをパソコンに差し込んで、microSDのデバイスディレクトリを探します。
Macであれば、『ディスクユーティリティ』アプリを起動して確認できます。

筆者環境では上の図から/dev/disk2microSDのデバイスディレクトリであることがわかりました。
次に、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起動ができると、下の図のようなログが出た最後にログインなしでコマンドが使える状態になっていれば成功になります。

f:id:takumishinoda:20200126145410p:plain
UBOOTのログ

f:id:takumishinoda:20200126145543p:plain
SPIフラッシュ内蔵のシステムではログインがあったが...

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

f:id:takumishinoda:20200126145944p:plain
SPIフラッシュに内蔵されたバージョンと同じバージョンだった

3. 最新LicheePi nano用Linuxカーネルのビルド

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

github.com

ターミナルでクローンしたディレクトリで$ docker-compose upでコンテナを立ち上げます。
コンテナの立ち上がりには必須パッケージやGitリポジトリのクローンが含まれているので少々時間がかかります。
下の図のようにFinish! と表示されたら次の工程になります。

f:id:takumishinoda:20200126154100p:plain
コンテナが立ち上がった!

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

$ docker ps

f:id:takumishinoda:20200126153950p:plain
コンテナIDを確認

IDが確認できたら、以下のコマンドでコンテナに入ります。

$ docker exec -it コンテナID /bin/bash

f:id:takumishinoda:20200126154426p:plain
コンテナに入れた!

コンテナに入れたら以下のコマンドでカーネルビルドをしていきます。
質問がたくさん出てきますが、特にこだわりがなければ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 ./

zImagesuniv-f1c100s-licheepi-nano.dtbが準備できたら、LicheePi nanoの電源を落としてからmicroSDを抜き出して、ビルド作業をしたパソコンに刺します。
microSDがマウントされると、『Finder』やファイル操作アプリからマウントされたボリュームを確認すると以下のような三つのファイルが確認できます。

f:id:takumishinoda:20200126161431p:plain
OS起動に関するデータ

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

f:id:takumishinoda:20200126162036p:plain
カーネルバージョンがアップデートされた!

このようにしてカーネルのアップデートが完了しました。

まとめ

  • microSDからOSが起動できた
  • Dockerを使ってカーネルのビルドができた
  • カーネルのアップデートを手動でできた
  • 手動でカーネルをビルドしたことがなかったので感動