Howto

Raspberry PiからArmadilloへの移行ガイド -Armadillo-610・Armadillo-640 ソフトウェア移行手順-

Raspberry PiはRaspberry Pi財団の登録商標です。
本ページはRaspberry PiからArmadillo-610及びArmadillo-640への移行手順のソフトウェア編です。 ハードウェア移行手順を完了している前提で解説しています。 そちらの手順をまだ行っていない方は、先にハードウェア移行手順 のページの手順を完了させてください。

ハードウェアの移行が可能であることが分かったら、次はソフトウェアの移行を行います。

ハードウェア移行手順の末尾でも記したように、ソフトウェアの移行の可否判断には移行先Armadilloが必要になります。

必要なもの

  • ATDEを起動できるPC
  • 移行先Armadillo

以降の手順は、説明のため例として以下の構成のシステムを移行すると仮定します。

  • Raspberry PiからArmadillo-640への移行
  • 起動後にsystemdによってPython3スクリプトである/root/run.pyを自動実行する

debianユーザーランドの作成

Armadillo上で動作する、実行したいアプリケーションが組み込まれたdebianユーザーランドを生成します。

at-debian-builder

Armadillo上で動作するdebianユーザーランドを作成するツールとして、at-debian-builderというソフトウェアを提供しています。

at-debian-builderはATDE上で実行可能なソフトウェアであり、実行したいアプリケーションや読み取りたいコンフィグファイルを組み込んだり、Armadillo上での初回起動前に実行しておきたいコマンドなどを予め実行させておくことも可能です。

ファイル構成と各ファイルやディレクトリの役割は以下の通りです。

at-debian-builder
├── LICENSE
├── aXXX_resources
│   └── resources
│       ├── fixup
│       ├── hosts
│       ├── interfaces (or NetworkManager.conf)
│       ├── packages
│       ├── rc.local
│       ├── sources.list
│       └── validate_package
└── build.sh

ファイル(ディレクトリ)名 役割
LICENSE at-debian-builderのライセンスファイルです。
aXXX_resources Armadilloの各製品毎にディレクトリがあります。
この下に配置されたresourcesディレクトリ以外のファイル(ディレクトリ)は、生成されるユーザーランドのルートディレクトリ以下に配置されます。
resources 上記の説明の通り、このディレクトリ自体とその中身は生成されるユーザーランド内に配置されません。
各種設定用ファイルが配置されています。
fixup ユーザーランド生成時に予め実行しておきたいコマンドをこのファイルに書くことで実行できます。
(systemctlでプログラムの自動実行、pipでのPythonパッケージのインストールなど)
hosts ユーザーランド上では/etc/hostsに配置される、ホスト名とIPアドレスを対応させるためのファイルです。
interfaces ユーザーランド上では/etc/network/interfacesに配置される、固定IPアドレスの設定などの設定用ファイルです。
Armadillo-600シリーズなど、NetworkManagerを使用せずにネットワーク管理を行っている製品で設定可能です。
NetworkManager.conf ユーザーランド上では/etc/NetworkManager/NetworkManager.confに配置されるコンフィグファイルです。
Armadillo-X1など、NetworkManagerでネットワーク管理を行っている製品で設定可能です。
packages apt installでインストールできるパッケージ名を記述することで、ユーザーランド生成時に自動でインストールを実行します。
rc.local ユーザーランド上では/etc/rc.localに配置される、OS起動時に自動実行されるスクリプトファイルです。
sources.list ユーザーランド上では/etc/apt/sources.listに配置される、aptパッケージのリポジトリ情報を記述するファイルです。
validate_package インストールしたパッケージの検証用スクリプトです。
build.sh ユーザーランドのビルドを実行するためのスクリプトです。

at-debian-builderのセットアップ

まず、ATDEを起動してatmarkユーザーでログインしてください。

その後、左上のアクティビティから「端末」をクリックして端末を起動してください。

ATDE内で、at-debian-builderの最新版をダウンロードしてください。 VERSIONは適宜読み替えてください。

at-debian-builderには、作成できるユーザーランドがGNU/Linux Debian 10(コードネーム "buster")のものと、GNU/Linux Debian 9(コードネーム "stretch")のものがあります。 作成したいシステムに合わせて選んでいただいて構いませんが、特別な理由がなければbusterを選んでください。
本ページ内の例ではbusterを使用します。
製品 ダウンロードページ
各製品共通 https://armadillo.atmark-techno.com/resources/software/armadillo-640/tools
[ATDE]$ ls at-debian-builder-[VERSION].tar.gz
at-debian-builder-[VERSION].tar.gz

以下のコマンドを実行して、at-debian-builderを展開します。

[ATDE]$ tar xf at-debian-builder-[VERSION].tar.gz
[ATDE]$ cd at-debian-builder-[VERSION]
[ATDE ~/at-debian-builder-[VERSION]]$

ユーザーアプリケーションの配置

at-debian-builderは、at-debian-builder/[BOARD]_resources/をルートディレクトリと見立てて、その下にディレクトリやファイルを配置することで、生成したユーザーランド上でもその位置に任意のファイルを配置します。
BOARDは移行先Armadilloによって異なりますので、適宜読み替えてください。今回の例ではa600です。

Armadillo起動時に/root/run.pyを自動実行するために、以下のようなsystemdのUnitファイル(run_script.service)を用意します。run.pyは任意のPythonスクリプトです。

[Unit]
Description = user application

[Service]
ExecStart = python3 /root/run.py
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

run_script.serviceをat-debian-builder/a600_resources/etc/systemd/system/に配置します。
at-debian-builder/a600_resources/etc/systemd/system/はデフォルトで存在しないので、mkdir -pコマンドで作成します。

[ATDE ~/at-debian-builder-[VERSION]]$ ls run_script.service
run_script.service
[ATDE ~/at-debian-builder-[VERSION]]$ mkdir -p a600_resources/etc/systemd/system/  <- ルートディレクトリ以下にetc/systemd/system/を作成
[ATDE ~/at-debian-builder-[VERSION]]$ cp run_script.service a600_resources/etc/systemd/system/

systemdやUnitファイルについて、詳しくは以下を参照してください。

Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(その1)

同様に、run.pyをat-debian-builder/a600_resources/root/に配置します。
at-debian-builder/a600_resources/root/はデフォルトで存在しないので、mkdir -pコマンドで作成します。

[ATDE ~/at-debian-builder-[VERSION]]$ ls run.py
run.py
[ATDE ~/at-debian-builder-[VERSION]]$ mkdir -p a600_resources/root/  <- ルートディレクトリ以下にroot/を作成
[ATDE ~/at-debian-builder-[VERSION]]$ cp run.py a600_resources/root/

他にも必要なファイルがある場合は、上記手順を繰り返して任意のディレクトリに配置してください。

ユーザーランド内で予め実行したいコマンドの記述

作成するユーザーランドをArmadilloに書き込み、初回起動する前に予め実行しておきたいコマンドがある場合があります。

今回の例で言うと、run.pyを自動実行するためのsystemd Unitファイルを配置しましたが、これだけでは自動実行されません。
以下のコマンドを実行することで起動時に自動実行されるようになります。

# systemctl enable run_script.service

しかし、上記コマンドはこの後生成されるユーザーランドが動作しているArmadillo上で実行する必要があります。
このような場合に、at-debian-builderではユーザーランドをArmadilloに書き込む前にコマンドを実行する方法があります。

手順としましては、fixupというファイルの末尾に実行したいコマンドを追記するのみです。

[ATDE ~/at-debian-builder-[VERSION]]$ ls a600_resources/resources/fixup
a600_resources/resources/fixup <- このファイルを編集
[ATDE ~/at-debian-builder-[VERSION]]$ echo "systemctl enable run_script.service" >> a600_resources/resources/fixup <- コマンド追記

こうすることで、ユーザーランド生成時に追記したコマンドがユーザーランド内で実行されます。

debianパッケージの追加

デフォルトでat-debian-builderが生成するdebianユーザーランドには、必要最低限のdebianパッケージしかインストールされていないため、 今回の例で言うと、デフォルトではPython3がインストールされていないためにrun.pyを実行することができません。

at-debian-builderでは生成するユーザーランドにインストールするdebianパッケージを指定することで、対象のdebianパッケージがインストールされたユーザーランドを生成することができます。

手順としては、at-debian-builder/[BOARD]_resources/resources/packages にインストールしたいパッケージ名を追記するのみです。

パッケージ名はapt installで指定できるものを追記してください。

今回は、python3と追記します。

[ATDE ~/at-debian-builder-[VERSION]]$ ls a600_resources/resources/packages
a600_resources/resources/packages <- このファイルを編集
[ATDE]$ echo "python3" >> a600_resources/resources/packages <- パッケージ名追記

こうすることで、ユーザーランド生成時に追記したdebianパッケージがインストールされます。

ユーザーランドの生成

ここまで終わったらユーザーランドの生成を行います。

以下のコマンドを実行することでat-debian-builderの使用方法が確認できます。 以下の例はv2.1.1のものです。

