# 升级gentoo后网卡不见了问题－－已解决

## pyromania

在gentoo下运行emerge -uNpDv world 升级系统后网卡不见了。

ifconfig命令下只有loopback端口，找不到eth0。

运行 

#/etc/init.d/net.eth0 start

系统报错，如下

interface eth0 is not Ethernet or 802.2 Token Ring

请问是否有人遇到过类似问题如何解决

谢谢Last edited by pyromania on Sat Mar 10, 2007 8:37 am; edited 1 time in total

----------

## akar

　　查看 PCI 的系統組件，是否有了 網卡存在：

```
# lspci |grep Ethernet
```

　　用 modprobe 試著把該驅動（可能是：b44, e100 ...)載入:

```
# modprobe b44
```

　　如果以上都成功了，就可以把 網卡的驅動模塊在開機時自動載入。

```
# echo b44 >> /etc/modules.autoload.d/kernel-2.6
```

----------

## pyromania

运行

#lspci |grep Ethernet

系统显示

00:0a.0 Bridge: nVidia Corporation CK804 Ethernet Controller (rev a3)

应该是认出了我的网卡

另外，我未升级之前都可以正常使用网卡，也没有重新编译内核。

网卡应该是驱动好了的。是否是设置问题。

----------

## big

可能是因为eth1394驱动被编译进了内核(或者是编译为模块),但是当系统引导的时候1394的驱动先于你网卡的驱动被加载,这样你的网卡应该被是eth1. 

解决方法是最好能够屏蔽掉那个模块的加载(前提是该驱动被编译成模块),你可以试着在grub的kernel行加入disalbemodules=eth1394 或者MODULES=!mod in /etc/rc.conf 或者其他不同的udev rules.不过最好推荐你还是重新配置你的内核或者直接在.config文件中删掉相关配置项,然后重新编译内核.或者有个不是方法的方法,你到内核模块的目录下直接把那个加载的模块改下名字,例如是eth1394.ko你把它改个名字就好了,不一定有效试试看吧. 

搜索一下论坛,似乎是有类似问题的,多是在升级系统后出现的,尤其是在升级udev后出现的.

----------

## EricHsu

 *pyromania wrote:*   

> 运行
> 
> #lspci |grep Ethernet
> 
> 系统显示
> ...

 

update 系统后是否做了 etc-update? 确保这一步完成  :Smile: 

另外, 看看你的网卡对应的内核驱动模块叫什么名字 (gooogle..), 然后 lsmod | grep <模块名> 看看是否加载了.

把 dmesg 贴上来看看?

----------

## akar

 *EricHsu wrote:*   

> 
> 
> update 系统后是否做了 etc-update? 确保这一步完成 
> 
> 

 

Eric 說得有道理，“全世界”更新後可別忘了 etc-update ，因為如果是 baselayout 也升級了，一些系統啟動的腳本可能會有新版本。

至於那些 coldplug hotplug dbus 和 udev 這些一大串的新興的（半）自動系統硬體配置軟件。有時我都給她們搞得有點像戀愛的感覺（即：好像很美好，但老是捉摸不透）。 

再不行的話，試試以下手動載入你的網卡的驅動：

```
# modprobe nvnet
```

用 ifconfig 查一下結果（也許先執行一下： # /etc/init.d/net.eth0 restart ）。

不行的話，那就試另一個驅動 forcedeth：

```

# modprobe -r nvnet

# modprobe forcedeth

```

如果用以上手工的方式行的話，那就把正確的驅動加入到正確的　核心自動啟動驅動中：

```

# echo nvnet >> /etc/modules.autoload.d/kernel-2.6

# module-update

```

----------

## pyromania

 *big wrote:*   

> 可能是因为eth1394驱动被编译进了内核(或者是编译为模块),但是当系统引导的时候1394的驱动先于你网卡的驱动被加载,这样你的网卡应该被是eth1. 
> 
> 解决方法是最好能够屏蔽掉那个模块的加载(前提是该驱动被编译成模块),你可以试着在grub的kernel行加入disalbemodules=eth1394 或者MODULES=!mod in /etc/rc.conf 或者其他不同的udev rules.不过最好推荐你还是重新配置你的内核或者直接在.config文件中删掉相关配置项,然后重新编译内核.或者有个不是方法的方法,你到内核模块的目录下直接把那个加载的模块改下名字,例如是eth1394.ko你把它改个名字就好了,不一定有效试试看吧. 
> 
> 搜索一下论坛,似乎是有类似问题的,多是在升级系统后出现的,尤其是在升级udev后出现的.

 

