量産編

開発用 Armadillo のセキュアブートの有効化を実施した後、量産用の Armadillo に対してもセキュアブートを有効にする必要があります。

また、量産用 Armadillo では rootfs の他にログ書き込み用、ファームウェア用、アプリケーション用パーティションの暗号化も行います。

ここでは、量産用 Armadillo のセキュアブートを有効化し、ストレージを暗号化するインストールディスクイメージを作成する方法を 2 通り示します。

  1. 「開発用 Armadillo の環境を複製する方法」

    この方法では、開発用 Armadillo の開発環境を量産用 Armadillo に複製します。

    開発用 Armadillo にある不要なデータを削除する必要はありますが、手順は「量産用インストールディスクイメージを 1 から作る方法」に示す方法より簡単です。

  2. 「量産用インストールディスクイメージを 1 から作る方法」

    この方法では、必要なパッケージおよびソフトウェアのみを抽出し、それらを量産用インストールディスクイメージに組み込みます。

    手順は「開発用 Armadillo の環境を複製する方法」よりも複雑になりますが、開発用 Armadillo の環境を複製したくない場合、ユーザーランドが起動せず SWU イメージによる複製が困難な場合にこちらの方法が有効です。

4.1. 開発用 Armadillo の環境を複製する方法

ここでは、セキュアブート有効化済みの開発用 Armadillo に initial_setup.swu がインストールされており、アプリケーションも配置されている前提です。

abos-ctrl make-installer コマンドを使用して、開発環境を複製したインストールディスクイメージを作成する方法を紹介します。

ここで紹介する量産用インストールディスクイメージを量産用 Armadillo にインストールすると、以下のような環境を作成できます。

  • セキュアブートが有効化されている
  • rootfs 用、ログ書き込み用、ファームウェア用、アプリケーション用パーティションが暗号化されている
  • initial_setup.swu 及びアプリケーションが予めインストールされている

4.1.1. インストールディスクイメージ作成用の SWU イメージを生成する

secureboot.sh の make_installer オプションを使用します。 以下に示すオプション引数があります。

表4.1 make_installer の引数

オプション引数説明

--cn

インストールディスクイメージの改ざん防止のために内部で使用している openssl で使用します。 デフォルトでは 「Secure boot installer [ランダムな10桁の英数字]」 が使用されます。


以下のコマンドを実行してください。

[ATDE ~/imx-boot-[VERSION]]$ ./secureboot.sh make_installer
Logging build outputs to /home/atmark/secureboot_x2/tmp/make_installer.log

Downloading https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/image/baseos-x2-installer-latest.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  167M  100  167M    0     0  5480k      0  0:00:31  0:00:31 --:--:-- 14.7M

Building initrd for verity (first time is slow)
Signing linux image (verity)...
Created /home/atmark/secureboot_x2/out/Image.signed-verity

Building SWU...
Enter pass phrase for /home/atmark/mkswu/swupdate.key: 1


Install following SWU image with an USB drive plugged in:
 - /home/atmark/secureboot_x2/swu/secureboot_make_installer.swu 2

図4.1 secureboot.sh make_installer の実行


1

SWUイメージを作成するためのパスワードを入力してください。

2

インストールディスクイメージ作成用の SWU イメージが生成されます。

secureboot_make_installer.swu が存在することをご確認ください。

[ATDE ~/imx-boot]$ ls /home/atmark/secureboot_x2/swu/secureboot_make_installer.swu
/home/atmark/secureboot_x2/swu/secureboot_make_installer.swu

図4.2 secureboot.sh make_installer のよって作成された SWU イメージ


参考までに secureboot_make_installer.swu の生成時の流れを示します。

images/common-images/production/secureboot_make_installer_swu.png

図4.3 secureboot_make_installer.swu を生成するまでの流れ


4.1.2. Armadillo に USBメモリを挿入

Armadillo に電源を投入し、インストールディスクを保存するための USB メモリを挿入してください。

[警告]

USB メモリは vfat もしくは ext4 形式でフォーマットし、空き容量が 10GB 以上のものを使用してください。 Armadillo への USB メモリのマウントは不要です。

インストールディスクイメージは installer.img という名前で保存します。すでに同名のファイルが存在する場合は上書きされます。

4.1.3. インストールディスクイメージ作成用 SWU を Armadillo にインストールする

ABOS Web を使用して、生成した secureboot_make_installer.swu をインストールしてください。 実行時は ABOS Web 上に 図4.4「secureboot_make_installer.swu インストール時のログ」 が表示されます。

