はじめに
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が出来ない場合があったり)、まだまだ(これからも?)マイナーであるということでしょうか。