ども、ソリューションアーキテクトの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
手順としては以下の通りです。
- イメージファイルのマウント
- 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:パーティション拡張を抑制したり、あとからパーティションを縮小してもよいかもしれません。