secureboot_make_installer.swu をインストールします。

SWU アップロード完了

SWUpdate v2024.12.0-git20250115-r0

Licensed under GPLv2. See source distribution for detailed copyright notices.

[INFO ] : SWUPDATE running :  [print_registered_handlers] :     no handler registered.
[INFO ] : SWUPDATE running :  [main] : Running on armadillo-900 Revision at1
[INFO ] : SWUPDATE started :  Software Update started !
[INFO ] : SWUPDATE running :  [install_single_image] : Installing pre_script
[INFO ] : SWUPDATE running :  [read_lines_notify] : No base os update: copying current os over
[INFO ] : SWUPDATE running :  [read_lines_notify] : Waiting for btrfs to flush deleted subvolumes
[INFO ] : SWUPDATE running :  [install_single_image] : Installing Copy installer to USB device
[INFO ] : SWUPDATE running :  [install_single_image] : Installing Stop containers
[INFO ] : SWUPDATE running :  [install_single_image] : Installing Make installer image
[INFO ] : SWUPDATE running :  [read_lines_notify] : Secure boot enabled setting for production Armadillo is already set
[INFO ] : SWUPDATE running :  [read_lines_notify] : ./
[INFO ] : SWUPDATE running :  [read_lines_notify] : ./installer_verity_cert.pem
[INFO ] : SWUPDATE running :  [read_lines_notify] : ./installer_verity_key.pem
[INFO ] : SWUPDATE running :  [read_lines_notify] : ./sd_copy/
[INFO ] : SWUPDATE running :  [read_lines_notify] : ./sd_copy/boot/
[INFO ] : SWUPDATE running :  [read_lines_notify] : ./sd_copy/boot/Image
[INFO ] : SWUPDATE running :  [read_lines_notify] : /target/mnt/installer.img-in-progress (425MB) was bigger than 338MB and was not truncated.
[INFO ] : SWUPDATE running :  [read_lines_notify] : Checking if /target/mnt/installer.img-in-progress can be used safely...
[INFO ] : SWUPDATE running :  [read_lines_notify] : Using installer image on image file.
[INFO ] : SWUPDATE running :  [read_lines_notify] : Growing /target/mnt/installer.img-in-progress to fit verity partition
[INFO ] : SWUPDATE running :  [read_lines_notify] : Growing installer main partition
[INFO ] : SWUPDATE running :  [read_lines_notify] : Resize device id 1 (/dev/loop0p1) from 394.00MiB to max
[ERROR] : SWUPDATE failed [0] ERROR : WARNING: the new size 0 (0.00B) is < 256MiB, this may be rejected by kernel
[INFO ] : SWUPDATE running :  [read_lines_notify] : Setting console to console=ttyLP0,115200 in installer
[INFO ] : SWUPDATE running :  [read_lines_notify] : Environment OK, copy 1
[INFO ] : SWUPDATE running :  [read_lines_notify] : Copying armadillo's root password to installer
[INFO ] : SWUPDATE running :  [read_lines_notify] : Copying boot image
[INFO ] : SWUPDATE running :  [read_lines_notify] : Installer will enable secure boot
[INFO ] : SWUPDATE running :  [read_lines_notify] : Copying rootfs
[INFO ] : SWUPDATE running :  [read_lines_notify] : Copying /opt/firmware filesystem
[INFO ] : SWUPDATE running :  [read_lines_notify] : Copying appfs
[INFO ] : SWUPDATE running :  [read_lines_notify] : At subvol app/snapshots/volumes
[INFO ] : SWUPDATE running :  [read_lines_notify] : At subvol app/snapshots/boot_volumes
[INFO ] : SWUPDATE running :  [read_lines_notify] : At subvol app/snapshots/boot_containers_storage
[INFO ] : SWUPDATE running :  [read_lines_notify] : Trying to shrink the installer partition...
[INFO ] : SWUPDATE running :  [read_lines_notify] : Shrinking the installer partition...
[INFO ] : SWUPDATE running :  [read_lines_notify] : Cleaning up and syncing changes to disk...
[INFO ] : SWUPDATE running :  [read_lines_notify] : Computing verity hashes...
[INFO ] : SWUPDATE running :  [read_lines_notify] : Installer updated successfully!
[INFO ] : SWUPDATE running :  [read_lines_notify] : -rw-------    1 root     root      409.1M Apr  2 16:49 /target/mnt/installer.img
[INFO ] : SWUPDATE running :  [read_lines_notify] : Installer successfully created!
[INFO ] : SWUPDATE running :  [install_single_image] : Installing post_script
[INFO ] : SWUPDATE running :  [read_lines_notify] : Removing unused containers
[INFO ] : SWUPDATE running :  Installation in progress
[INFO ] : SWUPDATE successful ! SWUPDATE successful !
swupdate exited

図4.4 secureboot_make_installer.swu インストール時のログ


完了後、USB メモリを抜いてください。 もし、エラーが出た場合は Armadillo の電源を再投入してやり直してみてください。

無事に生成が完了した場合、USB メモリ上に installer.img が保存されています。 この installer.img を microSD に書き込むことでインストールディスクを作成することができます。

4.1.3.1. ATDE への量産用インストールディスクイメージのコピー

USB メモリにある installer.img を ATDE 上にコピーします。

PC に USB メモリを挿入してください。 VirtualBoxの左上のペインの [デバイス] → [USB] から、USB メモリを ATDE にマウントします。 ここではホームディレクトリにコピーします。

[ATDE ~]$ sudo cp /media/atmark/<USB メモリをマウントしたディレクトリ>/installer.img ~/

図4.5 ATDE に量産用インストールディスクイメージをコピーする


量産用インストールディスクイメージである installer.img を microSD に書き込む方法は「量産用インストールディスクイメージを microSD に書き込む」をご参照ください。

4.2. 量産用インストールディスクイメージを 1 から作る方法

開発用 Armadillo の開発環境を複製せずに量産用インストールディスクイメージを作成する方法を紹介します。

ここで紹介する量産用インストールディスクイメージを量産用 Armadillo にインストールすると、以下のような環境を作成できます。

  • セキュアブートが有効化されている
  • rootfs 用、ログ書き込み用、ファームウェア用、アプリケーション用パーティションが暗号化されている
  • initial_setup.swu 及びアプリケーション用 SWU イメージ(例として release.swu )が予めインストールされている

4.2.1. 量産用インストールディスクイメージの作成

以下では secureboot.sh setup 及び secureboot.sh build を実行済みである前提です。

量産用インストールディスクイメージの作成には build-rootfs を使用します。 build-rootfs に含まれるファイルの説明は製品マニュアルをご参照ください。

Linux カーネルの modules と dtb の入れ替え

はじめに、build-rootfs/ax2/packages の linux-at-x2 をコメントアウトします。

[ATDE ~/secureboot_x2]$ code build-rootfs/ax2/packages
# linux-at is not available on all arches

# linux-at-x2@atmark 1

# wifi firwmares
wireless-regdb
linux-firmware-nxpwifi-9098

# encryped boot
cryptsetup
caam-decrypt

1

コメントアウトします。

最新の Linux カーネルイメージと modules を取得するために、./secureboot.sh linux を実行してください。

[ATDE ~/secureboot_x2]$ ./secureboot.sh linux --initrd-type none --linux-update

Logging build outputs to /home/atmark/secureboot_x2/tmp/linux.log

Downloading https://download.atmark-techno.com/armadillo-iot-g4/baseos/linux-at-x2-latest.apk 1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.1M  100 16.1M    0     0  3971k      0  0:00:04  0:00:04 --:--:-- 3971k

Signing linux image...
Created /home/atmark/secureboot_x2/out/Image.signed 2

1

最新の linux apk パッケージがダウンロードされて tmp/linux_apk が作成されます。

2

Image.signed が作成されますが、こちらは使用しませんので無視してください。

次に、lib/modules と boot/armadillo_iotg_g4.dtb を build-rootfs/ax2/resources にコピーします。

[ATDE ~/secureboot_x2]$ cp -r tmp/linux_apk/lib build-rootfs/ax2/resources/
[ATDE ~/secureboot_x2]$ cp tmp/linux_apk/boot/armadillo_iotg_g4.dtb \
    build-rootfs/ax2/resources/boot/

SWU イメージのインストール

initial_setup.swu や開発したアプリケーションを含む release.swu など、必要な SWU イメージは build-rootfs/ax2/image_installer/installer_swus に配置します。

SWU イメージはファイル名がアルファベット順にインストールされます。 インストールされる順番を保証するため、1_initial_setup.swu、2_release.swu にように名前を変更します。

ここでは、initial_setup.swu は /home/atmark/mkswu に、release.swu は /home/atmark/my_project にあるとします。

[ATDE ~/secureboot_x2]$ mkdir build-rootfs/ax2/image_installer/installer_swus
[ATDE ~/secureboot_x2]$ cp /home/atmark/mkswu/initial_setup.swu \
    build-rootfs/ax2/image_installer/installer_swus/1_initial_setup.swu
[ATDE ~/secureboot_x2]$ cp /home/atmark/my_project/release.swu \
    build-rootfs/ax2/image_installer/installer_swus/2_release.swu

rootfs のビルド

最新の rootfs を作成するために、以下のコマンドを実行してください。

[ATDE ~/secureboot_x2]$ cd build-rootfs
[ATDE ~/secureboot_x2/build-rootfs]$ ./build_rootfs.sh -b ax2

:(省略)
Successfully built /home/atmark/secureboot_x2/build-rootfs/baseos-x2-[VERSION].[DATE].tar.zst

インストールディスクイメージ改ざん防止のためのキーペアの生成

作成するインストールディスクイメージの改ざんの防止のために openssl で作成したキーペアを生成します。

[ATDE ~/secureboot_x2/build-rootfs]$ cd ..
[ATDE ~/secureboot_x2]$ openssl req -x509 -nodes -days 3650 -newkey ec \
    -pkeyopt ec_paramgen_curve:prime256v1 \
    -keyout verity_key.pem \
    -out verity_cert.pem \
    -subj /CN="secureboot installer"

Generating an EC private key
writing new private key to 'verity_key.pem'

署名済み Linux カーネルイメージの作成

暗号化は SoC 内の鍵を使用します。 正規のボード以外で eMMC 内のデータを復号して読み取ることが出来ないようにするために、 暗号化された eMMC 以外起動することができない Linux カーネルイメージに署名して Image.signed-mmc を作成します。

[ATDE ~/secureboot_x2]$ ./secureboot.sh linux --initrd-type mmc

Logging build outputs to /home/atmark/secureboot_x2/tmp/linux.log

Building initrd for mmc (first time is slow)
Signing linux image (mmc)...
Created /home/atmark/secureboot_x2/out/Image.signed-mmc

次に、インストールディスクイメージの改ざん防止用の署名済み Linux カーネルイメージである Image.signed-verity を作成します。

[ATDE ~/secureboot_x2]$ ./secureboot.sh linux \
    --initrd-type verity \
    --verity /home/atmark/secureboot_x2/verity_cert.pem

Logging build outputs to /home/atmark/secureboot_x2/tmp/linux.log

Building initrd for verity (first time is slow)
Signing linux image (verity)...
Created /home/atmark/secureboot_x2/out/Image.signed-verity

改ざんを防止するために、microSD に Image.signed-verity を書き込み、この Linux カーネルイメージを用いて SD ブートを実行します。

そのために、Image.signed-verity を build-rootfs/ax2/image_installer/boot/Image としてコピーします。

[ATDE ~/secureboot_x2]$ mkdir build-rootfs/ax2/image_installer/boot
[ATDE ~/secureboot_x2]$ cp out/Image.signed-verity \
    build-rootfs/ax2/image_installer/boot/Image

署名済みブートローダーの作成

署名済みブートローダーである imx-boot_armadillo_ax2.signed を作成します。

[ATDE ~/secureboot_x2]$ ./secureboot.sh imxboot

Logging build outputs to /home/atmark/secureboot_x2/tmp/imxboot.log

Building imx-boot (boot loader)...
Created /home/atmark/secureboot_x2/out/imx-boot_armadillo_x2.signed

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

インストールディスクイメージを作成する前に以下のコマンドを実行して、cryptsetup-bin をインストールします。 cryptsetup-bin はストレージの暗号化に使用します。

[ATDE ~/secureboot_x2]$ sudo apt update && sudo apt upgrade
[ATDE ~/secureboot_x2]$ sudo apt install cryptsetup-bin

eMMC に書き込む rootfs を含むイメージを作成するために以下のコマンドを実行してください。

[ATDE ~/secureboot_x2]$ cd build-rootfs
[ATDE ~/secureboot_x2/build-rootfs]$ ./build_image.sh -b ax2

use default(outdir=/home/atmark/secureboot_x2/build-rootfs)
use default(output=baseos-x2-[VERSION].[DATE].img)
:(省略)
Successfully built /home/atmark/secureboot_x2/build-rootfs/baseos-x2-[VERSION].[DATE].img

次に、インストールディスクイメージを作成します。

作成するインストールディスクイメージを microSD に書き込み、その microSD で SD ブートを実行します。

SD ブートを実行すると、改ざん防止用の署名済み Linux カーネルイメージが起動し、 先ほど作成したイメージと署名済みのブートローダー、署名済みの暗号化に対応した Linux カーネルイメージを eMMC に書き込みます。

