はじめに
- 動かないコンテナが動くようにする為に調べた
- コンテナの IP が取得出来ていないことが原因だった
参考
- Subject: dhcp.leases file format? - msg#00051
- Hostname on DHCP - is there a definitive answer?
- How to get hostname from dhcp server
切り分け
コンテナの IP
アドレスに関与していそうなコンポーネント。
- lxc-awesome-ephemeral
- kitchen-lxc
- dnsmasq.lxcbr0.leases
lxc-awesome-ephemeral
lxc-awesome-ephemeral で IP アドレスを扱っていそうな部分は以下の部分。
get_ip() { (略) # Grab all the public globally routed IPv4 and IPv6 addresses (sudo ip netns exec $NAME ip -4 addr show scope global && \ sudo ip netns exec $NAME ip -6 addr show scope global) | grep inet | while read line; do ip=$(echo $line | awk '{print $2}' | cut -d '/' -f1) echo "$ip" done (略) }
尚、今回の環境では lxc-awesome-ephemeral
にて LXC コンテナの IP アドレスは取得されていないことは確認した。
kitchen-lxc
kitchen-lxc で IP アドレスを扱っていそうな部分は以下の部分かと思われる。
def container_ip(state) if config[:ipaddress] return config[:ipaddress] else 30.times do leases = ::File.readlines(dhcp_lease_file).map { |line| line.split(" ") } p leases leases.each do |lease| return lease[2] if lease.include?(state[:container_id]) end sleep 3 end end raise ActionFailed, "Could not determine IP address for LXC container '#{state[:container_id]}'" end
dhcp_lease_file
で定義されているのがデフォルトで /var/lib/misc/dnsmasq*leases
となっている。尚、検証した環境では以下のようなファイル名となっている。
dnsmasq.lxcbr0.leases
これは LXC コンテナがホストの DHCP サーバーである dnsmasq
から割り当てられた IP とホスト名が記録されるファイルとなっている。以下のような中身となっている。
1384078399 b2:6f:53:c4:9d:86 10.0.3.xxx default-wheezy-master-18c38f * 1384078331 be:76:51:8d:17:03 10.0.3.xxy default-wheezy-master-2de049 * 1384078312 ca:d6:f9:ac:79:68 10.0.3.xxz default-wheezy-master-d19105 *
フォーマットは下記の通り。
${タイムスタンプ} ${MAC アドレス} ${IP アドレス} ${ホスト名} ${Client-ID}
最終的な原因と解決策
原因
- DHCP クライアントからホスト名送信されておらず
dnsmasq.lxcbr0.leases
にホスト名が記録されていなかった
解決策
基本的には コンテナの dhcpclient.conf の設定に以下が必要。
send host-name = gethostname();
但し、Debian 6(squeeze)
の場合には isc-dhcp-client
のバージョンアップが必要(かもしれない)で、今回は sid
版のパッケージを使って試した。
Debian 6(squeeze) で isc-dhcp-client の sid 版を使う
echo "deb http://ftp.de.debian.org/debian sid main" >> /etc/apt/sources.list apt-get install libc6-dev apt-get install isc-dhcp-client