オープンソースプロジェクトにコミットする方法のひとつに、ドキュメントの翻訳が挙げられます。今回の「Ask the Expert」では、KubernetesやDockerが登場する前から軽量なコンテナ環境構築ツールとして活用されてきたLXC/LXDについて、ドキュメントの日本語翻訳の分野で長年貢献されてきたTenForwardさん(加藤泰文氏)にお話をうかがいました。
今回話を伺ったエキスパート
フォローしよう!
7月29日付けのtenforwardさんのツイートで、tenforward さんがLXDにコミットされているのを知りました。LXDとは簡潔に言うとどのようなものでしょうか?
LXDはシステムコンテナと仮想マシンの両方を同じ操作感で扱える管理ソフトウェアです。システムコンテナというのは、Dockerなどのように基本的にコンテナ内でひとつのアプリケーションのみが動くコンテナと違って、仮想マシンのようにOSがシステムとして動作するコンテナです。
LXDの概要、システムコンテナとアプリケーションコンテナの差異については、LXDの公式ページにも解説されています。現在ではマルチテナントのかなり大規模なIaaS環境を構築できるソフトウェアになっています。
tenforward さんはgihyo.jpで「LXCで学ぶコンテナ入門」という連載もされています。LXCとLXDはどのような関係でしょうか?
LXC/LXDともにlinuxcontainers.orgで開発されている、コンテナが扱えるソフトウェアです。
LXCはLinuxカーネルに実装されているコンテナ関連の機能をユーザースペースから扱えるように実装されたライブラリliblxcと、そのライブラリを使うコマンド群、コンテナを作るためのテンプレートがセットになっており、C言語で書かれています。また、さまざまなプログラミング言語からliblxcが使えるように、言語バインディングが提供されています。
今となってはご存知の方も少ないかもしれませんが、初期のDockerはコンテナを作成する部分はLXCを使っていたんですよ。当時のLXCはliblxcといったライブラリもないかなり雑然とした構造だったので、Dockerも裏側で直接LXCのコマンドを実行していました。
LXDはGoで書かれていますが、LXCをGoで書き直したわけではなく、liblxcのGoバインディングであるgo-lxcを使ってコンテナ関連の操作を行っています。liblxcとLXCに付属するコマンド群はホスト上のコンテナを扱うだけですが、LXDはサーバとして起動し、リモートからの操作ができますし、複数のLXDサーバをまとめてクラスタとして扱うこともできます。LXDはリモートとローカルからアクセスするためのREST APIを実装しているので、LXDに含まれるコマンドラインツールだけでなく、さまざまなサードパーティのツールを使ってコンテナや仮想マシンを操作できます。
また、LXDは3.0から仮想マシンもサポートするようになりました。仮想マシンとしてはQEMUを使っています。現時点(LXD 5.4)では、かなりの操作がコンテナでも仮想マシンでも同様に使えるようになっています。
LXDに関しては、私の連載ではないのですが、私の連載と同じくgihyo.jp上の連載「Ubuntu Weekly Recipe」で良く取り上げられています。
7/26のツイートはLXD 5.4のリリースアナウンスでした。どのような経緯でLXC/LXDにコミットされるようになったのでしょうか?
LXCにパッチを送ってマージしてもらうようになった経緯を連載記事に書いたのでそちらをご覧いただくとして、そもそもLXCを使うようになったきっかけを少しお話ししてみます。
私は以前レンタルサーバやVPSの開発を行っていました。そこではひとつの物理サーバ上に多数のテナントが同居するので、コンテナのような機能が必要になります。
多数のテナントが同居するような環境で、特定のテナントだけがリソースを使い尽くしてしまわないように、リソースを制限する方法がないかということを調べているときにcgroupという機能を知り、cgroupを調べる過程でLXCを知ることになりました。この辺りをいろいろと試しているうちにおもしろくなり、仕事とは関係なくLinuxのコンテナ機能やLXCを調べるようになりました。
最初にLXCに私が送ったパッチが取り込まれたのは、連載記事にもあるようにLXCの日本語manページなのですが、実はそれ以前にコミットログに名前が載ったことがありました。OSSのコミットログに名前が載るなんて経験はなかったので嬉しかったのを覚えています。これは単にLXCを使っていてうまく動かなかったので、メーリングリストに投稿したところ、バグだったらしく、オリジナルの作者が修正をコミットする際に報告者として私の名前を入れてくれたということでした。
その後は連載記事に書いたように、英語が苦手な自分用にmanページを翻訳し、それを公開してLXCのメーリングリストで紹介したところ、メンテナの方から「パッチ送れる?マージするよ」と言ってもらい、がんばってパッチを作って取り込んでもらったのが最初の貢献です。
当時のLXCの開発はけっこう牧歌的で、連載記事を書くために機能を調べているときに見つけた不具合をメーリングリストで報告すると、メンテナの方から軽いノリで「パッチ送れる?」と返事が返ってくることが多かったので、そう言われるとちょっと頑張ってみるかな?と思ってパッチを送ったり、機能追加のパッチを送ったりしました。この辺りも連載記事に書いています。
その他、今となってはかなりマイナーな存在かもしれませんが、私は国産Linuxディストリビューションである「Plamo Linux」のメンテナもやっているので、Plamoコンテナを作るためのテンプレートをLXCに入れてもらったりもしています。その経緯があって、公式でビルドされるイメージで、Ubuntuの次に公開されたコンテナイメージがPlamoのイメージでした。「世界中で何人が使ってるの?」と言われそうなイメージが公式から公開されて、今でも毎日ビルドされているといういうのもOSSの醍醐味ですね。
LXDについては、私はGoを書けませんのでこれまでもコード面の貢献はゼロです。ただ、コードを読んで何をやってるのかはわかるのでバグの指摘なんかは行ったことはありますが。
今では、LXCもLXDもCanonicalのエンジニアを中心としたプロフェッショナルなエンジニアがコードを書いてコミットしていますので、私のような素人プログラマの出番はない時代になった気がしていて、もっぱら次のような翻訳関係の貢献のみを行っています。
- LXCのmanページ
- linuxcontainers.orgの日本語ページ
- LXDのcliツールである"lxc"コマンドの日本語カタログ
これ以外にLXDのドキュメントがあります。これは初期は私も翻訳していましたが、最近は@hnakamur2さんが翻訳をしてくださったのをレビューする役目に徹しています。逆に私の上記の翻訳を@hnakamur2さんにレビューしてもらっています。2人でlxc-jpプロジェクトとして活動しています。
LXC/LXDについて、現状の課題があれば教えてください。また、今後の展望や進化の方向性ついてコメントがあればぜひ。
前述のように私はいちコントリビュータですし、最近は翻訳の貢献しかやっていませんし、また、最近は開発の状況を細かく追えてないので、現状の課題や今後の動きについてははっきりとはわかりません。
LXCは、もともとカーネルに実装されたコンテナ関連の機能を試す環境がなかったことから、カーネルエンジニアがコンテナを試せるように、カーネルの機能を試せるツールとして開発が始まったという経緯があります。この動きは今でも変わっていません。カーネルのコンテナ関連のエンジニアとLXC/LXDのエンジニアが被っているということもあり、世の中でコンテナに対して必要とされる機能が要求され、それがカーネルに実装されたときには真っ先にその機能がLXCに実装されるという流れがあります。
最近ではカーネルでも大きなコンテナ関係の新機能の開発も落ち着いた感はあるので、あまりLXCに新機能が実装されることも少なくなりましたが、今後もカーネルにコンテナの新機能が入ったときには真っ先にそのリファレンス実装としてLXCへの実装が行われると思います。カーネルに実装した際のテストも行わなければならないので、カーネルへの実装が済み、リリースされる前にLXCに先に機能が入っていたりもします。
LXDはコンテナと仮想マシン両方を扱ってIaaS環境を構築するためのソフトウェアで、大規模なマルチテナント環境で必要とされる機能の実装やチューニングがされていくのだと思います。また、仮想マシンとコンテナで完全に同じ機能かというと、まだ仮想マシンには足りない機能があるようなので、そこがコンテナと同等になるように開発が進んでいくと思います。
また、ここしばらくは「今後の新機能に必要な機能」の実装が行われているようで、そのひとつがLXD 5.4の仮想マシン内からLXDデーモンに通信が行える機能のようです。仮想マシンからVMに通信を行うことで何をしようとしているのか、開発の動向をちゃんと追っていないのでわかりません。しかし、公式のフォーラムをみる限りでは、インスタンスが利用可能になったかどうかの状態を確認できるようになるようなので、このための機能かもしれません。ほかにはS3互換のオブジェクトストレージの機能が実装されるようです。
TenForwardさんがgihyo.jpで連載中の記事リストはこちら!