以下のコマンドでは、eMMC に書き込まれるそれらのファイルを引数で指定して、インストールディスクイメージを作成します。

[ATDE ~/secureboot_x2/build-rootfs]$ PATH=/sbin:$PATH ./build_image.sh -b ax2 \
    --srk $(cat /home/atmark/secureboot_x2/tmp/srk_hash.txt) \
    --encrypt all \
    --boot /home/atmark/secureboot_x2/out/imx-boot_armadillo_x2.signed \
    --boot-linux /home/atmark/secureboot_x2/out/Image.signed-mmc \
    --verity /home/atmark/secureboot_x2/verity_cert.pem /home/atmark/secureboot_x2/verity_key.pem \
    --installer baseos-x2-[VERSION].[DATE].img

use default(outdir=/home/atmark/secureboot_x2/build-rootfs)
use default(output=baseos-[VERSION].[DATE]-installer.img)
:(省略)
Successfully built /home/atmark/secureboot_x2/build-rootfs/baseos-x2-[VERSION].[DATE]-installer.img

baseos-x2-[VERSION].[DATE]-installer.img が microSD に書き込む量産用インストールディスクイメージとなります。

必要であれば、量産用インストールディスクイメージ名を管理しやすい名前に変更してください。 ここでは、installer.img という名前でホームディレクトリにコピーします。

[ATDE ~/secureboot_x2/build-rootfs]$ cp baseos-x2-[VERSION].[DATE]-installer.img ~/installer.img

量産用インストールディスクイメージである installer.img を microSD に書き込む方法は「量産用インストールディスクイメージを microSD に書き込む」をご参照ください。

4.3. 量産用インストールディスクイメージを microSD に書き込む

「開発用 Armadillo の環境を複製する方法」または「量産用インストールディスクイメージを 1 から作る方法」で作成したインストールディスクイメージ installer.img を microSD に書き込み、開発に使用した Armadillo 以外の個体にインストールします。

[注意]

インストール先の Armadillo の eMMC 内のデータは上書きされて消えるため、以下のディレクトリにある必要なデータは予めバックアップを取っておいてください。

  • /var/app
  • /var/log
  • container image

以下のコマンドを実行して、installer.img を microSD に書き込んでください。

installer.img を microSD に書き込む手順は初期化インストールディスクの作成方法と同じですので、製品マニュアルの以下の節を参考にしてください。

上記で作成したインストールディスクを用いて量産用 Armadillo に量産用イメージをインストールする手順は製品マニュアルの以下の節を参考にしてください。

実際の量産製造においては、自社でイメージ書き込みを実施する他に、 アットマークテクノが提供する「 BTO サービス」 の「 ROM イメージ書込み」を利用する方法もあります。 詳細については、下記ページの BTO サービスマニュアルの一覧から各製品の BTO サービスマニュアルを参照してください。

4.4. 量産用 Armadillo の動作確認

量産用 Armadillo を起動します。 起動時のログは 「セキュアブートが有効になっているかの確認」 をご参照ください。

Armadillo にログイン後、以下のコマンドを実行すると、rootfs 用、ログ書き込み用、ファームウェア用、アプリケーション用パーティションが暗号化されていることを確認できます。

[armadillo ~]# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
mmcblk2       179:0    0   9.8G  0 disk
├─mmcblk2p1   179:1    0   300M  0 part
│ └─rootfs_0  252:0    0   299M  0 crypt /live/rootfs 1
├─mmcblk2p2   179:2    0   300M  0 part
├─mmcblk2p3   179:3    0    50M  0 part
│ └─mmcblk2p3 252:1    0    49M  0 crypt /var/log 2
├─mmcblk2p4   179:4    0   200M  0 part
│ └─mmcblk2p4 252:2    0   199M  0 crypt /opt/firmware 3
└─mmcblk2p5   179:5    0     9G  0 part
  └─mmcblk2p5 252:3    0     9G  0 crypt /var/tmp 4
                                         /var/app/volumes
                                         /var/app/rollback/volumes
                                         /var/lib/containers/storage_readonly
:(省略)

図4.6 ストレージが暗号化されていることを確認


1

Type が crypt になっているため、rootfs 用パーティションが暗号化されています。

2

Type が crypt になっているため、書き込みログ用パーティションが暗号化されています。

3

Type が crypt になっているため、ファームウェア用パーティションが暗号化されています。

4

Type が crypt になっているため、アプリケーション用パーティションが暗号化されています。