自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

CentOS7にインストールしたlxcなインスタンスがエラーを吐いて起動しないときの対処法

まずは新年のご挨拶から

気がつけば2017年が終わり、2018年がスタートしていますね。

旧年中は大変お世話になりました。本年もよろしくお願いいたします。

2018年が皆さまにとって幸多き1年となりますよう、心よりお祈り申し上げます。

チマチマと構築ちぅ

さて、私の「優先度:低」な業務(?)のひとつに、「社内Labのリニューアル」というお仕事があります。

昨年にIAサーバが導入されましたし、今までできなかったことをできるようにするため、業務の合間を縫ってチマチマ構築をしている今日この頃です。

本当はさっさと構築して社内に提供したいところではあったのですが……。思い通りに事が進まないのが人生というもの。

いろいろ優先度の高い and/or 急ぎで仕上げないといけない業務があったり、構築中にいろいろ問題が起こったり……と、まあなんともアレな状況だったりするわけで……。

まあ、いろいろ技術検証などで使ったりはしていたので、完全遊ばせていたわけではないのですが……。年も明けたことだし、もうそろそろいいかげんに本来の用途に使えるようにしないとねぇ……と。

そんなこんなで、重い腰を上げてトラブル対応に着手してみることにしたわけです。

問題その1:lxcのインスタンスが起動しない!

数あるトラブルのひとつに、「lxcのインスタンスが起動しねぇ!」というものがありました。

手順的には(環境の違いによる差異は別として)Raspberry Piの時と同じことをやれば良いはずなので、躓くとは思ってもいなかったのですが……。

ちなみに発生したエラーは下記のような感じです。あ、「instance」ってのがlxcのインスタンス名ですね。

# lxc-start -n instance
lxc-start: instance: lxccontainer.c: wait_on_daemonized_start: 760 Received container state "ABORTING" instead of "RUNNING"
lxc-start: instance: tools/lxc_start.c: main: 371 The container failed to start.
lxc-start: instance: tools/lxc_start.c: main: 373 To get more details, run the container in foreground mode.
lxc-start: instance: tools/lxc_start.c: main: 375 Additional information can be obtained by setting the --logfile and --logpriority options.

出力結果を見ると、「追加で情報欲しかったら、ログ吐き出してみ?」とあるのでやってみたところ、こんな感じの情報をゲット。

# lxc-start -n instance --logfile=./log.txt
(中略)
# cat ./log.txt
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_conf - conf.c:setup_caps:2364 - unknown capability mac_admin
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_conf - conf.c:lxc_setup:3273 - failed to drop capabilities
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_start - start.c:do_start:944 - Failed to setup container "instance".
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_sync - sync.c:__sync_wait:57 - An error occurred in another process (expected sequence number 5)
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_container - lxccontainer.c:wait_on_daemonized_start:760 - Received container state "ABORTING" instead of "RUNNING"
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_start - start.c:__lxc_start:1459 - Failed to spawn container "instance".
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_start_ui - tools/lxc_start.c:main:371 - The container failed to start.
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_start_ui - tools/lxc_start.c:main:373 - To get more details, run the container in foreground mode.
      lxc-start instance YYYYMMDDnnnnnn.nnn ERROR    lxc_start_ui - tools/lxc_start.c:main:375 - Additional information can be obtained by setting the --logfile and --logpriority options.

ほう……。なるほど!わからん!

ggrksの精神で

とりあえず、よく分からないのでGoogle先生のお力をお借りすることに。

エラーメッセージとして出力された、「lxc_conf – conf.c:setup_caps:2364 – unknown capability mac_admin」という文言をそのまま検索してみます。

そしたらですね……下記のようなサイトが見つかったんですよ……。

なんか同じような悩みを抱えていた人がいたみたいですね(‘-‘*)

この質問に対する回答によると、「libcap-devってパッケージをインストールして、lxcを再コンパイルしてみ?」とあります。

私が使っているのはubuntuではなくCentOS7ではありますが、なんとなく同じようなことをすれば解決しそうな気配ですね。

ってことで……

十分なヒントが得られたので、自分の環境をチェックしてみます。

