まずは新年のご挨拶から
気がつけば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) 用に実装されている。
まだ解決しなきゃいけない課題はいろいろあります
そんなこんなでひとつ壁は乗り越えましたが、実はまだ上手く動いていないところがいくつか……。
時間を見つけて解決していって、今月中とかには提供できるようにしたいなぁ……と思う今日この頃です。
_ノ乙(、ン、)_