2011-12-18

RHEL6: NIC UUID

最近になってようやく RHEL6 を触り始めた。

色々と言いたいことはあるが、まず速攻で不満なのは、NIC とデバイス(例: eth0)の割り当てを /etc/udev/rules.d/70-persistent-net.rules で管理するようになったこと。これにより MAC アドレスとデバイスの結びつきが 必須 になった。いや、これマジ勘弁。

オンボード NIC しか使わないならば、この制約は百害あっても一利なしだ。いったい、「客先でマザーボード交換したらサーバーが使えなくなったんだけど」とかいう電話を誰が受けると思ってるのか。現地 SE のスキルを 甘く見るなよ

まあそれは置いておいて、そういうときのリカバリ方法は分かったが、ひとつ気になるものが残る。

/etc/sysconfig/network-scripts/ifcfg-* 中の「UUID」って何だ?

いや、もちろん UUID は知っている。しかし UUID を書き換えずとも、MAC アドレスさえ書き換えれば NIC は交換できる。じゃあ UUID で何を縛っているのか。一緒に UUID も書き換えるべきなのか。こんな素朴な疑問に Google 先生は答えてくれなかった。しかし、色々見ているうちに、あることに気が付いた。

この UUID ってどれも同じじゃね?

そう、どれも同じに見える。あの人の UUID も、この人の UUID も、僕の UUID も!

ということで、どうやらデバイスにより UUID は固定らしい。差し当たり Google 先生からはこんなん出ました。

  • [eth0] 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
  • [eth0:1] 7758ac79-c4a2-dd87-1760-71284a316d00
  • [eth1] 9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
  • [eth2] 3a73717e-65ab-93e8-b518-24f5af32dc0d

ていうか、デバイスによって UUID が一意に決まるなら、やっぱり UUID って要らなくね?


2012-07-29 追記

と思ったら!

RHEL6.3 から、インストールする度に UUID が変わる ようになってしまった。なので最早、このエントリは嘘です。文句は Red Hat に言ってくれ。

system-config-network でネットワークデバイスを設定しても UUID は増えないので、恐らく UUID を埋め込むのは NetworkManager の仕業。で NetworkManager のソースコードを見た感じ、UUID の生成を行っているのは GObject というライブラリ。その実装は GLib に有る。GLib のコードなんか追っかける気にならんので、これ以上は調べる気なし。:-p

そもそも NetworkManager なんか使わない(サーバーにインストールする意味がない)し、私の場合 OS インストール直後に NetworkManager 絡みの項目は(UUID を含め) ifcfg-* から速攻で消すしね。この件にはなるべく関わらないのが吉とみた。


2014-06-19 追記

その後に色々と分かったけど、面倒いので更新サボってました。:-p

/etc/sysconfig/network-scripts 下を grep すれば、UUID を取得するらしき関数は直ぐに見つかる。

RHEL6.5: /etc/sysconfig/network-scripts/network-functions:

get_uuid_by_config ()
{
    dbus-send --system --print-reply --dest=com.redhat.ifcfgrh1 /com/redhat/ifcfgrh1 com.redhat.ifcfgrh1.GetIfcfgDetails string:"/etc/sysconfig/network-scripts/$1" 2>/dev/null | awk -F '"' '/string / { print $2 }'
}
# (. /etc/sysconfig/network-scripts/network-functions ; get_uuid_by_config ifcfg-eth0 ; get_uuid_by_config ifcfg-eth1)
d5fadadc-78f1-414e-aa22-b5a020325d17
7b4d0184-07c8-4635-aeb3-eae4ce2ad30d

NetworkManager 的には、nmcli を使うのが正攻法らしい。

# nmcli con list
NAME                      UUID                                   TYPE              SCOPE    TIMESTAMP-REAL
System eth1               7b4d0184-07c8-4635-aeb3-eae4ce2ad30d   802-3-ethernet    system   never
System eth0               d5fadadc-78f1-414e-aa22-b5a020325d17   802-3-ethernet    system   Wed Apr 30 14:25:47 2014
NAME                      UUID                                   TYPE              SCOPE    TIMESTAMP-REAL

いずれの場合も、NetworkManager が起動している必要がある。上記 UUID は、ifcfg-* に UUID 定義が有ればその値が使われるらしい。試しに UUID 行をコメントアウトしてみると、

# grep UUID /etc/sysconfig/network-scripts/ifcfg-*
/etc/sysconfig/network-scripts/ifcfg-eth0:#UUID=d5fadadc-78f1-414e-aa22-b5a020325d17
/etc/sysconfig/network-scripts/ifcfg-eth1:#UUID=7b4d0184-07c8-4635-aeb3-eae4ce2ad30d

# (. /etc/sysconfig/network-scripts/network-functions ; get_uuid_by_config ifcfg-eth0 ; get_uuid_by_config ifcfg-eth1)
5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04

# nmcli con list
NAME                      UUID                                   TYPE              SCOPE    TIMESTAMP-REAL
System eth1               9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04   802-3-ethernet    system   never
System eth0               5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03   802-3-ethernet    system   Wed Apr 30 14:27:00 2014
NAME                      UUID                                   TYPE              SCOPE    TIMESTAMP-REAL

コメントアウト後の UUID は、本エントリ初出のデバイス毎 UUID と一致する。つまり NetworkManager 的には、「ifcfg-* に UUID が有ればそれを使うし、無ければ自分で適当に決めるし」ということらしい。以上より、

UUID は有っても無くてもどうでもいい。

とはいえ私自身 NetworkManager を使っていないし、実際に UUID を消して NetworkManager 関連で問題があったとしても分からないけどね。もし不安なら、初出のデバイス毎の規定値を使っておくのが最も安全だと思う。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。