まずは、「libcap-dev」っぽいパッケージがインストールされているかどうかをチェック。入っていなければ、先のサイトの回答が役に立つ確立がアップしますΣd(ゝ∀・)ネッ!!!

# rpm -qa|grep libcap
libcap-ng-0.7.5-4.el7.x86_64
libcap-2.22-9.el7.i686
libcap-ng-0.7.5-4.el7.i686
libcap-2.22-9.el7.x86_64

お!入っていませんね!

続いて、CentOS7における「libcap-dev」パッケージを探してみましょう。

ディストリビューションが違えば、パッケージ名が異なっているかもしれませんからΣd(ゝ∀・)ネッ!!!

# yum search libcap
(中略)
libcap-devel.i686 : Development files for libcap
libcap-devel.x86_64 : Development files for libcap
libcap-ng-devel.i686 : Header files for libcap-ng library
libcap-ng-devel.x86_64 : Header files for libcap-ng library
libcap-ng-python.x86_64 : Python bindings for libcap-ng library
compat-libcap1.i686 : Library for getting and setting POSIX.1e capabilities
compat-libcap1.x86_64 : Library for getting and setting POSIX.1e capabilities
libcap.i686 : Library for getting and setting POSIX.1e capabilities
libcap.x86_64 : Library for getting and setting POSIX.1e capabilities
libcap-ng.i686 : An alternate posix capabilities library
libcap-ng.x86_64 : An alternate posix capabilities library
libcap-ng-utils.x86_64 : Utilities for analyzing and setting file capabilities

なるほどなるほど、「libcap-devel」と「libcap-ng-devel」って感じの名前っぽいですね!1)なお、「ng」付きとそうじゃないヤツの違いまでは調べてません

ここまで来たら、そのパッケージをインストールして再コンパイルすればいけそうです!2)わざわざ書かなくても良いかなと思うので、このエントリでは手順を省略

コンパイルも無事終わり、ドキドキしながらlxcのインスタンスを起動してみると……。

(」・ω・)」無事に!(/・ω・)/起動できた!

lxcのインスタンスが起動せず、「lxc_conf – conf.c:setup_caps:2364 – unknown capability mac_admin」というエラーが出ていたら、
「kibcap-devel」系のパッケージをインストール!そして、lxcを再コンパイル!

このことを忘れずに、これから生きていこうと思います。

……あ、ちなみにですが、普通にディストリビューションのパッケージを導入していればこのエラーはおこらない3)パッケージの依存関係で必要なブツはインストールされるはずなのでと思います。

あくまでソースからインストールしたときの話ですので、誤解なきよう。

で、libcapってなに?

ところで、このlibcapってなんなんでせぅ?

最初はパケットキャプチャとかしたいときに使う「libpcap」かと思ったのですが、どうも別物らしいです。

ちょっと確証が持てるほど理解はできていないのですが、「Linuxのケーパビリティ」に関するアレコレをアレしているライブラリ……って感じっぽいですね。

lxcのログに出てきた「unknown capability mac_admin」に対応してそうなブツもmanページに書いてありますし……。

CAP_MAC_ADMIN (Linux 2.6.25 以降)
強制アクセス制御 (MAC) を上書きする。 Smack Linux Security Module (LSM) 用に実装されている。

まだ解決しなきゃいけない課題はいろいろあります

そんなこんなでひとつ壁は乗り越えましたが、実はまだ上手く動いていないところがいくつか……。

時間を見つけて解決していって、今月中とかには提供できるようにしたいなぁ……と思う今日この頃です。
_ノ乙(、ン、)_

注訳はこちら

注訳はこちら
1 なお、「ng」付きとそうじゃないヤツの違いまでは調べてません
2 わざわざ書かなくても良いかなと思うので、このエントリでは手順を省略
3 パッケージの依存関係で必要なブツはインストールされるはずなので
Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
Yuta Hayakawa

2016年6月入社。2020年12月より取締役に就任しました。

普段は東京本社で管理職のお仕事したり、広報的役割としてテキスト書いたり動画作ったりするのが最近のお仕事。

自称「社内システムチーム統括」として、社内システムチームの面々を見守りつつ毎日を過ごしています。

プライベート面では、音楽やコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

あと、我が子可愛い。

記事一覧