• 投稿日
  • Raspberry Piのイメージファイルをカスタマイズする

    ども、ソリューションアーキテクトのtakipone(大瀧)です。

    Discovery 2019 の開催がいよいよ来週に迫ってきました。当日要チェックなコーナーとして、こちらの記事でも紹介しているハンズオンコーナーがありますが、今回 新サービス体験ハンズオン のセットアップをすることになり、そこで苦労したRaspberry Piのイメージ複製を通して得られたノウハウをお伝えしたいと思います。

    Raspberry Piのイメージファイルとは

    Raspberry Piは代表的なSBC(Single Board Computer)として様々な用途で活躍していますね。イメージファイルというのはRaspberry Piを動作させるために必要なRasbianなどOSを含むディスクのイメージファイルで、通常はSDカードに書き込んで利用するものです。以下からダウンロードできます。

    今回のハンズオン用途では、複数のRaspbery Piにあらかじめ同じ設定を入れるため、Raspberry Piを1台セットアップしたあとそのSDカードを複製する手順を考えました。SDカードの複製は必要なファイルをコピーしていけば良いかと思いきや、SDカードからOSを起動させるためのブートレコードやパーティション構成など、ファイルのコピーだけでは足りない情報があります。そこで、それらを含めたSDカードまるごとでのコピーを考えましたが、最近のRaspbianは初回起動時にSDカードのサイズに合わせたパーティション拡張が動くため、複製先のSDカードのサイズが小さいとエラーになってしまいます*1 。一般的なSDカードは「8GB」や「16GB」と書かれていてもメーカーや型番によって厳密なサイズはまちまちで、同じ8GBでも少しだけサイズが小さいとエラーになります。今回、10数台でSDカードをまるごとコピーしようとしたら、半分以上ダメという残念な結果になりましたw

    そこでおすすめするのが、イメージファイルを直接編集(カスタマイズ)してそれをSDカードに書き込む方法です。

    Raspberry Piのイメージファイルをカスタマイズする

    イメージファイルをマウントして、その中をいじろうというやり方です。ファイルコピー以外にソフトウェアのインストールが必要な場合は、 chroot でルートファイルシステムをイメージファイルに変更することで対応できます。 chroot しないのであれば、MacOSなどLinux以外のOSでもext4ファイルシステムのマウントを準備して事足りるかもしれませんが、今回はソフトウェアのインストールを行うために作業用のRaspberry PiにRaspbianをインストール、そのローカルディスクにイメージファイルを配置して、作業しました。

    動作確認環境

    • ハードウェア : Raspberry Pi 3 B+
    • OS : Raspbian Buster Lite 2019-06-20
    • イメージファイル : Raspbian Buster Lite  2019-06-20

    手順としては以下の通りです。

    1. イメージファイルのマウント
    2. chrootの実行

    イメージファイルのマウント

    イメージファイル内にアクセスできるよう、まずはマウントします。Raspbianのイメージファイルはディスク全体を含む複数パーティション構成のため、デバイスマッパーでパーティションごとのデバイスファイルを用意しましょう。先に作業に必要なパッケージを作業環境にインストールして kpartx ユーティリティを実行しデバイスファイルを生成します。

    $ sudo apt install kpartx zip
      : 
    $ sudo unzip 2019-06-20-raspbian-buster-lite.zip
    Archive: 2019-06-20-raspbian-buster-lite.zip
    inflating: 2019-06-20-raspbian-buster-lite.img
    $ sudo kpartx -av 2019-06-20-raspbian-buster-lite.img
    add map loop0p1 (254:0): 0 524289 linear 7:0 8192
    add map loop0p2 (254:1): 0 3751936 linear 7:0 540672
    $ ls /dev/mapper/
    control  loop0p1  loop0p2
    $

    Raspbianのイメージファイルは、1番目のパーティションが /boot ( loop0p1 ファイル)、2番目のパーティションがルートファイルシステム ( loop0p2 ファイル)です。今回はルートファイルシステムを編集するので、マウントポイント /newroot に /dev/mapper/loop0p2 をマウントします。

    $ sudo mkdir /newroot
    $ sudo mount -t ext4 -o loop /dev/mapper/loop0p2 /newroot/
    $ ls /newroot/
    bin   dev  home  lost+found  mnt      opt   root  sbin  sys  usr
    boot  etc  lib   media       proc  run   srv   tmp  var
    $

    ルートファイルシステムの中身が見えていますね。これでイメージ内のファイル編集が可能になりました。

    chrootの実行

    続いてchrootを実行すれば、パッケージの操作などファイルコピーでは対応しにくいオペレーションがイメージファイル内でできるようになります。今回はApacheとPHPのパッケージをインストールしてみます。

    $ sudo chroot /newroot
    root@raspberrypi:/# apt install apache2 php
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
      :(略)
    root@raspberrypi:/# ls /etc/php/7.3/apache2/php.ini
    /etc/php/7.3/apache2/php.ini

    良い感じですね!あとはカスタマイズ操作を一通りこなしてアンマウントしましょう。

    root@raspberrypi:/# apt clean all # aptのキャッシュクリア
    root@raspberrypi:/# <Ctrl> + <D>
    $ sudo umount /newroot

    これでイメージファイルは完成です。必要に応じてZIPで固めて持ち出しましょう。

    $ sudo apt install zip
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following NEW packages will be installed:
      zip
      : 
    $ sudo zip custom.zip 2019-06-20-raspbian-buster-lite.img
      adding: 2019-06-20-raspbian-buster-lite.img
    $ ls custom.zip 
    custom.zip 
    $

    まとめ

    Raspberry Piのイメージファイルをカスタマイズする方法をご紹介しました。ブログの中身は地味ですが、新サービスのハンズオンはワクワクと驚きが詰まった良い内容になっていると思いますので、参加される方はぜひトライしてみてください!そうでない方も、新サービスはすごく便利だと思うので、発表をお楽しみに!

    参考URL

    *1:パーティション拡張を抑制したり、あとからパーティションを縮小してもよいかもしれません。