Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

MacでQEMUを使ってCoreOS環境を構築する

この記事はQiitaで公開されていました

開発環境として、CoreOSをMac OS X+QEMUに導入したのでメモ書き。

情報

  • QEMU stable 2.5.0
  • CoreOS 835.13.0

QEMU

お手軽にHomebrewでインストールします。

$ brew install qemu

時間がかかるので、待ちましょう。

CoreOS

公式情報を参考にイメージを取得。

$ mkdir coreos
$ cd coreos
$ curl -O http://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu.sh
$ curl -O http://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu_image.img.bz2
$ bzip2 -d coreos_production_qemu_image.img.bz2
$ chmod +x coreos_production_qemu.sh

上記は、シグネチャの検証をさぼってます。公式ドキュメントにあるように、gpgで検証した方がいいです。

起動スクリプトの修正

coreos_production_qemu.shはLinux前提になっているので、書き換えます。OS Xにはprocfsが無いので、CPUコア数を返す別のコマンドで代用します。

-VM_NCPUS="`grep -c ^processor /proc/cpuinfo`"
+VM_NCPUS="`system_profiler SPHardwareDataType | awk '/Total Number of Cores/ { print $NF }'`"

同様に、KVMも無いので、KVMを使わないように設定します。

-SAFE_ARGS=0
+SAFE_ARGS=1

OS Xのmktempは、-tオプションの意味がLinuxとは異なるので、オプションを外してしまいましょう。

-CONFIG_DRIVE=$(mktemp -t -d coreos-configdrive.XXXXXXXXXX)
+CONFIG_DRIVE=$(mktemp -d coreos-configdrive.XXXXXXXXXX)

これでcoreos_production_qemu.shを実行すると、

fsdev is not supported

といったエラーで実行できませんでした。これは9pを使って、ホストのリソースをCoreOSから参照できるようにするために必要です。CoreOSは、rootのパスワードが設定されていませんので、公開鍵を使ってSSH接続させるしかログインする方法がありませんが、9pが使えないので、公開鍵をCoreOSに渡すことができず、結局ログインできません。

どうしようかなと思いましたが、Config Driveとしてcloud-configファイルを含むisoイメージをマウントさせる方法で対応できました。

$ mkdir -p data/openstack/latest
$ cat data/openstack/latest/user_data
#cloud-config

hostname: dev
ssh_authorized_keys:
 - "ssh-rsa XXXXXXXXXX(SSH公開鍵の内容)"
$ hdiutil makehybrid -iso -joliet -default-volume-name config-2 -o config.iso data

イメージができたら、起動スクリプトに設定します。

-CONFIG_IMAGE=""
+CONFIG_IMAGE="config.iso"

(snip)

-set -- -drive if=virtio,file="${CONFIG_IMAGE}" "$@"
+set -- -drive if=virtio,file="${CONFIG_IMAGE}",media=cdrom "$@"

ログイン

以下コマンドでログイン出来ます。

$ ssh -l core -p 2222 localhost

ホストからdockerを操作する

起動スクリプトで、ポートを解放します。

+DOCKER_PORT=2375

(snip)

qemu-system-x86_64 \
    -name "$VM_NAME" \
    -m ${VM_MEMORY} \
    -net nic,vlan=0,model=virtio \
-  -net user,vlan=0,hostfwd=tcp::"${SSH_PORT}"-:22,hostname="${VM_NAME}" \
+   -net user,vlan=0,hostfwd=tcp::"${SSH_PORT}"-:22,hostfwd=tcp::"${DOCKER_PORT}"-:2375,hostname="${VM_NAME}" \
    "$@"

cloud-configファイルに以下を追加して、TCPで待ち受けるように変更します。

coreos:
  units:
    - name: docker.service
      command: start
      enable: true
    - name: docker-tcp.socket
      command: start
      enable: true
      content: |
        [Unit]
        Description=Docker Socket for the API

        [Socket]
        ListenStream=2375
        BindIPv6Only=both
        Service=docker.service

        [Install]
        WantedBy=sockets.target

ディスク容量の追加

これで可能みたい。

$ qemu-img resize coreos_production_qemu_image.img +5G

または、不要なボリュームを削除しましょう。

docker volume rm $(docker volume ls -f 'dangling=true' -q)