Raspberry Pi 3B/3B+用Ubuntuイメージで初回起動に時間がかかる問題をなんとかする

2019年6月現在公開されているRaspberry Pi 3 Model B/B+用64bitUbuntuイメージを使ってオフラインでUbuntuをセットアップしようとすると、外部ネットワークへの接続待ちで数分待つことがあります。長いんですよね……
素直にLANケーブルを接続すればよいのですが、そうでなくても動くようにしたいなと思ってイメージに手を加えたのでその方法とその成果物をシェアしたいと思います。

動作確認をしたのは64bit版イメージのみですが、32bit版も同じように対処できると思います。今回紹介する方法で編集するイメージは本ページの「作成したイメージ」からダウンロードすることもできます。

発生する問題

Ubuntu Wikiにリンクが張られているイメージ(ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz)をmicroSDに書き込み、LANケーブルを接続せずにそのまま起動すると、以下の画像のように「A start job is running for Wait for Network to be Configured」と表示されなかなかログインさせてくれません。eth0がIPアドレスを取得できないためにsystemd-networkdがずっと待っていることが問題のようです。

なかなかログインさせてくれません……

環境

以下の環境でイメージ(ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz)を編集しました。

  • Ubuntu Desktop
    • 16.04.6と18.04.2でどちらでも問題なくイメージを編集できました

手順

まずはじめにUbuntu Wikiから64bit版のイメージをダウンロードして展開します。ダウンロードするディレクトリはどこでも問題ありません。今回は~/Downloads以下に展開することにしました。

cd ~/Downloads
curl -O http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz
xz -kdv ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz

次に/mnt以下に展開したイメージファイルをマウントします。/dev/mapper/loop11p2のところのloopNp2のNの値は使用しているPCの環境によって変わります。

sudo kpartx -a ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img
sudo mount /dev/mapper/loop11p2 /mnt

マウントしたイメージの中身を編集します。aptauto-upgradessystemd-networkdwait-onlineサービスを無効にします1)systemd-networkd-wait-online.serviceを無効にしてよいのか正直判断し切れていないのですが、以下のページでは無効にすれば動く(動きそう)という記述が、
Raspberry Pi 3にROS2をインストール – RT Robot Shop Blog
https://www.rt-shop.jp/blog/archives/11061

RaspberryPi 3B+でUbuntu 18.04を起動させる方法 【無線LAN動作確認済み】 – ASRobot
https://www.asrobot.me/entry/2018/07/05/045832/

以下のページでは無効にしても大丈夫そうという記述が見られるので、大丈夫なのだと思います。
NetworkManager-wait-online.serviceはどのような場合にenableにすれば良いか、を理詰めで考える – Qiita
https://qiita.com/yunano/items/8636a6dd6becad84920d

何かわかれば追記します。

cd /mnt/etc/apt/apt.conf.d/
sudo sed -i 's/1/0/g' 20auto-upgrades
cd /mnt/etc/systemd/system/network-online.target.wants
sudo rm -rf systemd-networkd-wait-online.service
sudo ln -s '/dev/null' systemd-networkd-wait-online.service

このあとイメージを圧縮する際にできる限りイメージサイズを小さくできるよう、未使用領域をゼロ埋めします2)ここで紹介している方法です。
https://memoteki.net/archives/1101#PC

sudo dd if=/dev/zero of=/mnt/dummy bs=4096
sudo rm /mnt/dummy

イメージをアンマウントします。

cd ~/Downloads
sudo umount /mnt
sudo kpartx -d /dev/loop11
sudo losetup -d /dev/loop11

アンマウントしたイメージをxzで圧縮します。

mv ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img ubuntu-18.04.2-preinstalled-server-arm64+raspi3-20190303.img
xz -kvz ubuntu-18.04.2-preinstalled-server-arm64+raspi3-20190303.img

以上でイメージの編集は完了です。

作成したイメージ

作成したイメージは以下のページに公開しました。

Tiryoh/RaspberryPi_Ubuntu
How to edit Ubuntu image of Raspberry Pi. Contribute to Tiryoh/RaspberryPi_Ubuntu development by creating an account on GitHub.

イメージの書き込みと起動

今回編集したイメージをmicroSDに書き込み、起動すると比較的すぐに(1分程度?)ログインできるようになります。

cloud-initubuntuアカウントのセットアップをしてくれているようで、初回はubuntu login:と表示されていてもCloud-init v(略) finished at (略)と表示されるまで待つ必要があります。

balenaEtcherを使うと簡単にmicroSDにイメージを書き込みができますので、おすすめです。
balenaEtcherはWindows/macOS/Linuxで使用できます。Windowsでの使い方は以下に書いていますので是非。

まとめ

Ubuntu Wikiにて紹介されているRaspberry Pi 3 Model B/B+用のイメージを編集してオフライン環境でも待たずに起動できるようにする方法を紹介しました。紹介した方法を用いて編集したイメージを用いることで起動時にsystemd-networkdがIPアドレス取得待ちでログインできるまで長時間待たされないようになることを確認しました。

   [ + ]

1. systemd-networkd-wait-online.serviceを無効にしてよいのか正直判断し切れていないのですが、以下のページでは無効にすれば動く(動きそう)という記述が、
Raspberry Pi 3にROS2をインストール – RT Robot Shop Blog
https://www.rt-shop.jp/blog/archives/11061

RaspberryPi 3B+でUbuntu 18.04を起動させる方法 【無線LAN動作確認済み】 – ASRobot
https://www.asrobot.me/entry/2018/07/05/045832/

以下のページでは無効にしても大丈夫そうという記述が見られるので、大丈夫なのだと思います。
NetworkManager-wait-online.serviceはどのような場合にenableにすれば良いか、を理詰めで考える – Qiita
https://qiita.com/yunano/items/8636a6dd6becad84920d

何かわかれば追記します。
2. ここで紹介している方法です。
https://memoteki.net/archives/1101#PC

コメント