日本ソフトウェア科学会第 34 回大会 (2017 年度) 講演論文集

異種 OS 上のコンテナ型仮想化環境間でのライブマイグレーション実現方式の検討
高川 雄平

松原 克弥

オペレーティングシステム (OS) が提供する計算資源や名前空間をアプリケーション毎に多重化して隔離することで，ひとつの OS 上に独立した複数の実行環境を実現するコンテナ型仮想化が注目されている．一方，ハードウェア資源を仮想化する従来方式と比較して，コンテナ型仮想化の実現方式は OS への依存度が高く，異なる OS 上で実現されたコンテナ環境間では互換性がない．本稿では，仮想化技術のキラーアプリケーションであるクラウドコンピューティング環境において，負荷分散や可用性実現の要として広く利用されているライブマイグレーション技術に着目して，動作中のコンテナ実行環境を異なる種類の OS が動作する別の計算機へ動的に移動して実行の継続を可能にする方式を検討する．OS 毎のシステムコールや ABI の変換，プロセス実行状態の取得と復元方式の統一化，資源隔離機能の対応づけにより，Linux と FreeBSD を対象とした異種 OS 間のライブマイグレーション実現方式を提案する．

The container-based virtualization, that multiplexes and isolates computing resource and name space which
operating system (OS) provides for each application, has been recently attracted. As compared with theconventional hardware virtualization, containers run on diﬀerent OSs may not be compatible because theircontainer implementations must depend on each underlying OS. In this paper, we focus on the live migration since it is one of the most important technology for realizing load balancing and availability in cloudcomputing, that is a major application of the virtualization. For Linux and FreeBSD as the 1st target, we
describe that how system calls and ABI can be converted, how running containers can be captured withan uniform representation and they restore in both OSs, and how an uniformed resource isolation can berealized.

1 はじめに
1. 1 背景クラウドコンピューティングを支える基盤技術として，仮想化技術がある．特に，近年，アプリケーション毎の実行環境の軽量なコンパートメント化を目的として，コンテナ型仮想化が注目されている．コンテナ型仮想化は，OS が提供する資源を分離・制限し，他の OS を起動させずに異なる環境を構築できる軽量な

図1

ハードウェア仮想化とコンテナ型仮想化仮想化を実現する．一方，ハードウェア仮想化では，VM と呼ばれる仮想化したハードウェアをハイパー必要があり，コンテナ型仮想化と比較するとオーバーバイザが作成・管理し，VM の上で OS を起動させるヘッドが大きい (図 1 参照)．

A Study on Implementing Container Live Migration
among Heterogeneous OS Platforms
Yuhei Takagawa, Katsuya Matsubara, 公立はこだて未
来大学 システム情報科学部, School of Systems Information Science, Future University Hakodate.

また，クラウドコンピューティング実働環境では，負荷分散と可用性を実現するためにライブマイグレーションが活用されている．ライブマイグレーション
は，実行中のサービスを動的に別のマシンに移行す図2

本提案システムの概要

る技術である．コンテナ型仮想化におけるライブマ• OS が混在するシステムにおいて全ての計算資イグレーションも実現されており，Linux では CRIU源を十分に活用する負荷分散の実現[1] [2]，FreeBSD では FreeBSD VPS(Virtual Private

異種 OS が利用している計算資源も活用することSystem) [6] が実装として存在する．OS への依存度ができるため，OS 毎の資源だけではなく，シスが大きいコンテナ型仮想化では，OS 上の計算資源やテム全体の資源を有効活用できる．

API，コンテナ実現方式が異なるため，異なる OS 環

• メンテナンス時の可用性の向上

境間でコンテナをマイグレーションすることができある OS を同時にメンテナンスをしなければならない．

ない場合に，異種 OS にサービスを移行することができるため，サービスを停止せずにメンテナン

1. 2 提案システム

スが可能である．

本稿では，異種 OS 間でのコンテナ型仮想化におけ以降，第 2 章では，コンテナ型仮想化とライブマイるライブマイグレーションの実現方式を検討する．本

グレーションに関する既存技術を述べる．第 3 章で，検討では，まず Linux と FreeBSD を対象とすること異種 OS 間でのコンテナ・ライブマイグレーションをで，技術的課題の洗い出しと実現方式の有効性を確か実現するための技術的課題を示し，その解決法につめる．図 2 は Linux と FreeBSD 間におけるコンテナいて論じる．第 4 章では，実装状況について述べる．

型仮想化のライブマイグレーションの概要図である．

最後に，5 章でまとめと今後の課題について述べる．

チェックポイントとはコンテナの状態をファイルに保存することで，レストアでは保存したファイルからコ2 コンテナ型仮想化ンテナを復元する．本提案では，コンテナの実行状態

コンテナ型仮想化は，ハードウェア仮想化とは異なや環境に関する情報を統一形式に変換してチェックポり，計算資源や名前空間を分離することでアプリケーイントでファイルに保存し，レストアでファイルからションごとに異なる環境を構築できる仮想化である．

取得した情報を OS に適した形式に変換してコンテナコンテナは分離されたアプリケーション実行環境のこの実行状態や環境を復元する．とである．コンテナの実現には，Linux では cgroups

本提案の異種 OS 間のライブマイグレーションを実現することにより，以下に述べるような効果が期待できる．

や Namespace，FreeBSD では Jail という機能が利用されている [3] [7]．

cgroups は Linux のプロセスに対して使用する資源の制限を設けることができる機能である．例えば，

CPU 利用時間 (CPU 使用率) やメモリ利用量などをで Linux 上で動作する．CRIU の機能は主にプロセ制限することができる．Namespace は Linux のプロスのチェックポイントを作成することとプロセスのレセス ID やディレクトリ，ネットワークなどを制御すストアを行うことである．ライブマイグレーションをるための名前空間を分離できる機能である．

行うマシンには同じコンテナが存在することが重要

Jail は Namespace にあたる機能で FreeBSD のディレクトリやネットワークなどを制御するための名である．また，OS の再起動やカーネルの再ビルドを必要としない．

前空間を分離する機能である．分離した空間は他の空

CRIU の内部処理を簡単に説明する．プレダンプと間のプロセス ID やディレクトリには直接関係しない

チェックポイントは，ptrace() や procfs から H/W 資

ため，同じプロセス ID を分離した空間ごとに利用す源の情報を収集し，Google Protocol Buﬀers [4] の形ることができる．

式でファイルに書き込みを行う．レストアは，ファイルから Google Protocol Buﬀers を読み取り ptrace()

2. 1 コンテナ・ライブマイグレーションを用いて H/W 資源の状態を復元している．Google

ライブマイグレーションは，仮想化環境上で動作しProtocol Buﬀers は異なるプログラム言語でもデータているプロセスを停止させずに仮想化環境ごと別のの受け渡しが簡単にできるようにしたデータ形式であマシンに移動する技術で，負荷分散や可用性を目的

る．H/W 資源以外にディレクトリやプロセスツリーに行われる．CPU やメモリなどのハードウェア資源といったディレクトリ構成やプロセスの親子関係など(以下，H/W 資源) の状態をファイルに保存し転送，の情報も対象となっている．

転送されたファイルから H/W 資源の状態を復元することでライブマイグレーションは行われている [8]．

2. 3 FreeBSD VPS

れ，H/W 資源の変更が一定以下になるまで実行されFreeBSD VPS(Virtual Private System) は ，FreeBSD jail†3 のライブマイグレーションを可能にしる（プレダンプ，Pre-dump）．

たシステムであり，FreeBSD 上で動作する．FreeBSD

H/W 資源の状態保存とファイルの転送は動的に行わコンテナ型仮想化環境のライブマイグレーションで

VPS は VPS インスタンスというコンテナを作成する．

は H/W 資源の状態を全て保存されたファイルと保存

Jail をそのままライブマイグレーションしても，プロするための処理を「チェックポイント」と呼び，H/W

セス ID が重複して正常に動作しないため，FreeBSD資源の状態を復元することを「レストア」と呼ぶ．

VPS ではプロセステーブルを VPS インスタンスごとサービスを全く停止させないことはできず，チェックに作成することで重複を回避している．CRIU はプロポイントの転送中は停止することになる．停止時間はセスをライブマイグレーションしているが，FreeBSDサービスに影響を与えない範囲にしなければならな

VPS はプロセスではなく VPS インスタンスごとラい．コンテナ・ライブマイグレーションを行うには，イブマイグレーションしている．

コンテナ内で動作しているプロセスのマイグレーショ

FreeBSD VPS におけるチェックポイントとレストンとコンテナの隔離・分離状態のマイグレーションがアの内部処理を簡単に説明する．チェックポイントは，必要である．また，Linux でライブマイグレーション

VPS インスタンスに利用しているディレクトリの同を実現できる CRIU，FreeBSD でライブマイグレー期を 2 回行い，1 回目と 2 回目の間でプロセスを停止ションを実現した FreeBSD VPS が存在する．

させ，H/W 資源のチェックポイントを作成する． レストアは，メモリを復元した際に取得できる PCB†4

2. 2 CRIU

を利用し，実行可能プロセスとして OS に処理の続きCRIU(Checkpoint/Restore in Userspace) は ，を行わせている．PCB はカーネル空間の情報である

