tabimoba.net

とあるエンジニアの雑記帳

LXD上のCentOS7にhttpdをインストールするには(特権コンテナを利用する)

はじめに

LXD上のCentOS7環境(コンテナ)にhttpd(Apache)をyumでインストールしようとすると、次のようなエラーが出てインストールに失敗します。

Installing : httpd-2.4.6-40.el7.centos.x86_64                                                                                                                                                                          6/6
Error unpacking rpm package httpd-2.4.6-40.el7.centos.x86_64
error: unpacking of archive failed on file /usr/sbin/suexec: cpio: cap_set_file
error: httpd-2.4.6-40.el7.centos.x86_64: install failed

これは、非特権コンテナであるため発生しているエラーとなります。

LXDでコンテナを作成すると通常は非特権コンテナとなりますが、CentOS7のように非特権コンテナで正常に動作しない、パッケージのインストールに失敗する場合は、特権コンテナを作成することで解決出来る場合があります。

LXC上のCentOS7にhttpdをインストールするまでの手順

まず最初に、LXDをインストールします。

https://linuxcontainers.org/ja/lxd/getting-started-cli/ より引用

# add-apt-repository ppa:ubuntu-lxc/lxd-stable
# apt-get update
# apt-get dist-upgrade
# apt-get install lxd

次に、 http://images.linuxcontainers.org/images/centos/7/amd64/default/ より、最新のlxd.tar.xz ファイル(CentOS7イメージ)をダウンロードします。

lxd.tar.xzをダウンロード後、イメージをインポートします。

# lxc image import lxd.tar.xz --alias centos/7

インポート後、CentOS7コンテナを構築出来るようになります。

rootユーザーで次のコマンドを実行すると、特権コンテナのCentOS7を作成することができます。

# lxc launch centos/7 test01 -c security.privileged=true

コンテナ作成後、次のコマンドを実行して作成したコンテナのシェルに入ります。

# lxc exec test01 /bin/bash

コンテナのシェルに入れたことを確認したら、yumを実行します。

[root@test01 ~]# yum install -y httpd

エラーにならずにyumの実行完了後に

Installed:
  httpd.x86_64 0:2.4.6-40.el7.centos

と表示されれば、httpdが正常にインストールされています。

余談

LXDに関する情報は国内外まだまだ乏しいですね。今回の場合も、ググるとDockerに関するものばかりで困りました・・・(Dockerの場合はaufsのバグ?絡みで同様の問題が発生していたようですね)。

私の場合はDockerよりもLXDの方がしっくりくるというか、Immutable InfrastructureをしたいわけではなくこれまでKVMで構築していたVMのような使い方をしたいために、VMの代替(軽量なLinux仮想環境)としてLXDを使っています。DockerはImmutable Infrastructureのための道具としては良いのですが、initプロセスのような機能が無いので、VMの代替としては使いづらいんですよね。

LXDを使い始めたきっかけは、これまでFreeBSD jailを使っていたので、Linuxにおける同様の使い勝手のものを探していたらLXDがあったとそんな感じです。LXDは、FreeBSDのports installのコンパイルで待たされるようなものが無いので、とても気軽に使えて良いですね。(pkgngはまだ枯れていないのと提供されるパッケージがportsと比べて古かったりするので、やっぱりportsを使ってしまう・・・)

欠点としては、Ubuntuでしか使えないのと、若干動きが怪しいこと(コンテナのstopやrestartが出来ない場合があったり)、まだまだ(これからも?)マイナーであるということでしょうか。

参考