hagikuratakeshi's diary

I work as a Developer Programs Engineer @ Google. This is my personal blog and any views or opinions presented in this blog are solely mine, not my employers.

Google Compute Engine でUbuntuのイメージをISOから作って動かしてみる

English version, Building an Ubuntu custom image from scratch for Google Compute Engine is here.

Google Compute Engine上でUbuntuのイメージ(2014年5月時点では公式にはサポートされていない)をISOから作成して動かせたのでそのメモを残しておきます。 元々はdokkuという、HerokuのようなMini-PaaSがUbuntu上でしかインストールできないけどそれをCompute Engine上で動かしてみたかったためです。

注: この手順はFreeBSD用の似たような手順を参考にしています。 ブログポストだけでも完結できるように重複する手順もここに書いています。

Raw disk イメージを作成してUbuntuをインストールする

1. qemu の安定版をダウンロードしてローカルのワークステーション上でビルド

$ bzip2 -d <downloaded-file>
$ cd qemu-2.0.0
$ ./configure
$ make
$ make install

注: 試してないですがsudo apt-get install qemuのようにパッケージマネージャ経由でインストールしても大丈夫だと思います。

2. UbuntuのISOをダウンロード

後々の手順ではダウンロードしたファイル名は ubuntu-14.04-desktop-amd64.iso であると仮定します。

3. qemuを使用してraw diskを作成

$ qemu-img create disk.raw 10g

4. qemuVMを起動しUbuntuのISOからブート

$ qemu-system-x86_64 --enable-kvm -smp 1 -m 3750m -net nic,model=virtio -net user,hostfwd=tcp::2222-:22 -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd,physical_block_size=4096 -drive if=none,id=hd,file=disk.raw,cache=none -cdrom ubuntu-14.04-desktop-amd64.iso

注: qemuのゲストOSに後でsshできるようにローカルワークステーション(ホストOS)のTCP 2222番をゲストOSのTCP 22番にフォワードするようにしています。 -net user,hostfwd=tcp::2222-:22

うまくqemuインスタンスが起動できればVNCで接続できるようになるはずです: VNC server running on 127.0.0.1:5901

5. qemuVMインスタンスVNCクライアントで接続。ここの例だとクライアントとしてvncviewerを使っています

$ vncviewer -noshared -depth 16 -compresslevel 0 -quality 9 :<the last 2 digit of the port of the running VNC server>

E.g.

$ vncviewer -noshared -depth 16 -compresslevel 0 -quality 9 :1

6. Ubuntuを先ほどのISOからインストール (vncviewerのGUI経由)

f:id:hagikuratakeshi:20140510232127p:plain

GUI上の設定はデフォルトの値を設定しておきましょう。

このままvncviewer経由で以降の設定をしてもいいですが、カーネルオプションを変えたりする次のステップがやりやすいようにsshdをインストールしておきます。 sudo apt-get install ssh

Compute Engine上で起動できるように設定変更

7. Compute Engine上のイメージとしてブートできるための必須の変更をする

/etc/default/grubに以下のカーネルオプションを追加しておきます。

# to enable paravirtualization functionality.
CONFIG_KVM_GUEST=y

# to enable the paravirtualized clock.
CONFIG_KVM_CLOCK=y

# to enable paravirtualized PCI devices.
CONFIG_VIRTIO_PCI=y

# to enable access to paravirtualized disks.
CONFIG_SCSI_VIRTIO=y

# to enable access to the networking.
CONFIG_VIRTIO_NET=y

インストールしていなければPythonとsshdをインストールしておきます。

$ sudo apt-get install python
$ sudo apt-get install ssh

注: qemuVMインスタンスを立ち上げる時にポートフォワードの設定をしたのでローカルワークステーションからssh -p 2222 127.0.0.1のようにしてゲストVMsshできるはずです。

注: ここでは必須の変更しか取り上げていませんが、Compute Engineの公式ドキュメントに必須の設定に加えて、推奨される設定も記載してあるのでチェックしておくことをすすめます。

8. qemu VMをシャットダウンする

ここまでできたらqemuVMをシャットダウンします。

作成したraw diskをtar.gzでパッケージしてCompute Engineにアップロード。 (ここからまたローカルワークステーション上の手順)

9. イメージのパッケージング

以下のコマンドでtar.gzのパッケージを作成します。

$ tar -Szcf ubuntu_14.04_image.tar.gz disk.raw

10. 作成したパッケージをGoogle Cloud Storageにアップロード

Cloud StorageとCompute Engineのコマンドラインツールが必要なので、まだGoogle Cloud SDKをインストールしていなければ インストール手順にしたがってインストールしてください。

Google Cloud Storage上にバケットを作成します。

$ gsutil mb gs://<bucket-name>

作成したバケットにパッケージをアップロードします。

$ gsutil cp ubuntu_14.04_image.tar.gz gs://<bucket-name>

11. Cloud StorageにアップロードしたパッケージをCompute Engineのイメージとして登録

$ gcutil addimage ubuntu-14 gs://<bucket-name>/ubuntu_14.04_image.tar.gz

12. 先ほど登録したイメージからインスタンスを作成

$ gcutil addinstance ubuntu-14 --image=ubuntu-14 --zone=asia-east1-a --machine_type=n1-standard-1

13. 起動したインスタンスSSH接続

$ gcutil ssh --ssh_user=<Created-user-in-the-qemu-guest-image>  ubuntu-14

問題なければssh接続できるようになっているはずです。

$ gcutil ssh --ssh_user=thagikura ubuntu-14
INFO: Zone for ubuntu-14 detected as asia-east1-a.
INFO: Running command line: ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Sat May 10 13:31:42 2014 from xx.xxx.xx.xxx

thagikura@ubuntu-14:~$ uname -a
Linux ubuntu-14.c.gcp-samples.internal 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux