Ubuntu Weekly Recipe

第491回 いまから「あえて」systemdのコンテナ機能を使ってみる

この記事を読むのに必要な時間:およそ 4 分

巷ではコンテナが大人気です。一方で,アプリケーションコンテナであるDockerとDockerコンテナをオーケストレーションするKubernetes。もう一方で,システムコンテナであるLXCとそれを便利に使うためのLXD

本連載でもこれらの技術のいくつかは何度か取り上げられています。

ところで,Ubuntuではバージョン15.04よりinitとしてsystemdが採用されていますが,実は,このsystemdにもコンテナを動かす機能があります。

そこで今回は,上に挙げたような「有名ドコロ」のコンテナ技術がアツい中,あえてsystemd-nspawnというコマンドを使い,systemdに備わっているコンテナ機能をとりあえず簡単に使う方法を紹介します。

強化版chroot

UNIX オペレーティングシステムには本来のルートディレクトリと論理的に分離し,ユーザーやプロセスにあたかもルートディレクトリの中にいるかのように見せかける,chrootというコマンドがあります。

chrootのよくある利用方法としては次のようなものがあります。

  • システムで動作しているサービスを隔離し,万が一,これが侵入者に乗っ取られた場合でも,システム全体が脅威に晒されることを防ぐ
  • FTPサーバーなどのリモートユーザーがアクセスできる領域を制限する
  • Linuxディストリビューションのインストールで利用する ※1
※1
具体例にはGentooArch Linuxが挙げられます。

chrootの歴史は古いですが,中に何かを閉じ込めて安全に利用するという点では,ある意味,コンテナであると言えます。

今回紹介するsystemd-nspawnはこのchrootの強化版です※2)⁠

※2
systemd-nspawnのmanページでは"more powerful"と書かれています。

systemdのコンテナ機能はLinuxカーネルの機能である名前空間を主に利用しています。この機能を使えば,例えば「この名前空間ではPIDが1のプロセスはA。また別の名前空間では別のB」と名前空間同士を隔離させることができます。また,隔離の対象とできる名前空間には複数あります※3)⁠

※3
詳細は連載「LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術」第2回をご覧ください。

systemd-nspawnは複数の種類がある名前空間をまとめて取り扱い,適切に隔離し,コンテナを利用するためのコマンドと考えるよいでしょう(nspawnは"Namespace Spawn"を意味していると考えるのが妥当でしょう)⁠ つまり,コンテナを起動させるシステム(以下,ホスト)の名前空間とは別にコンテナ用の名前空間を立ち上げ,コンテナの中をホストから厳格に隔離します。

そのため,systemd-nspawnchrootと異なり,OSのブート(といってもinit起動以降の部分)が可能になっています。

Ubuntuのコンテナをとりあえず立ち上げてみる

systemd-nspawnはデフォルトではインストールされていないため,systemd-containerパッケージが必要です。

また,起動させたいディストリビューションの入ったルートファイルシステムを作る必要があります。 Ubuntuのルートファイルシステムを作成するには,debootstrapパッケージも必要となります。

host$ sudo apt install -y systemd-container debootstrap

任意のディレクトリにdebootstrapコマンドを使い,Ubuntuのルートファイルシステムを作成します。ここでは現在開発中の17.10(開発コード:artful)のルートファイルシステムを,ホームディレクトリにartfulという名前で作成します。

host$ sudo debootstrap artful ~/artful

コマンドを実行すると,パッケージのダウンロードと展開が始まります。

I: Retrieving InRelease 
I: Checking Release signature
I: Valid Release signature (key id 790BC7277767219C42C86F933B4FE6ACC0B21F32)
I: Retrieving Packages 
I: Validating Packages 
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
(中略)
I: Base system installed successfully.

このままでは,コンテナにログインできるユーザーが存在しません。そのため,一度,ブートなしでコンテナに入ります。 エラーのようなメッセージが表示されますが,特に問題はありません。

host$ sudo systemd-nspawn -D ~/artful
Spawning container artful on /home/popo/artful.
Press ^] three times within 1s to kill container.
host's /etc/localtime is not a symlink, not updating container timezone.
-bash: cannot set terminal process group (-1): Inappropriate ioctl for device
-bash: no job control in this shell
mesg: ttyname failed: No such device

コンテナ起動時のメッセージにもありますが,何か不都合が生じた場合はCtrlを押しながら]を3回,1秒以内に連打すると,コンテナを強制終了できます。

続いて,管理者用のユーザーを作成し,パスワードを設定します※4)⁠

※4
このままrootユーザーにパスワードを設定して有効にしてしまうのもありです。
artful# useradd admin -G sudo -m # 管理者ユーザーの作成
artful# passwd admin             # パスワードの設定
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

コンテナから抜けます。ブートなしの場合は以下で抜けることができます。

artful# exit
logout
Container artful exited successfully.

続いて,-bオプションを付けてコマンドを実行し,コンテナを「起動(ブート)⁠させます。

host$ sudo systemd-nspawn -b -D ~/artful

様々なサービスがコンテナ内のsystemdにより起動させられ,ログインの待受け画面になります。

Ubuntu Artful Aardvark (development branch) ubuntu console

ubuntu login:

先ほど作成したユーザーでログインしましょう。ログインできない場合はユーザー・パスワード設定が間違っているかもしれません。 その場合には先述したように,Ctrlを押しながら]を1秒以内に3連打してコンテナを強制終了し,手順をやり直してください。

著者プロフィール

たなかあきら

Ubuntu Japanese Team Member。ちょっとお高い電子辞書を買ったので,楽しく翻訳をしていたところ,気づいたらメンバーになっていました。

コメント

コメントの記入