十分感谢，我的网卡真的变成了eth1.

现在问题已经解决了，谢谢

----------

## akar

 *pyromania wrote:*   

> 
> 
> 十分感谢，我的网卡真的变成了eth1.
> 
> 现在问题已经解决了，谢谢

 

　　不知在沒有重新編譯核心的情況下，這種情況是如何發生的呢？

----------

## big

如果之前的内核配置没有问题，系统更新完成也没有对内核做过改动的话，问题就很有可能在udev上。是udev负责在/dev目录下创建和命名节点，但是网卡和一般的硬盘，鼠标，键盘等设备有点不同，虽然它也是通过名字来引用，诸如eth0,eth1,但是一般没有相关的设备节点。udev的规则中是用网卡的MAC地址来对设备进行匹配。

这是/etc/udev/rules.d/75-persistent-net-generator.rules:

```
# these rules generate rules for persistent network device naming

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS!="xen", \

        KERNEL=="eth*|ath*|wlan*|ra*|sta*", \

        NAME!="?*", DRIVERS=="?*", GOTO="persistent_net_generator_do"

GOTO="persistent_net_generator_end"

LABEL="persistent_net_generator_do"

# build device description string to add a comment the generated rule

SUBSYSTEMS=="pci", ENV{COMMENT}="PCI device $attr{vendor}:$attr{device} ($attr{driver})"

SUBSYSTEMS=="usb", ENV{COMMENT}="USB device 0x$attr{idVendor}:0x$attr{idProduct} ($attr{driver})"

SUBSYSTEMS=="ieee1394", ENV{COMMENT}="Firewire device $attr{host_id})"

ENV{COMMENT}=="", ENV{COMMENT}="$env{SUBSYSTEM} device ($attr{driver})"

IMPORT{program}="write_net_rules $attr{address}"

ENV{INTERFACE_NEW}=="?*", NAME="$env{INTERFACE_NEW}"

LABEL="persistent_net_generator_end"
```

这个是/etc/udev/rules.d/70-persistent-net.rules:

```
# This file was automatically generated by the /lib/udev/write_net_rules

# program, probably run by the persistent-net-generator.rules rules file.

#

# You can modify it, as long as you keep each rule on a single line.

# PCI device 0x14e4:0x167d (tg3)

SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:26:51:13:c6:70", NAME="eth0"
```

从中应该可以看出点端倪，首先后面的这个规则是在前一个规则基础上由write_net_rules产生的。udev添加一个节点或者给一个新的设备命名，udev的规则中的关键字必须匹配，kernel,subsystem，driver等等.

上面的文件中：

```
 ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS!="xen", \

        KERNEL=="eth*|ath*|wlan*|ra*|sta*", \

        NAME!="?*", DRIVERS=="?*", GOTO="persistent_net_generator_do"

```

在Kernal name为eth,ath,waln,ra sta开头的设备，如果同时subsystem还是"net"的话，udev在为设备命名时候都将应用这一规则。假设内核没有问题，pyromania的问题，则有可能是udev应用规则命名时候出错，可能是规则有问题或者还是我武断的把内核排除在外，不得而知。如果有出错系统当时的udev配置文件看看的话，也许能找到点线索。

----------

## akar

　　看來 big 對 udev 的運作相當了解，回文對大家了解她的內部運作有很大的幫助。  :Smile: 

　　原來真的是 udev 這位“少女十八變”在搞鬼！　＠＠

　　顯然 1394 硬件模塊在 新版本的 udev 在硬件自動辦識上有了新的解釋。

　　那以後碰上類似的問題的朋友，可以仍用以下的方式來找出問題，查看系統啟動記錄 dmesg (Eric 在樓上的回覆提出過)：

```
$ dmesg|grep eth
```

　　注：在這次的情況下，就會找到 eth0 和 eth1 這兩個被系統核心辨認出來的兩個 网卡硬件。

　　那將來在升級 udev 時便要留意了！

----------

