2008/11/03

vmwareでclone化したUbuntu 8.04でeth0がeth1になってしまう

まぁなんてことはないんですが、CMSパッケージをいくつか試してみようと考えて、VmwareにインストールしたUbuntu 8.04 Server版のイメージを元にCloneを作成しました。

なにげなく起動してパッケージ情報を更新しようと"sudo apt-get update"を実行したところネットワークに接続されていない事でエラーが発生してしまいました。
わりとすぐに以前ALIXで調べた/etc/udev/rules.d以下のファイルを書き換える必要があるんだろうと気がついてよかったですが、ひさしぶりに慣れない事をするとはまりそうになります。
調べ方だけまとめておきます。

ネットワークインタフェースの状態を把握する

linuxではネットワークインタフェースはループバックデバイス"lo"の他に"eth0", "eth1"、...といった"eth"+"数字"で認識されていて、昔は物理的なネットワークカードに対応して0番目から1..nと増えていったものです。最近は後述するようにネットワークカード毎にユニークなMACアドレスを紐づけて、電源を入れる度にランダムにネットワークカードとデバイス名の対応が壊れないように管理されています。一つのインタフェースに複数のIPアドレスを"eth0:0"のような形式で設定する("sudo ifconfig eth0:0 192.168.x.y"等)事もできますが、現在のような形で管理されてしまうとなかなか見る機会も使う機会もなさそうです。

というわけでネットワークに接続できない場合には、まずどんなネットワークデバイスが認識され、有効になっているか確認します。 まずは有効になっているネットワークアドレスを調べます。

$ ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
これで127.0.0.1という必ず設定されている自分自身を表すループバックアドレスだけが認識されている事がわかります。これはお約束で設定されているため、これだけではネットワークに接続する事ができません。

次にネットワークに認識されているデバイスを調べます。

ifconfig -a
eth1      Link encap:Ethernet  HWaddr 00:0c:29:14:yy:yy  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          ...
lo
          ...
通常は2行目にIPアドレスの指定が入り、"BROADCAST"で始まる行が"UP BROADCAST"と稼働中を表わす"UP"で始まるようになります。

ここで"eth0"ではなく、"eth1"が認識されているものの稼働していない理由を調べます。Ubuntu 8.04では"/etc/network/interfaces"にデバイス毎の設定が入ります。

$ cat /etc/network/interfaces 
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
ここで"eth1"に対応する設定が入っていない事でDHCPサーバーからの自動IP設定もIPアドレスの直接指定もできずに"eth1"が認識されたまま起動しないのだとわかります。
ここでの解決策はおそらく次のいずれかになるでしょう。
  1. /etc/network/interfacesファイルにeth1用の記述を追加する
  2. eth1をeth0として認識させる
ここでは2番目のeth1をeth0として認識させる方法で対応します。 設定ファイルは"eth0"という文字を含むでしょうから、まずこのファイルを表示させます。
$ sudo find /etc/ -type f -exec grep eth0 {} \; -print
...
/etc/network/interfaces
...
/etc/dhcp3/dhclient.conf.dpkg-dist
...
/etc/udev/rules.d/70-persistent-net.rules
...
/etc/initramfs-tools/initramfs.conf
sudoを使用するのは一般ユーザーでは読めないファイルがあった時のエラーを防ぐためだけで、必要性は高くありません。grepの結果が表示されて、続いてそのファイルが表示されます。この中で2つのファイル、"interfaces"と"initramfs.conf"、はmanで何のファイルか確認する事ができます。"dhclient.conf.dpkg-dist"のファイルの後ろにある".dpkg-dist"はパッケージの更新時に既存のファイルを残す選択をした時に作成されたもので、普通は新しいパッケージについてくる未編集の設定ファイルです。"man dhclient.conf"と".dpkg-dist"を除いた形では説明を読む事ができます。
残った"/etc/udev/rules.d/70-persistent-net.rules"ファイルが問題のファイルで、この中は次のようになっています。
$ cat /etc/udev/rules.d/70-persistent-net.rules 
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:14:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:14:yy:yy", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
いま認識されているMACアドレスは"00:0c:29:14:yy:yy"なので、これがeth1になっているのは、このファイルの記述通りです。"00:0c:29:14:xx:xx"はVMWareでCloneを作成する元になった方で使用していました。これは今後使われる可能性がないので、おもいきって消してeth1をeth0にしてしまいます。
$ cat /etc/udev/rules.d/70-persistent-net.rules 
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:14:yy:yy", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
これで再起動すれば、"eth0"となったデバイスに、/etc/network/interfacesの設定通りdhcpで設定されたIPアドレスが設定されます。

0 件のコメント: