第646回ではIoTデバイス用のプラットフォームとして利用されているUbuntu Coreの基本的な使い方を、
KVM版のUbuntu Coreの使い方
前回までと異なり、
後半で説明するイメージの作成方法はKVM版とRaspberry Pi版で違いはありません。異なるのは指定するカーネル等のsnapファイルの名前だけです。では、
本記事の手順に従ってカスタムイメージの作成方法を把握したあとは、
- PCからSDカードにカスタムイメージを書き込む
- Raspberry PiにSDカードを取り付ける
- Raspberry Piを起動する
- ディスプレイとキーボードを操作し、
初期セットアップを行う - SSH経由でログインし、
イメージの内容が正しいことを確認する - SDカードを取り外し、
PCに接続する - 最初に戻る
要するにイメージを作ったあとのステップがとても煩雑なのです。特に最近のRasypberry PiはSDカードスロットのスプリングロックがなくなったので、

本当に簡単に壊れてしまいます
いずれにせよトライアンドエラーをするなら、
まずはKVM版のUbuntu Coreの起動手順を紹介しましょう。特別なことは特になく、
$ sudo apt install qemu-kvm $ kvm-ok INFO: /dev/kvm exists KVM acceleration can be used $ sudo adduser $USER kvm
kvmグループへの参加を反映するために、
KVM環境が用意できたらUbuntu Coreのイメージをダウンロードし、
$ wget https://cdimage.ubuntu.com/ubuntu-core/18/stable/current/ubuntu-core-18-amd64.img.xz $ unxz ubuntu-core-18-amd64.img.xz $ cp ubuntu-core-18-amd64.img{,.bak}
上記のようにイメージのバックアップを取っておけば、
$ kvm -smp 2 -m 1500 -netdev user,id=mynet0,hostfwd=tcp::8022-:22 \ -device virtio-net-pci,netdev=mynet0 -nographic \ -drive file=ubuntu-core-18-amd64.img,format=raw
今回はUbuntu CoreにSSHログインすることを想定してゲストの22番ポートをホストの8022番ポートに転送しています。たとえばNextcloudをインストールするなら、hostfwd=tcp::8022-:22,hostfwd=tcp::8090-:80
」
GUIは使わないので-nographic
」-nographic
」-vga qxl
」
いずれにせよ上記でUbuntu Coreを起動したら、Press enter to configure.
」
セットアップが完了したら、
$ ssh -p 8022 <Ubuntu SSOのユーザー名>@localhost
仮想マシンインスタンスはSSHログインしてshutdown
コマンドを実行するか、pkill
コマンドで、
ちなみにKVMを起動したターミナルはGRUBメニューを表示する際に、reset
コマンドを引数なしで実行してください。
カスタムイメージの作成方法
次にUbuntu Coreのカスタムイメージの作成方法を紹介しましょう。カスタムイメージの作成ができるようになると、
- 任意のsnapパッケージがインストールされたイメージを構築できる
- 初回セットアップをスキップできる
- コンソールから直接ログイン可能に変更できる
- 任意のカーネル・
ブートローダーを利用できる
一番目のメリットは、
二番目のメリットがインストールの自動化に必要な仕組みです。通常配布されているUbuntu Coreはconsole-confによって初回セットアップ
system-user assertionはunmanagedなデバイスにのみ適用可能です。またその設定ファイル
初回セットアップの画面は
四番目のメリットは、
これらの理由から、
- Ubuntu SSOアカウント
(Snap Store用アカウント) - 上記アカウントに紐付いたGPG鍵
理論上はなくても作れるのですが、
- account-idの取得
- GPG鍵の作成・
登録 - model assertionファイルの作成
- カスタムイメージの作成
account-idの取得
Ubuntu SSOでアカウントを作成済みなら、
本記事で説明するツール類はこのaccount-idが必要になりますので、
GPG鍵の作成・登録
イメージを作成するための設定ファイルや、
アサーションを作るためには、
$ sudo snap install snapcraft --classic $ snapcraft login Enter your Ubuntu One e-mail address and password. If you do not have an Ubuntu One account, you can create one at https://snapcraft.io/account Email: <Ubuntu SSOのメールアドレス> Password: <Ubuntu SSOのパスワード> Login successful.
次にアサーション用のGPG鍵を作成します。
$ snapcraft create-key Passphrase: <パスフレーズ> Confirm passphrase: <パスフレーズ>
パスフレーズはGPG鍵を利用する際のそれです。作成されたGPG鍵は~/.snap/
」
作成した鍵をSnap Storeに登録します。
$ snapcraft register-key Enter your Ubuntu One e-mail address and password. If you do not have an Ubuntu One account, you can create one at https://snapcraft.io/account Email: <Ubuntu SSOのメールアドレス> Password: <Ubuntu SSOのパスワード> We strongly recommend enabling multi-factor authentication: https://help.ubuntu.com/community/SSO/FAQs/2FA Registering key ... Done. The key "default" (<鍵ID>) may be used to sign your assertions.
複数の鍵を登録可能なので、snapcraft regiter-key 鍵名
」default
」
登録された鍵は次の手順で確認可能です。
$ snapcraft list-keys Name SHA3-384 fingerprint * default <鍵ID>
model assertionファイルの作成
GPG鍵を作成できたので、
署名そのものはsnapコマンドで行えますので、pc.
」
{
"type": "model",
"authority-id": "account-idの文字列",
"brand-id": "account-idの文字列",
"series": "16",
"model": "pc",
"architecture": "amd64",
"base": "core18",
"gadget": "pc=18",
"kernel": "pc-kernel=18",
"timestamp": "2021-01-08T10:54:39+00:00"
}
変更する必要がある部分のみを説明します。
- authority-id/
brand-id:Snap Storeから取得したaccount-idの文字列をそのまま記述してください。 - model:モデル名を示す任意の文字列です。ファイル名と一緒にしておくとわかりやすいです。
- architecture:ターゲットのCPUアーキテクチャー名です。PC向けなら
「amd64」、 Raspberry Pi向けなら 「arm64」 「armhf」 のいずれかになるでしょう。 - base:ベースとなるsnapファイルです。Ubuntu Core 18ならcore18で、
将来的にリリースされるUbuntu Core 20ならcore20になります。 - gadget:gadget snapとしてインストールするsnapパッケージ名です。
- kernel:kernel snapとしてインストールするsnapパッケージ名です。
- timestamp:
「 date -Iseconds --utc
」で生成したタイムスタンプです。GPG鍵の登録日時よりも後ろである必要があります。
gadget snapとkernel snapについて補足しておきます。これらはターゲットデバイス依存のsnapパッケージであるため、
さらにsnapパッケージはパッケージ名の後ろに=channnel
」pi=18
」pi-kernel=18
」pc=20
」
Raspberry Pi向けには18-pi4
」18-pi3
」
また
作成したJSONファイルを署名します。
$ cat pc.json | snap sign -k default &> pc.model $ cat pc.model type: model authority-id: <account-id> series: 16 (以下略)
「default」snapcraft list-keys
」
error: cannot sign assertion: cannot sign using GPG: /usr/bin/gpg (中略) 署名に失敗しました: そのようなファイルやディレクトリはありません (後略)
原因は不明ですが、
$ gpg --homedir ~/.snap/gnupg --detach-sig pc.json
これを実行したあとにもう一度snap sign
を実行すれば成功しているはずです。うまくmodel assertionが生成されなかったら試してみてください。
ちなみにUbuntu WikiのUbuntuCoreの開発ページには、snap known ...
」
カスタムイメージの作成
ようやくカスタムイメージを作成するための必要なファイルを準備できました。次にイメージの作成手順に移りましょう。
イメージの作成そのものは、
$ sudo snap install ubuntu-image --classic
では実際にイメージを作成します。
$ mkdir pc $ sudo ubuntu-image snap -O pc pc.model $ ls -1 pc/ pc.img seed.manifest snaps.manifest
イメージの作成はsnapパッケージのダウンロードに時間がかかる程度でほぼすぐに終わる印象です。作られたファイルのうち
このコマンド実行時に--disable-console-conf
」
「-c チャンネル
」--snap パッケージ名
」パッケージ名=チャンネル名
」
他にもいろいろなオプションがあるので、ubuntu-image snap --help
」
作成したイメージは、
$ cp pc/pc.img{,.bak} $ kvm -smp 2 -m 1500 -netdev user,id=mynet0,hostfwd=tcp::8022-:22 \ -device virtio-net-pci,netdev=mynet0 -nographic \ -drive file=pc/pc.img,format=raw
今回は設定がほぼ同じなので、
これで独自イメージを作成する手順を確立できました。これの手順を把握しておけば、
たとえば第641回のubuntu-image snap
のオプションとして--snap microk8s=classic
」--cloud-init
」
ぜひ各自で好みのsnapパッケージをバンドルした、カスタムイメージを作ってみてください。