在 Linux 中,第一块网卡设备名为 eth0,以后依次为 eth1,eth2…… 但网卡
并不作为裸设备出现于 /dev 下,而是内核在引导时在内存中建立的。这就是说,应
该在系统引导时自动设置网卡。现在大多数发行版都是采用 module 的方式在系统引
导时设定网卡的,当然如果你清楚的知道你的网卡类型,也可以把相应的网卡驱动编
译进内核。
Linux 的引导通常有以下几种方式,
A. 通过硬盘以 LILO 引导。优点是启动快而简捷;缺点是需要写硬盘主引导扇区,
在多系统共存时可能与 DOS/WIN 下某些防病毒软件冲突,而且很多人希望 LILO 默
认引导到 DOS/WIN 下,这就需要掌握 LILO 的配置方法,这对新手是有一点障碍的。
B. 通过软盘引导。虽然慢,但这是对原系统影响最小的办法。只要在安装时不安装
LILO,而做一张引导软盘就行了。这样想启动 Linux 时,只要插入软盘就可以了。
C. 通过 Loadin.exe 引导。Loadin.exe 是 DOS 下的程序,可以装入 Linux 的内
核,启动到 Linux 下。这样可以从 WIN9X 的纯 DOS 环境下直接启动 Linux 。当
然,需要学会如何配置,--很简单的哦。
不管采用哪种方式引导,加载网卡的方式有两种:
1. 把网卡驱动编译进内核,引导时就加载。
2. 采用 modules 自动加载。
采用方式1,则不可能支持所有的网卡,哪样内核会变成个庞然大物。因此很多
发行版为了灵活支持多种网卡,采用 modules 的方式。然而对于每一台特定的电脑,
通常只需要支持有限的一种或几种网卡,因此可以采用方式1,不过需重新编译内核。
编译内核的方法详见 KernelHOWTO,编译时需要注意的是以下几项:
Networking support (CONFIG_NET) [Y/n/?] Y
TCP/IP networking (CONFIG_INET) [Y/n/?] Y
Network device support (CONFIG_NETDEVICES) [Y/n/?] Y
Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?] Y
PCI Ethernet adapters (CONFIG_NET_PCI) [N/y/?] Y /* 如果是PCI网卡的话*/
方式2为大多数发行版所采用,而且可以在安装时设置网卡,选用相应的网卡即
可。值得指出的是,安装时很多网卡没有列出,但并不代表 Linux 本身不支持,详
见 EthernetHOWTO。这时您可以查阅网卡及手册,会发现其使用何种芯片,可以用安
装时网卡列表中同种芯片的网卡试试。通常,网卡手册中会说明该网卡兼容或类似某
种通用网卡。很多10M网卡兼容 NE2000,比如我的 D-LINK DE220,这时可以选
NE2000 试试。
然而,很多 PNP 的网卡并不能被检测到,例子还是我的 DE220。据说在 Linux
环境下可以通过 isapnp 设置,我没试过,详情请 man isapnp 吧。为免麻烦,我使
用了另一种方法:在 DOS 下使用 DE220 的驱动程序(可以在其网站下载到),屏蔽掉
PNP 功能,并设定“IO=0240h-025fh”,“IRQ=11”。然后再进行安装。
糟糕的是,有部分网卡并非完全兼容 NE2000,例子又是我的 DE220,这类网卡
在 EthernetHOWTO 中被称为 bad NE2000 clone,他们采用了非标准的标识方法以
致 Linux 的 NE2000 驱动不能自动检测到它。我的 RedHat 6.1 就是这样,导致安
装后找不到网卡,必需手动进行配置了。
解决这个问题需要向内核传递 IRQ 号及 IO 端口,这两项的具体数据可以从
WIN9X 的设备管理中查到,最笨却最稳妥的是如前哪样用网卡 DOS 下的驱动程序设
定好,记下来。Linux 下输入的数据格式类似 C 语言,IO采用十六进制,即 0xNNN,
其中 NNN 是 IO 中 0XXXh-0XXXh 的前一个数的“XXX”部分。IRQ 可直接用十进制。
针对我的 DE220,就是“0x240”和“11”了。配置方法如下:
如果采用方式1,必须直接将 IRQ 号及 IO 端口传递给内核——在系统启动出现
Boot: 的时候,输入“linux ether=IRQ,IO,eth0”。具体针对我的 DE220 就是这样:
Boot: linux ether=11,0x240,eth0
通常传递了 IO 地址系统就可以检测到网卡了,因此也可以输入:
Boot: linux ether=0,0x240,eth0
IRQ 或 IO 处可以输零(如上),是告诉内核自动检测该项。如果这样可以了,可以
通过 LILO 每次启动时自动把以上参数传递给内核,具体方法是:
编辑 /etc/lilo.conf,加入:
append="ether=0,0x240,eth0"
然后:
# lilo /* 重新加载 lilo */
append 是告诉 LILO 把引号中的字符串传递给内核。使用 Loadlin.exe 的道理与此
类同,不过我没试过,请查阅 Loadlin 的手册(一般随程序提供)。
如果采用方式2,就需要手工加上相应的 modules :
a.) 查看目录“/lib/modules/内核版本号/net/”,其中内核版本号部分可能每台机器
都不同,看你自己的决定吧。该目录下文件格式如 *.o ,分别代表不同网卡的
modules ,记下你自己网卡相应的文件名,如 DE220 兼容 NE2000 ,就是 NE2000
的 ne.o 了。
b.) 编辑文件 /etc/conf.modules ,如没有就建一个。加入以下两行:
alias eth0 “网卡相应 module 的文件名”
options 网卡类型 io=0xNNN
针对我的 DE220 ,这两行就应该是这样:
alias eth0 ne.o
options ne io=0x240
c.) 重启动后,我的 DE220 就可以找到了。
启动后,查看 /proc 下的 ioports 和 interrupts 文件,如果网卡设置成功,
应该有相应描述,如我的 DE220 使用 NE2000 的驱动,可以看到:
# cat ioports
...
0240-025f: NE2000
...
# cat interrupts
...
11: ... XT-PIC NE2000
...
然后就可以开始设置 TCP/IP 的参数了(本文不涉及)。值得指出的是,采用
ping 127.0.0.1 的方式只能测试内核是否支持网络及 lo 设备,并不能测试到 eth0
是否工作,应该 ping 通实际的 IP 地址,才算 TCP/IP 配置成功。
因为要配置路由器,我在另一台机器上实验了双网卡。采用了 Topstar TE2000
系列,ISA 接口,使用8019芯片,兼容 NE2000。有的书上告戒不要使用两块相同的
NE2000 兼容网卡,我不知道原因,而我配置过程中也没发现问题。
首先下载该网卡 DOS 下驱动/设置程序,用 DOS6.22 启动,运行设置程序并设定
IRQ,IO 地址。关键是两块网卡不能设成一样的以免冲突,同时注意不能同其它的设备
冲突。有在 DOS 下配置硬件经验的朋友当然轻车熟路了 8-)。用纸记录下来。编译内
核使之支持 NE2000 系列后,用新内核重启(RedHat 6.1),报告发现 eth0,没有提到
eth1(第二网卡)。
接下来编辑 /etc/lilo.conf,加入:
append="ether=9,0x320,eth1" /* 我第二网卡设置为 IRQ=9,IO=0X320 */
然后:
# lilo /* 重新加载 lilo */
重启动,发现 eth0,eth1,成功!
我在为一台机器配 D-LINK DFE530TX (10/100M)的网卡时,在其网站下找到了技
术支持文档,说的很详细(http://tsc.dlinktw.com.tw/nic/dfe530/RedHat6.pdf)。
配置该网卡的朋友可以参考。
由此也可以总结出在 linux 下配置网卡的终极大法:
A. 从买网卡开始,就应选择 Linux 支持比较好的品牌,可以参考 EthernetHOWTO,
如果最新的 EthernetHOWTO 中对该品牌甚至芯片都是 unsupported,建议还是换
一块吧。
B. 不要急于发问,先查查厂商的网站,厂商自己的解决方案可能是最好的,起码可
以参考。
C. 建议屏蔽掉网卡的 pnp,客观的说,虽然人们对 M$ 有 Plug And Pray 的嘲弄,
Linux 对 PNP 的支持还不如 M$。屏蔽掉网卡的 pnp,能省掉好多麻烦,起码在
不成功时缩小了排错的范围。
D. 如果系统还不能找到网卡,可能需要去相应的 Linux 驱动下载点下载最新的驱动
程序。然后按其说明安装。不过绝大多数比较新的发行版都带了很多,而且工作
的相当好,比如 NE2000 兼容系列,完全可以使用 NE2000 的 ne.o。
E. 重新编译内核,详情请参考 KernelHOWTO,注意相关的网络选项一定要选定支持。
而对应的网卡一定要选 y(编译进内核) 或 m(采用 module)。如果选 m,还需要
编译 module。
F. 试验新内核或 module。如果还不能找到网卡,就参照上文所说的方法向内核或
module 传递 IRQ 和 IO 等参数。
G. a.) 成功了!配置 LILO 或 /etc/conf.modules,使每次引导都可以自动加载网
卡。
恭喜!你的水平也上了一个台阶。
b.) 还不行!你有三个选择:
1.) 去各大 BBS,新闻组,求求各位大侠赐教,不过恐怕近期内不会有什么
新招了。
2.) 痛骂网卡的制造商,然后做个顺民,回去继续受 M$ 的压榨。
3.) 苦练编程本领,自己写个驱动出来!为自由天地做个贡献!
并不作为裸设备出现于 /dev 下,而是内核在引导时在内存中建立的。这就是说,应
该在系统引导时自动设置网卡。现在大多数发行版都是采用 module 的方式在系统引
导时设定网卡的,当然如果你清楚的知道你的网卡类型,也可以把相应的网卡驱动编
译进内核。
Linux 的引导通常有以下几种方式,
A. 通过硬盘以 LILO 引导。优点是启动快而简捷;缺点是需要写硬盘主引导扇区,
在多系统共存时可能与 DOS/WIN 下某些防病毒软件冲突,而且很多人希望 LILO 默
认引导到 DOS/WIN 下,这就需要掌握 LILO 的配置方法,这对新手是有一点障碍的。
B. 通过软盘引导。虽然慢,但这是对原系统影响最小的办法。只要在安装时不安装
LILO,而做一张引导软盘就行了。这样想启动 Linux 时,只要插入软盘就可以了。
C. 通过 Loadin.exe 引导。Loadin.exe 是 DOS 下的程序,可以装入 Linux 的内
核,启动到 Linux 下。这样可以从 WIN9X 的纯 DOS 环境下直接启动 Linux 。当
然,需要学会如何配置,--很简单的哦。
不管采用哪种方式引导,加载网卡的方式有两种:
1. 把网卡驱动编译进内核,引导时就加载。
2. 采用 modules 自动加载。
采用方式1,则不可能支持所有的网卡,哪样内核会变成个庞然大物。因此很多
发行版为了灵活支持多种网卡,采用 modules 的方式。然而对于每一台特定的电脑,
通常只需要支持有限的一种或几种网卡,因此可以采用方式1,不过需重新编译内核。
编译内核的方法详见 KernelHOWTO,编译时需要注意的是以下几项:
Networking support (CONFIG_NET) [Y/n/?] Y
TCP/IP networking (CONFIG_INET) [Y/n/?] Y
Network device support (CONFIG_NETDEVICES) [Y/n/?] Y
Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?] Y
PCI Ethernet adapters (CONFIG_NET_PCI) [N/y/?] Y /* 如果是PCI网卡的话*/
方式2为大多数发行版所采用,而且可以在安装时设置网卡,选用相应的网卡即
可。值得指出的是,安装时很多网卡没有列出,但并不代表 Linux 本身不支持,详
见 EthernetHOWTO。这时您可以查阅网卡及手册,会发现其使用何种芯片,可以用安
装时网卡列表中同种芯片的网卡试试。通常,网卡手册中会说明该网卡兼容或类似某
种通用网卡。很多10M网卡兼容 NE2000,比如我的 D-LINK DE220,这时可以选
NE2000 试试。
然而,很多 PNP 的网卡并不能被检测到,例子还是我的 DE220。据说在 Linux
环境下可以通过 isapnp 设置,我没试过,详情请 man isapnp 吧。为免麻烦,我使
用了另一种方法:在 DOS 下使用 DE220 的驱动程序(可以在其网站下载到),屏蔽掉
PNP 功能,并设定“IO=0240h-025fh”,“IRQ=11”。然后再进行安装。
糟糕的是,有部分网卡并非完全兼容 NE2000,例子又是我的 DE220,这类网卡
在 EthernetHOWTO 中被称为 bad NE2000 clone,他们采用了非标准的标识方法以
致 Linux 的 NE2000 驱动不能自动检测到它。我的 RedHat 6.1 就是这样,导致安
装后找不到网卡,必需手动进行配置了。
解决这个问题需要向内核传递 IRQ 号及 IO 端口,这两项的具体数据可以从
WIN9X 的设备管理中查到,最笨却最稳妥的是如前哪样用网卡 DOS 下的驱动程序设
定好,记下来。Linux 下输入的数据格式类似 C 语言,IO采用十六进制,即 0xNNN,
其中 NNN 是 IO 中 0XXXh-0XXXh 的前一个数的“XXX”部分。IRQ 可直接用十进制。
针对我的 DE220,就是“0x240”和“11”了。配置方法如下:
如果采用方式1,必须直接将 IRQ 号及 IO 端口传递给内核——在系统启动出现
Boot: 的时候,输入“linux ether=IRQ,IO,eth0”。具体针对我的 DE220 就是这样:
Boot: linux ether=11,0x240,eth0
通常传递了 IO 地址系统就可以检测到网卡了,因此也可以输入:
Boot: linux ether=0,0x240,eth0
IRQ 或 IO 处可以输零(如上),是告诉内核自动检测该项。如果这样可以了,可以
通过 LILO 每次启动时自动把以上参数传递给内核,具体方法是:
编辑 /etc/lilo.conf,加入:
append="ether=0,0x240,eth0"
然后:
# lilo /* 重新加载 lilo */
append 是告诉 LILO 把引号中的字符串传递给内核。使用 Loadlin.exe 的道理与此
类同,不过我没试过,请查阅 Loadlin 的手册(一般随程序提供)。
如果采用方式2,就需要手工加上相应的 modules :
a.) 查看目录“/lib/modules/内核版本号/net/”,其中内核版本号部分可能每台机器
都不同,看你自己的决定吧。该目录下文件格式如 *.o ,分别代表不同网卡的
modules ,记下你自己网卡相应的文件名,如 DE220 兼容 NE2000 ,就是 NE2000
的 ne.o 了。
b.) 编辑文件 /etc/conf.modules ,如没有就建一个。加入以下两行:
alias eth0 “网卡相应 module 的文件名”
options 网卡类型 io=0xNNN
针对我的 DE220 ,这两行就应该是这样:
alias eth0 ne.o
options ne io=0x240
c.) 重启动后,我的 DE220 就可以找到了。
启动后,查看 /proc 下的 ioports 和 interrupts 文件,如果网卡设置成功,
应该有相应描述,如我的 DE220 使用 NE2000 的驱动,可以看到:
# cat ioports
...
0240-025f: NE2000
...
# cat interrupts
...
11: ... XT-PIC NE2000
...
然后就可以开始设置 TCP/IP 的参数了(本文不涉及)。值得指出的是,采用
ping 127.0.0.1 的方式只能测试内核是否支持网络及 lo 设备,并不能测试到 eth0
是否工作,应该 ping 通实际的 IP 地址,才算 TCP/IP 配置成功。
因为要配置路由器,我在另一台机器上实验了双网卡。采用了 Topstar TE2000
系列,ISA 接口,使用8019芯片,兼容 NE2000。有的书上告戒不要使用两块相同的
NE2000 兼容网卡,我不知道原因,而我配置过程中也没发现问题。
首先下载该网卡 DOS 下驱动/设置程序,用 DOS6.22 启动,运行设置程序并设定
IRQ,IO 地址。关键是两块网卡不能设成一样的以免冲突,同时注意不能同其它的设备
冲突。有在 DOS 下配置硬件经验的朋友当然轻车熟路了 8-)。用纸记录下来。编译内
核使之支持 NE2000 系列后,用新内核重启(RedHat 6.1),报告发现 eth0,没有提到
eth1(第二网卡)。
接下来编辑 /etc/lilo.conf,加入:
append="ether=9,0x320,eth1" /* 我第二网卡设置为 IRQ=9,IO=0X320 */
然后:
# lilo /* 重新加载 lilo */
重启动,发现 eth0,eth1,成功!
我在为一台机器配 D-LINK DFE530TX (10/100M)的网卡时,在其网站下找到了技
术支持文档,说的很详细(http://tsc.dlinktw.com.tw/nic/dfe530/RedHat6.pdf)。
配置该网卡的朋友可以参考。
由此也可以总结出在 linux 下配置网卡的终极大法:
A. 从买网卡开始,就应选择 Linux 支持比较好的品牌,可以参考 EthernetHOWTO,
如果最新的 EthernetHOWTO 中对该品牌甚至芯片都是 unsupported,建议还是换
一块吧。
B. 不要急于发问,先查查厂商的网站,厂商自己的解决方案可能是最好的,起码可
以参考。
C. 建议屏蔽掉网卡的 pnp,客观的说,虽然人们对 M$ 有 Plug And Pray 的嘲弄,
Linux 对 PNP 的支持还不如 M$。屏蔽掉网卡的 pnp,能省掉好多麻烦,起码在
不成功时缩小了排错的范围。
D. 如果系统还不能找到网卡,可能需要去相应的 Linux 驱动下载点下载最新的驱动
程序。然后按其说明安装。不过绝大多数比较新的发行版都带了很多,而且工作
的相当好,比如 NE2000 兼容系列,完全可以使用 NE2000 的 ne.o。
E. 重新编译内核,详情请参考 KernelHOWTO,注意相关的网络选项一定要选定支持。
而对应的网卡一定要选 y(编译进内核) 或 m(采用 module)。如果选 m,还需要
编译 module。
F. 试验新内核或 module。如果还不能找到网卡,就参照上文所说的方法向内核或
module 传递 IRQ 和 IO 等参数。
G. a.) 成功了!配置 LILO 或 /etc/conf.modules,使每次引导都可以自动加载网
卡。
恭喜!你的水平也上了一个台阶。
b.) 还不行!你有三个选择:
1.) 去各大 BBS,新闻组,求求各位大侠赐教,不过恐怕近期内不会有什么
新招了。
2.) 痛骂网卡的制造商,然后做个顺民,回去继续受 M$ 的压榨。
3.) 苦练编程本领,自己写个驱动出来!为自由天地做个贡献!