OpenVZ や LXC，Docker コンテナのライブマイグレーションを可能にするオープンソースソフトウェア†3 FreeBSD 上で作成できるコンテナ†4 Process Control Block，プロセス制御ブロック

ため，CRIU とは異なりカーネル空間に対する処理が発生する．

表1x86 における Linux と FreeBSD のシステムコール引数の渡し方

引数Linux

第 1 引数EBX

異種 OS 間でのコンテナ・コンテナマイグレーショ

第 2 引数

ECXンを行うためには，OS による差異を吸収しなければ第 3 引数

EDXならない．本章では，異種 OS 間でのコンテナ・ライ

第 4 引数ESI

ブマイグレーションを実現するにあたっての課題と第 5 引数EDI解決手法を述べる．また，本検討の対象 OS は Linux

第 6 引数×3 異種 OS 間でのコンテナ・ライブマイグ
レーション実現方式

FreeBSD

スタックと FreeBSD とする．

3. 1. 3 プロセス実行状態の取得と復元
3. 1 技術的課題

本提案ではライブマイグレーションの共通フレー

3. 1. 1 システムコールの差異

ムを CRIU とする．CRIU は ptrace() や procfs を用Linux と FreeBSD とで大半の共通なシステムコーいることで，プロセス実行状態の取得と復元を行ってルは同じ処理で動作する．しかし，FreeBSD バイナリいる．FreeBSD に ptrace() や procfs は存在するが，は Linux では動作せず，Linux バイナリも FreeBSD

Linux よりも取得できる情報が少なく，マウント情報

では通常は動作しない．以下が 2 点が原因である．

やネットワーク情報などを procfs から取得できない．

• システムコールの番号が異なる

加えて，取得できるメモリやレジスタの情報が OS で

• システムコールの引数・パラメータの値が異なる

異なるため，レジスタやユーザ空間の状態をそのままシステムコールの open() を例にあげる．パラメータ復元したとしてもプロセスは正しく動作しない．

としてパスに指定されたファイルを開く際のオプショ

3. 1. 4 プロセス実行環境の隔離ンを引数に渡す．open() のオプションの O CREAT

第 3. 1. 3 章のプロセス実行状態の取得・復元によは FreeBSD では値が 0x0200 と定義されているが，りプロセス・ライブマイグレーションを可能にしたとLinux では値は 0x0040 と定義されている．そのため，しても，コンテナ・ライブマイグレーションにはなら異なる OS のプロセスを復元したとしてもパラメータない．プロセスのライブマイグレーションに加え，プの影響で正しく動作しない．なお，open() のシステロセスを隔離している状態を復元することで，コンムコール番号は共通である．

テナ・ライブマイグレーションが可能になる．Linux3. 1. 2 ABI の差異と FreeBSD では，資源を隔離するために使っていABI(Application Binary Interface) とは，システる機能が異なる．Linux は cgroups と Namespace，ムコールやプログラムの「呼び出し方」のことで，FreeBSD は Jail を用いている．隔離・制限する資源

FreeBSD と Linux では ABI が異なる．FreeBSD/x86の対象や名称，値が異なるため，プロセス実行環境のはシステムコールの引数をスタック経由で渡すのに対隔離を復元することはできない．

して，Linux/x86 はシステムコールの引数をレジスタ経由で渡す (表 1 参照) [9]．Linux/x86 では，シス

3. 2 実現手法

テムコールの引数の上限が 5 つにが決まっており，そ3. 2. 1 システムコールの変換れ以上は利用できない．関数の引数はスタック経由でシステムコールテーブルの順番やシステムコールのあるため，6 つ以上の引数を持つことができる．その引数のパラメータを変換することで，OS が異なってもため，同じプログラムが動作していても，FreeBSDシステムコールを動作させることができる．FreeBSDと Linux ではメモリやレジスタの状態が異なる．

に関しては，Linux エミュレータ [5] というカーネル

機能があり，システムコールテーブルとシステムコーで再現する．

ルの引数のパラメータを実際に変換し，FreeBSD でLinux バイナリが実行できる．本提案では，システ

4 実装状況

ムコールに関する変換には Linux エミュレータを用

まず，FreeBSD で CRIU 形式のライブマイグレーシいる．

3. 2. 2 ABI の変換
カーネル機能として FreeBSD で Linux バイナリを実行する際は引数をレジスタに入れ，Linux でョンを可能にする必要がある．FreeBSD 上で ptrace()を用いてシステムコール実行前後のレジスタ情報を取得し，procfs の mem からプロセスのユーザ空間のメモリを取得可能にした段階である．

FreeBSD バイナリを実行する際は引数をスタックに今後は取得したレジスタ状態とメモリ状態を復元入れるというような実装を行うと，異なる OS でもレし，プロセスを計算途中から実行できるようにする必

