Ubuntu 上で ARM 版 Raspbian (buster) の隔離された開発環境を作成する方法(qemu-debootstrap 使用)

【概要】Ubuntu 24.04 上に、qemu-debootstrap を使用して ARM 版 Raspbian (buster) の隔離された開発環境を構築する方法を解説する。schroot の設定による一般ユーザでの利用、SSH リモートログイン環境の構築までを扱う。

【この環境のメリット】Raspberry Pi 実機がなくても ARM 向けプログラムの開発・テストが可能になる。ホスト環境を汚さずに隔離された環境で作業できるため、実験的な開発にも適している。

【前提条件と注意事項】

【目次】

  1. 前準備
  2. 隔離された開発環境の構築
  3. schroot の設定
  4. リモートログイン環境の構築

【サイト内の関連ページ】

前準備

Ubuntu のシステム更新

Ubuntu でシステム更新を行うには、以下のコマンドを実行する。

Ubuntu のインストール手順は別ページで解説している。

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを更新(依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now

隔離された開発環境の構築

  1. 必要なパッケージのインストール

    以下のパッケージをインストールする。

    • qemu-user-static:異なる CPU アーキテクチャのバイナリを実行するためのエミュレータ
    • debootstrap:Debian 系システムの最小構成を構築するツール
    • schroot:一般ユーザが chroot 環境を利用するためのツール
    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install qemu-user-static debootstrap schroot
    
    パッケージインストールの実行画面
  2. ARM 版 Raspbian (buster) 環境の構築

    qemu-debootstrap を使用して、ARM アーキテクチャの Raspbian 環境を構築する。この環境は chroot(ルートディレクトリを変更して隔離された環境を作る仕組み)により、ホストシステムから独立して動作する。

    armhf 版 Debian 環境の構築手順は、別ページを参照すること。

    設定内容は以下のとおりである。

    • アーキテクチャ:armel(ARM EABI、ソフトウェア浮動小数点演算)
    • バージョン:Raspbian Debian 10 ベース (buster)
    • 使用ディレクトリ:/home/raspbian
    • インストールバリアント:buildd(パッケージビルド用の最小構成)
    • ダウンロード元:https://archive.raspbian.org/raspbian

    環境構築の完了までには時間を要する。

    sudo rm -rf /home/raspbian
    sudo mkdir /home/raspbian
    sudo qemu-debootstrap --foreign --arch armel --variant buildd --include=ca-certificates,apt,wget,sudo,vim-tiny,debootstrap buster /home/raspbian https://archive.raspbian.org/raspbian
    
    qemu-debootstrap 実行中の画面
  3. 構築完了の確認
    構築完了時の画面
  4. アーキテクチャの確認

    ARM 版 Raspbian (buster) 環境で uname -m を実行し、アーキテクチャを確認する。armv7l などの ARM アーキテクチャ名が表示されれば成功である。

    sudo chroot /home/raspbian
    uname -m
    exit
    
    uname -m 実行結果の画面
  5. 構築した環境(chroot 環境)の動作確認

    ここでは、nano エディタのインストール、C プログラムの作成、ビルド、実行を行う。

    1. 管理者権限で chroot 環境に入り、uname -m でアーキテクチャを確認する
      sudo chroot /home/raspbian
      uname -m
      
      chroot 環境でのアーキテクチャ確認画面
    2. nano エディタのインストール
      apt update
      apt upgrade
      apt install nano
      
      nano インストール完了画面
    3. 動作確認用プログラムの作成

      エディタで以下のコードを入力し、/tmp/hello.c として保存する。

      #include<stdio.h>
      int main() {
          printf("Hello,World!\n");
          printf("sizeof(size_t)=%ld\n", sizeof(size_t));
          return 0;
      }
      
      hello.c のコード入力画面
      hello.c の保存画面
    4. プログラムのコンパイルと実行
      cd /tmp
      gcc -o a.out hello.c
      ./a.out
      
      プログラムのコンパイルと実行結果
    5. 環境からの退出
      exit
      
      chroot 環境からの退出画面

schroot の設定

schroot を設定すると、sudo を使わずに一般ユーザ権限で chroot 環境を利用できるようになる。

  1. /etc/schroot/chroot.d/raspbian の設定

    directory=/home/raspbian は、実際の構築ディレクトリに合わせて設定する。

    kaneko の部分は、使用を許可するユーザ名に変更する。複数ユーザを指定する場合はカンマ区切りで記述する。

    [raspbian]
    description=Debian GNU/Linux 10 (Buster)
    type=directory
    directory=/home/raspbian
    root-users=kaneko
    users=kaneko
    
    schroot 設定ファイルの内容
  2. schroot の動作確認
    schroot -c raspbian -p bash
    uname -m
    exit
    
    schroot 動作確認の画面
  3. 管理者権限での動作確認
    schroot -c raspbian -p bash -u root
    uname -m
    exit
    
    管理者権限での schroot 動作確認画面

リモートログイン環境の構築

SSH 経由で直接 chroot 環境にログインできるよう設定する。これにより、リモートから ARM 開発環境に接続して作業できるようになる。

新規ユーザの作成

SSH リモートログイン用のユーザを作成する。

sudo adduser --uid 1234 --home /home/ai ai
ユーザ作成コマンドの実行画面

再設定する場合は、sudo deluser ai でアカウントを削除してから再度実行する。

ユーザ削除コマンドの実行画面

chroot 環境内のユーザ設定

chroot 環境内で sudo 実行権限を持つユーザアカウントを作成する。

ホスト環境のパスワードと同一である必要はないが、ユーザ ID、ホームディレクトリ、ユーザ名はホスト環境と一致させる必要がある。

sudo chroot /home/raspbian
rm -rf /home/ai
deluser ai
adduser --uid 1234 --ingroup sudo --home /home/ai ai
exit
chroot 環境内でのユーザ作成画面

/home/raspbian/etc/sudoers の設定

chroot 環境内で sudo を実行可能にするための設定である。この機能が不要な場合は省略できる。

/home/raspbian/etc/sudoersDefaults visiblepw を追記する。

sudoers ファイルの編集画面

追記後、適切な権限を設定する。

sudo chmod 444 /home/raspbian/etc/sudoers
sudo chmod 444 /home/raspbian/etc/sudoers.d/*
sudoers ファイルの権限設定画面

ディレクトリ権限の設定

SSH リモートログイン用の権限設定を行う。SSH の chroot 機能を使用するには、対象ディレクトリの所有者が root で、かつ他のユーザに書き込み権限がない必要がある。所有者を root に設定し、権限を 755 に設定する。

sudo chown root:root /home
sudo chmod 755 /home
sudo chown root:root /home/raspbian
sudo chmod 755 /home/raspbian
sudo chown root:root /home/raspbian/home
sudo chmod 755 /home/raspbian/home
sudo chown root:root /home/raspbian/home/ai
sudo chmod 755 /home/raspbian/home/ai
ディレクトリ権限設定の実行画面

/etc/ssh/sshd_config の設定

SSH リモートログイン時に chroot を実行するための設定を行う。/etc/ssh/sshd_config に以下の内容を追記する。

ChrootDirectory=/home/raspbian は、実際の構築ディレクトリに合わせて設定する。

Match User ai
        X11Forwarding yes
        AllowTcpForwarding yes
        ChrootDirectory /home/raspbian
sshd_config の設定内容

sshd の再起動

設定を反映するため、sshd を再起動する。

sudo service sshd reload
sshd 再起動の実行画面

SSH ログインのテスト

ssh ai@localhost

ログインできない場合は、/etc/ssh/sshd_config の設定内容および「ディレクトリ権限の設定」の内容を確認する。

SSH ログイン成功時の画面