Skip to main content

ソフトウェアアップデートのビルドとパッケージ

このチュートリアルでは、シンプルな Hello World アプリケーションを C 言語でビルドし、Debian の .deb パッケージとしてパッケージ化する手順を説明します。これは、DigiCert® Device Trust Manager を使って Debian Linux ベースの IoT デバイスにデプロイできるソフトウェアアップデートを作成する入門書になります。

注記

Device Trust Manager を通してデバイスにソフトウェアアップデートをデプロイするには、アドバンスプラン以上が必要です。

目的

  • 基本的な C 言語のアプリケーションを開発する: ARM と x86 の両アーキテクチャに対応したシンプルな Hello World プログラムを C 言語で記述してからコンパイルし、クロスプラットフォームのソフトウェア開発の基礎を築きます。

  • アプリケーションを Debian パッケージにパッケージ化する: Debian .deb パッケージの作成方法を学び、Debian ベースのシステムに簡単に配布・インストールできるようにアプリケーションを準備します。

  • インストールと実行をテストする: パッケージ化されたアプリケーションが正しくインストールされ、サポートされているデバイスで動作することを確認し、デプロイ前に機能を検証します。

要件

  • Ubuntu 22.04 x64 または互換性のある Linux システム: アプリケーションのコンパイルとパッケージングに必要な環境になります。

  • ARM64 および x86-64 用の GCC クロスコンパイラ: 複数のアーキテクチャ用にアプリケーションをコンパイルするときに必要。このチュートリアルでは gcc-x86-64-linux-gnugcc-aarch64-linux-gnu を使用します。

  • ターミナルコマンドに関する基本的な知識: コマンドラインに慣れていると、チュートリアルのステップを進んでいくのに有利です。

  • テキストエディタ: nanovim などで C プログラムやスクリプトを記述します。このチュートリアルでは nano を使用します。

まず、システムでソフトウェアアップデートをコンパイルしてパッケージ化する準備ができていることを確認します。その一環として、ARM64 および x86-64 アーキテクチャの両方でアプリケーションをビルドするときに必要な GCC クロスコンパイラをチェックし、必要に応じてインストールします。

重要

このチュートリアルは Ubuntu 22.04 x64 でテスト済みです。これとは異なるディストリビューションを使用している場合は、パッケージ名やインストールコマンドが異なる場合もあります。

GCC クロスコンパイラの確認

Device Trust Manager は各種アーキテクチャの IoT デバイスをサポートしているため、x86-64 と ARM64 の両方に対応する GCC コンパイラが必要です。

ターミナルで以下のコマンドを実行して、x86-64 と ARM64 の GCC コンパイラを確認してください。

x86_64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc --version

これらのコマンドでバージョン情報が返された場合はコンパイラがインストールされているので、ステップ 2 に進むことができます。

必要な場合は、不足しているコンパイラを以下のコマンドでインストールできます:

sudo apt install gcc-x86-64-linux-gnu gcc-aarch64-linux-gnu

これで必要なコンパイラの環境が整い、アプリケーションを記述してコンパイルする準備ができました。

このステップでは、「Hello World」と出力する簡単な C プログラムを作成し、クロスプラットフォームデプロイメントのために x86-64 と ARM64 の両アーキテクチャ用としてコンパイルします。

hello world プログラムの記述

まず、helloworld.c というファイルを新規に作成します。

nano helloworld.c

では、コンソールに「DigiCert Hello World!」と出力する簡単な C プログラムを書いてみましょう。これがソフトウェアアップデートの基礎になります。次のコードをファイルに追加します。

#include <stdio.h>

int main() {
    printf("DigiCert Hello World!\n");
    return 0;
}

ファイルを保存して閉じます。nanoCtrl + X を押し、Y で確定して、Enter キーで保存します。

プログラムのコンパイル

各種のデバイスとの互換性を確保するために、両方のアーキテクチャ用にプログラムをコンパイルする準備が、これで整いました。

x86-64 デバイス用にコンパイルします。

x86_64-linux-gnu-gcc helloworld.c -o hello_x86-64

ARM64 デバイス用にコンパイルします。

aarch64-linux-gnu-gcc helloworld.c -o hello_arm64

コンパイルしたアプリケーションのテスト

コンパイルが終わったら、アプリケーションが意図したアーキテクチャ上で意図したとおりに動くかどうか確認することが重要です。実行ファイルをそれぞれ適切なアーキテクチャで実行します。

x86-64 システムの場合:

./hello_x86-64

ARM64 システムの場合:

./hello_arm64

正しく実行された場合、出力は次のようになるはずです。

DigiCert Hello World!

これで、クロスプラットフォームの Hello World アプリケーションを記述してコンパイルすることに成功しました。次に、これを Debian パッケージとしてパッケージ化し、デバイス間でデプロイできるようにします。

アプリケーションのコンパイルまで済んだので、Debian .deb ファイルとしてパッケージ化することができます。これにより、互換性のあるデバイスへの配布とインストールが容易になります。パッケージ化には、標準構造の作成、パッケージメタデータの定義、アーキテクチャ固有のバイナリを管理するためのインストール後のスクリプトの追加などの手順があります。

Debian パッケージ構造のセットアップ

まず、Debian パッケージに必要なディレクトリ構造を作成します。

mkdir digicert-hello-world-all
mkdir digicert-hello-world-all/DEBIAN

パッケージメタデータの定義

Debian の各パッケージには、パッケージ名やバージョン、説明といったメタデータを定義する制御ファイルがあります。新しい制御ファイルを開いて、この情報を追加します。

nano digicert-hello-world-all/DEBIAN/control

制御ファイルに以下の内容を追加します。

Package: digicert-hello-world-all
Version: 0.1
Section: custom
Priority: optional
Architecture: all
Essential: no
Installed-Size: 1024
Maintainer: digicert.com
Description: Sample Hello World Debian package - for demo purposes

注記

このパッケージには複数のアーキテクチャ(x86 と ARM)用のバイナリが含まれているため、Architecture フィールドは all に設定されています。

この情報を追加したら、Ctrl + XY の順に押して確定し、Enter キーでファイルを保存して閉じます。

コンパイルしたバイナリの追加

コンパイルしたアプリケーションバイナリを、パッケージ構造内の適切なディレクトリに配置します。

mkdir -p digicert-hello-world-all/usr/bin
cp hello_x86-64 hello_arm64 digicert-hello-world-all/usr/bin/

インストール後スクリプトの作成

インストール後スクリプトでは、デバイスのアーキテクチャに基づいた正しいバイナリへのシンボリックリンクが作成されます。これで、helloworld コマンドが各アーキテクチャに適したバイナリを示すようになります。

  1. postinst ファイルを作成します。

    sudo nano digicert-hello-world-all/DEBIAN/postinst
  2. スクリプトに次のコードを追加します。

    #!/bin/bash
    ARCH=$(dpkg --print-architecture)
    if [ "$ARCH" = "arm64" ]; then
        ln -sf /usr/bin/hello_arm64 /usr/local/bin/helloworld
    elif [ "$ARCH" = "amd64" ]; then
        ln -sf /usr/bin/hello_x86-64 /usr/local/bin/helloworld
    fi

    注記

    上記のスクリプトは、dpkg --print-architecture を使用してアーキテクチャ(ARM64 または x86-64)を検出し、正しいバイナリへのシンボリックリンクを作成しています。

  3. インストール中に正しく実行されるように、postinst ファイルを実行可能ファイルに設定します。

    sudo chmod 775 digicert-hello-world-all/DEBIAN/postinst

パッケージ構造の確認

パッケージ構造が正しく設定されているかどうかを確認するには、tree コマンドを使用します。このコマンドでディレクトリの内容がリストされ、ファイルが正しく配置されていることを確認できます。

tree -L 3 digicert-hello-world-all

出力は次のようになります。

digicert-hello-world-all
├── DEBIAN
│   ├── control
│   └── postinst
└── usr
    └── bin
        ├── hello_x86-64
        └── hello_arm64

Debian パッケージのビルド

パッケージ構造が完成したら、dpkg-deb を使って .deb パッケージファイルを生成します。

dpkg-deb --build digicert-hello-world-all

dpkg-deb --build コマンドは、digicert-hello-world-all ディレクトリから .deb パッケージを作成します。これは、ローカルでのテストや互換性のあるデバイスへのデプロイに使用できます。

.deb パッケージの準備ができたら、Linux デバイスにインストールしてテストし、すべてが意図したとおりに機能することを確認しましょう。

パッケージのインストール

パッケージをインストールするには、dpkg -i コマンドを使います。次のコマンドは digicert-hello-world-all パッケージをデバイスにインストールします。

sudo dpkg -i digicert-hello-world-all.deb

アプリケーションの実行

インストールが済んだらアプリケーションを実行し、正しく実行されることを確認します。

helloworld

パッケージが正常にインストールされていれば、次のような出力が表示されるはずです。

DigiCert Hello World!