ジスタやユーザ空間の状態を同じにすることができる．

要がある．また，メモリやレジスタの情報以外にも，

これは上記した FreeBSD の Linux エミュレータ機能

プロセスに関するパイプ情報やファイルディスクリプが実現している．Linux バイナリであれば，Linux とタなど様々な情報がなければ，実践的な利用ができな

FreeBSD で実行ファイルを一切変更せずに動作させいため，その実装も行う必要がある．

ることができる．本提案では，ABI の変換は Linuxエミュレータを用いることで実現する．

3. 2. 3 プロセス実行状態の取得と復元

5 おわりに
5. 1 まとめFreeBSD でプロセス実行に最低限必要なレジスタ

本稿では，異種 OS 上のコンテナ型仮想化環境間とメモリの情報は ptrace() の GETREGS や procfsでのライブマイグレーションの実現方式の提案を行っから取得する．取得できるメモリやレジスタの情報がた．対象 OS を Linux と FreeBSD とし，ライブマイ異なる点は，Linux エミュレータであれば，Linux でグレーションの共通フォーマットを CRIU として，異取得できる情報と同様になるため，Linux エミュレー

種 OS 間でのプロセスとコンテナのマイグレーションタを用いて解決する．

方式の検討を行った．プロセスのライブマイグレー

プロセスの状態保存を 1 つの OS に統一することションにおける OS 毎のシステムコールや ABI の違で，管理や運用時のオーバーヘッドを削減すること

いは，FreeBSD の Linux エミュレータを用いることができる．本提案では統一形式を Linux とし，Linuxで解決する．コンテナのマイグレーションにおけるコエミュレータを用いて FreeBSD プロセスの状態をンテナ作成機能の違いは各 OS にある機能でコンテナLinux プロセスの状態に変換することで統一する．の制限・分離を再現することで解決する．提案するシ

また，プロセスの復元は ptrace() の SETREGS やステムがもたらす効果はサーバ運用に関することがprocfs を用いることで行う．取得時と同様に，Linux多く，OS が混在するシステムでも計算資源の活用やエミュレータを用いることで情報の変換を行う．

可用性の向上を見込める．

3. 2. 4 プロセス実行環境の隔離
FreeBSD の Jail と Linux の cgroups，Namespace

5. 2 今後の課題の機能の対応づけや数値の変換を行い，それぞれの今後，FreeBSD 上でプロセスの情報を取得する方機能で隔離している状態を再現できれば解決できる．

式の検討，および，CRIU 形式でプロセスをライブマ

資源の隔離に関しては，FreeBSD の Jail と Linux のイグレーションする機能を実装する必要がある．加Namespace の隔離状態の対応づけと相互変換を行う

えて，Linux と FreeBSD におけるコンテナ機能の差ことで再現する．資源の制限に関しては，FreeBSD異の調査と対応づけ，ネットワークの移行方法を検討

jail に対して資源の制限をつける RCTL と Linux のする．また，実働環境への対応のため，Linux エミュcgroup の制限状態の対応づけと相互変換を行うこと

レータを利用しない場合や Linux エミュレータで不足しているシステムコールへの対処の検討，Windowsなどの他の OS とのライブマイグレーションの実現方式の検討がある．

参 考 文 献[1] A. Mirkin, A. Kuznetsov and K. Kolyshkin: Containers checkpointing and live migration, In Proceedings of the 2008 Ottawa Linux Symposium,
Vol. 2, 2008, pp. 85–90.
[2] CRIU Project: CRIU Main page, https://criu.
org/, 2010 (accessed August 14, 2017).
[3] Docker Inc.: Docker overview, https://docs.
docker.com/engine/docker-overview/, 2017 (accessed August 16, 2017).
[4] Google Inc.: Protocol Buﬀers, https://developers.

google.com/protocol-buffers/, 2017 (accessedAugust 16, 2017).
[5] Jim Mock: Chapter 10. Linux Binary Compatibility, https://www.freebsd.org/doc/handbook/linuxemu.html, 1999 (accessed August 16, 2017).
[6] Klaus P. Ohrhallinger: Virtual Private System for
FreeBSD, http://www.7he.at/freebsd/vps/, 2010
(accessed August 14, 2017). EuroBSDCon 2010.
[7] LiWenHsu: Docker on FreeBSD, https://wiki.
freebsd.org/Docker, 2017 (accessed August 16,2017).
[8] Yamada, H.: Survey on Mechanisms for Live Virtual Machine Migration and its Improvements, Information and Media Technologies, Vol. 11(2016),
pp. 101–115.
[9] 坂井弘亮: ハロー Hello,World” : OS と標準ライ
ブラリのシゴトとしくみ : たった 7 行の C プログラムから解き明かす, 秀和システム, September, 2015.