[ATDE ~/at-debian-builder-[VERSION]]$ sudo ./build.sh 
at-debian-builder, version 2.1.1
Usage: build.sh [OPTION].. [BOARD]

-h, --help   show this message

BOARD: ax1 aiotg3 aiotg3l a600 aiota6

at-debian-builderディレクトリ直下でsudo ./build.sh [BOARD](BOARDは対象のArmadilloによって異なります)を実行することでユーザーランドが生成されます。

今回の例ならば、

[ATDE ~/at-debian-builder-[VERSION]]$ sudo ./build.sh a600

を実行することで、Armadillo-640向けのユーザーランドが生成されます。 このコマンドは、追加でインストールするパッケージの数や実行環境などにも依りますが、10分以上かかります。

[ATDE ~/at-debian-builder-[VERSION]]$ ls debian-buster-armhf-*
debian-buster-armhf-a600-YYYYMMDD.tar.gz

生成された上記のファイルがdebianユーザーランドイメージです。 後の手順で使用します。

Linuxカーネル、Device Tree Blobの生成

次に、移行先のArmadillo上で動作するLinuxカーネルイメージとDevice Tree Blobを作成します。

Linuxカーネルのビルド

移行先Armadilloのダウンロードページから、最新版のLinuxカーネルソースコードとinitramfsアーカイブファイルをATDE上にダウンロード・展開します。
Linuxカーネルはイメージファイルではなくソースファイルをダウンロードしてください。

製品 ダウンロードページ
Armadillo-640 https://armadillo.atmark-techno.com/resources/software/armadillo-640/linux-kernel
Armadillo-610 https://armadillo.atmark-techno.com/resources/software/armadillo-610/linux-kernel

移行先のArmadilloによってLinuxカーネルソースコードのビルド手順が異なりますのでご注意ください。以下の手順はArmadillo-640向けです。
VERSIONは適宜読み替えてください。

[ATDE]$ ls
linux-4.14-at.tar.gz    initramfs_a600-[VERSION].cpio.gz
[ATDE]$ tar xf linux-4.14-at.tar.gz
[ATDE]$ ls
linux-4.14-at    linux-4.14-at.tar.gz    initramfs_a600-[VERSION].cpio.gz

Linuxカーネルソースディレクトリ内にinitramfsへのシンボリックリンクを作成します。

[ATDE]$ cd linux-4.14-at
[ATDE ~/linux-4.14-at]$ ln -s ../initramfs_a600-[VERSION].cpio.gz initramfs_a600.cpio.gz

Linuxカーネルをビルドします。

[ATDE ~/linux-4.14-at]$ make ARCH=arm armadillo-640_defconfig
[ATDE ~/linux-4.14-at]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
[ATDE ~/linux-4.14-at]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

Linuxイメージが生成されます。

[ATDE ~/linux-4.14-at]$ ls arch/arm/boot/uImage
arch/arm/boot/uImage

Device Tree Blobの生成

Device Tree Blob(以下、dtb)は、ハードウェアの詳細を記述したデータ構造体です。 Armadilloの特定のピンにどのようなハードウェアが接続されるのか、そのピンはどのような機能を持つのかなどを記載する必要があります。

ここでは、ハードウェア移行のページでも使用したat-dtwebを利用してdtbを作成します。

まず、ATDE画面左上のアクティビティから「at-dtweb」と入力し、at-dtwebのアイコンをクリックしてください。

ボードを選択する画面が表示されますので、移行先のArmadilloを選択してください。

その後、ディレクトリを選択する画面が表示されますので、先ほどダウンロード・展開したLinuxカーネルソースのディレクトリを指定して画面右上の「OK」をクリックしてください。

以下のような画面が表示されますので、ハードウェア移行手順の際に行った設定と同様に各ピンの設定を行ってください。

設定後、画面右上の「Save」をクリックすることで、設定を反映したdtbが生成されます。

[ATDE]$ ls linux-4.14-at/arch/arm/boot/dts/armadillo-at-dtweb.dtb
linux-4.14-at/arch/arm/boot/dts/armadillo-at-dtweb.dtb <- at-dtwebで生成したdtb

ブートローダーの準備

ブートローダーは基本的に修正する必要はありませんので、ビルド済みイメージをダウンロードします。 ブートローダーについても移行先Armadilloによって使用するものが異なりますので、以下からイメージファイルをダウンロードしてください。

