Ubuntu Weekly Recipe

第649回 Ubuntu Coreの独自イメージを作成する

この記事を読むのに必要な時間:およそ 6 分

第646回ではIoTデバイス用のプラットフォームとして利用されているUbuntu Coreの基本的な使い方を,第647回ではそのUbuntu Coreを用いてRaspberry Piを小型サーバーとして利用する方法を紹介しました。今回はUbuntu Coreの独自イメージを作成する手順を紹介しましょう。

KVM版のUbuntu Coreの使い方

前回までと異なり,今回はKVM版のUbuntu Coreの使い方から説明します。

後半で説明するイメージの作成方法はKVM版とRaspberry Pi版で違いはありません。異なるのは指定するカーネル等のsnapファイルの名前だけです。では,なぜKVM版を紹介するのかというと,それはトライアンドエラーが楽になるためです。

本記事の手順に従ってカスタムイメージの作成方法を把握したあとは,自分自身のベストな設定を見つけるために,イメージの作成・カスタマイズ・デプロイの流れを繰り返して行うことになります。そのときRaspberry Piが対象だと,次のようなステップが必要になります。

  1. PCからSDカードにカスタムイメージを書き込む
  2. Raspberry PiにSDカードを取り付ける
  3. Raspberry Piを起動する
  4. ディスプレイとキーボードを操作し,初期セットアップを行う
  5. SSH経由でログインし,イメージの内容が正しいことを確認する
  6. SDカードを取り外し,PCに接続する
  7. 最初に戻る

要するにイメージを作ったあとのステップがとても煩雑なのです。特に最近のRasypberry PiはSDカードスロットのスプリングロックがなくなったので,ケースの種類によっては引き出すのも一苦労です。奇しくもここ一週間ほど「Raspberry Piの最大の弱点はSDカード部分」って話が話題になったぐらいですしね。

Raspberry Piで一番弱いのがSDカード(画像はイメージです)

図1

本当に簡単に壊れてしまいます※1⁠。

※1
念のためお伝えしておくと,⁠ここ一週間ほど話題」になっていたのは,SDカードスロットの物理的な耐久性ではなく,SDカードそのものの電気的な耐久性の話です。上記画像のような結果になるのは単に優しさが足りないだけです。

いずれにせよトライアンドエラーをするなら,この手順を省力化したいところです。SDカードを取り外さずに更新する方法もなくはないのですが,新しめのRaspberry Piが必要だったり,特殊な基板が必要だったりと,汎用的な方法とは言えません。よっていっそのこと,仮想マシンを使ってPCの中で完結した手順でテストし,ある程度動く目処が立ってから実機に移行したほうが楽だと考えたわけです。

まずはKVM版のUbuntu Coreの起動手順を紹介しましょう。特別なことは特になく,Ubuntu Coreのイメージをダウンロードしてきて起動する,それだけです。KVMをあらかじめインストールしておきます。

$ sudo apt install qemu-kvm
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
$ sudo adduser $USER kvm

kvmグループへの参加を反映するために,一度ログインし直しておいてください。ちなみにVirtualBoxが動いているとKVMは使えません。VirtualBox関連のカーネルモジュール(vboxXXX)をアンロードすれば利用可能なはずですが,場合によってはVirtaulBoxパッケージを削除してしまったほうが確実かもしれません。VirtualBoxと併用したいのであれば,VirtualBox上に仮想マシンとしてUbuntuを用意し,第604回を参考にNested VMを有効化して,その中でKVMを使うという手もあります。今回はコンソール・ネットワーク経由でしかUbuntu Coreを使わないので,仮想マシンインスタンスはサーバー版でも問題ありません。

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/QEMUコマンドでこのイメージを起動します。

$ 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をインストールするなら,443や80なども同じような形で転送すると便利でしょう。hostfwd=tcp::8022-:22,hostfwd=tcp::8090-:80のようにカンマ区切りで追記していけば大丈夫です。

GUIは使わないので-nographicを追加しています。これによりVGAの中身が標準出力に転送されます。Ubuntu Coreの初期設定も,KVMを起動した端末画面から設定可能です。MirなどGUIを利用するsnapパッケージをインストールするなら-nographicの代わりに-vga qxlなどを指定してください※2⁠。

※2
さらに第595回のリモートデスクトップのためのSPICEクライアントあれこれで紹介しているSPICEクライアントと組み合わせれば,リモートデスクトップ的な使い方も可能です。

いずれにせよ上記でUbuntu Coreを起動したら,起動ログが一通り流れたあとにPress enter to configure.と表示されるはずです。あとは第646回と同じように画面の指示に従ってセットアップしてください。

セットアップが完了したら,次の方法でログインできます。

$ ssh -p 8022 <Ubuntu SSOのユーザー名>@localhost

仮想マシンインスタンスはSSHログインしてshutdownコマンドを実行するか,KVMを起動したターミナルから「Ctrl-a x」と入力してください。Ubuntu Coreならpkillコマンドで,仮想マシンインスタンスのプロセスを落としてしまってもいいでしょう。

ちなみにKVMを起動したターミナルはGRUBメニューを表示する際に,ターミナルの設定が通常と変わった状態になってしまいます。元に戻したい場合はresetコマンドを引数なしで実行してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。