LXDを試してみた

はじめに

LXDに関するページをいくつか紹介します。

目指しているのは以下の様なものらしいです。

セットアップ

Ubuntu 14.04で試しました。 バイナリパッケージをインストールする手順とソースからビルドする手順を書いておきますが、実際に試したのは後者です。正確には最初前者を試したのですが、その後何してよいかドキュメントが見当たらないので後者を試した感じです。

バイナリパッケージをインストールする手順

The next hypervisor: LXD is fast, secure container management for Linux | Cloud | Ubuntuの"Getting started with LXD"に書いてあります。

add-apt-repositoryを使うため事前にsoftware-properties-commonパッケージをインストールしておく必要があります。

sudo aptitude install software-properties-common

その後以下のコマンドを実行します。

sudo add-apt-repository cloud-archive:juno
sudo apt-get update
sudo apt-get install nova-compute-flex

ソースからビルドする手順

lxc/lxdの手順に従います。

以下のコマンドで依存ライブラリをインストールします。

sudo apt-get install lxc lxc-dev mercurial git pkg-config

Goをインストールします。

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ubuntu-lxc/lxd-daily
sudo apt-get update
sudo apt-get install golang

GOPATHのディレクトリを作成して、GOPATH環境変数を設定します。 以下はbashを使っている想定で ~/.bashrc に追加してシェルを再起動する例です。

mkdir -p ~/go
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
exec $SHELL -l

go getしてソースディレクトリに移動してビルドします。

go get github.com/lxc/lxd
cd $GOPATH/src/github.com/lxc/lxd
go get -v -d ./...
make

./lxc/lxcと./lxd/lxdという2つの実行ファイルが作られます。

vagrant@ubuntu-1404:~/go/src/github.com/lxc/lxd$ file ./lxc/lxc ./lxd/lxd
./lxc/lxc: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=a317752267685a543f724c02c2fb827e03564236, not stripped
./lxd/lxd: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=8f4ff9b64ecda66a2269c18fd5c440620d548da3, not stripped

lxdはlxdのデーモンです。lxcはlxdに通信するクライアントプログラムです。go-lxc.v2 - gopkg.in/lxc/go-lxc.v2というLXCのGoバインディングライブラリを使用しています。

セットアップ

ビルド後以下の環境整備が必要です。

sudo mkdir -p /var/lib/lxd
sudo chown $USER:$USER /var/lib/lxd
echo "$USER:1000000:65536" | sudo tee -a /etc/subuid /etc/subgid

使い方

lxdの起動

./lxd/lxd &

lxcのコンテナ作成

./lxc/lxc create iamge:ubuntu foo

READMEでは image:ubuntu をつけていませんが、これだと以下の様なエラーになりました。

$ ./lxc/lxc create baz
error: Only the default ubuntu image is supported. Try `lxc create images:ubuntu foo`.

lxcのコンテナ起動

./lxc/lxc start foo

lxcのコンテナ一覧表示

$ ./lxc/lxc
foo

なお、通常のlxcとはコンテナの管理が別になっているのか(要確認)、 lxc-ls しても fooは表示されませんでした。

lxcのコンテナ停止

./lxc/lxc stop foo

lxcのコンテナ停止

./lxc/lxc delete foo

lxc shellが未実装!

コンテナでコマンドを実行してみたいところなのですが、 lxc shell というサブコマンドは未実装だそうです。

$ ./lxc/lxc help
Usage: lxc [subcommand] [options]
Available commands:
  config     - Manage configuration.
  create     - lxc create images:ubuntu <name>
  delete     - lxc delete <resource>
  finger     - Fingers the lxd instance to check if it is up and working.
  freeze     - Changes a containers state to freeze.
  help       - Presents details on how to use lxd.
  list       - Lists the available resources.
  remote     - Manage remote lxc servers.
  restart    - Changes a containers state to restart.
  shell      - Start a shell or specified command (NOT IMPLEMENTED) in a container.
  start      - Changes a containers state to start.
  stop       - Changes a containers state to stop.
  unfreeze   - Changes a containers state to unfreeze.
  version    - Prints the version number of lxd.

ソースを見ても lxd/shell.go at a315c07c632188f7d37fa8dbbe3f1b7d87ab34de · lxc/lxd のあたりにTODOと書かれています。

ただ、lxc/go-lxcのソースを見ると、コンテナ内でコマンドを実行するための関数はあるのですが、

https://github.com/lxc/go-lxc/blob/bc0a9447e0be56f8e35d0affe83a92e638308e2f/container.go#L422-L423

// Execute executes the given command in a temporary container.
func (c *Container) Execute(args ...string) ([]byte, error) {

コマンド実行後に標準出力の結果を戻り値で受け取るようになっています。

シェルを起動してインタラクティブに入出力するには、標準入力、標準出力、標準エラー出力をストリームのようにリアルタイムにやりとりするような関数が必要だと思います。

おわりに

早く lxc shell が実装されて欲しいですね!

2015-04-23 追記

LXD 0.7ではlxc execでシェルの対話操作もできるようになっていましたに書きましたが、 lxc exec コンテナ名 /bin/bash でシェルの対話操作もできるようになっていました。