製品 ダウンロードページ
Armadillo-640 https://armadillo.atmark-techno.com/resources/software/armadillo-640/boot-loader
Armadillo-610(UART1) https://armadillo.atmark-techno.com/resources/software/armadillo-610/boot-loader
[ATDE]$ ls u-boot-a600-v2018.03-at8.imx
u-boot-a600-v2018.03-at8.imx

インストールディスクの作成

Linuxカーネル、dtb、ブートローダー、debianユーザーランドを用意したら、用意したイメージをArmadilloに書き込むためのインストールディスクを作成します。

まず、ATDE上にmake-install-disk-imageをダウンロード・展開します。

製品 ダウンロードページ
各製品共通 https://armadillo.atmark-techno.com/resources/software/armadillo-640/tools

[VERSION]は適宜読み替えてください。

[ATDE]$ ls make-install-disk-image-*
make-install-disk-image-[VERSION].tar.gz
[ATDE]$ tar xf make-install-disk-image-[VERSION].tar.gz
[ATDE]$ ls make-install-disk-image-*
make-install-disk-image-[VERSION]    make-install-disk-image-[VERSION].tar.gz

make-install-disk-imageのディレクトリ内に入ります。

[ATDE]$ cd make-install-disk-image-[VERSION]
[ATDE ~/make-install-disk-image-[VERSION]]$ 

以下のコマンドを実行することで、make-install-disk-imageの使用方法が確認できます。 以下の例はv1.2.0のものです。

[ATDE ~/make-install-disk-image-v1.2.0]$ sudo ./build.sh
Install Disk Image Build Script v1.2.0

Usage:
  sudo ./build.sh BOARD UBOOT KERNEL DTB USERLAND [SD_KERNEL SD_DTB USER_PART_SIZE]

  BOARD: a640/a610/aiota6
  UBOOT: u-boot image
  KERNEL: uImage
  DTB: Device Tree Blob image
  USERLAND: Debian userland archive
  SD_KERNEL: uImage for install disk(optional)
  SD_DTB: Device Tree Blob image for install disk(optional)
  USER_PART_SIZE: eMMC(/dev/mmcblk0p4) user partition size(optional) 1 - 1400 (MB)

Example:
  incase of using default images as:

    sudo ./build.sh a640 u-boot-a600-v2018.03-at4.imx uImage-a600-v4.14-at11 armadillo-640-v4.14-at11.dtb debian-stretch-armhf-a600-20190326.tar.gz

  incase of using user-customized images as(that images use uSDHC2 via Armadillo-610 CON2 Ext-Interface):

    sudo ./build.sh a610 u-boot.imx uImage a610.dtb debian-stretch-armhf-a600-20200214.tar.gz core/uImage core/a610.dtb

用意したLinuxカーネル、dtb、ブートローダー、debianユーザーランドを用いて、インストールディスクイメージを作成します。

[ATDE ~/make-install-disk-image-[VERSION]]$ sudo ./build.sh a640 /path/to/u-boot-a600-v2018.03-at8.imx /path/to/uImage /path/to/armadillo-640.dtb /path/to/debian-buster-armhf-a600-YYYYMMDD.tar.gz
[ATDE ~/make-install-disk-image-[VERSION]]$ ls install-disk*
install-disk-sd-a640-YYYYMMDD.img

作成したインストールディスクイメージをmicroSDカードに書き込みます。

まず、ATDEに1GB以上のmicroSDカードを接続してください。 microSDカードがマウントされている場合はアンマウントします。

[ATDE]$ mount
(省略)
/dev/sdb1 on /media/atmark/B18A-3218 type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
[ATDE]$ sudo umount /dev/sdb1

以下のコマンドを実行してmicroSDカードにインストールディスクイメージを書き込みます。

[ATDE]$ sudo dd if=install-disk-sd-buster-a640-YYYYMMDD.img of=/dev/sdb bs=4M conv=fsync
127+1 レコード入力
127+1 レコード出力
536870400 バイト (537 MB) コピーされました、 65.6377 秒、 8.2 MB/秒

完了したら、ATDEからmicroSDを取り外してください。

インストールの実行

インストールの実行方法はArmadilloによって異なります。 対象のArmadilloの製品マニュアルを確認の上、インストールを行ってください。

動作確認

インストールが完了したら、動作確認に入ります。

Armadilloに各種センサーや拡張基板を接続し、電源を投入してください。

期待通りの動作をすれば移行は完了です。

期待通りの動作をしない場合は、移行手順を間違えているかRaspberry Pi固有のソフトウェアが存在していてArmadilloで動作していない可能性が高いです。

問題が解決できない場合には、Armadilloフォーラムにてご相談ください。