4.1 Linux 连上 Internet 前的注意事项

由前面几章的数据我们知道,想要连上 Internet 你得要设定一组合法的 IP 参数才可以,主要是 IP, Netmask, Gateway, DNS IP 以及主机名等。那我们也知道,其实整个主机最重要的设定,就是『先要驱动网络卡』,否则主机连网络卡都捉不到时, 怎么设定 IP 参数都是没有用的,你说是吧!所以底下我们就来谈一谈, 你要如何确定网络卡已经被捉到,而 Linux 主机的网络参数又该如何设定?


4.1.1 Linux 的网络卡

你怎么确认 Linux 有捉到网络卡?Linux 底下的网络卡的名称是啥?让我们来了解一下吧!

  • 认识网络卡的装置代号

    在 Linux 里面的各项装置几乎都是以文件名来取代的,例如 /dev/hda 代表 IDE1 接口的第一个 master 硬盘等等。 不过,网络卡的代号 (Network Interface Card, NIC) 却是以模块对应装置名称来代替的, 而默认的网络卡代号为 eth0 ,第二张网络卡则为 eth1 ,以此类推。

  • 关于网络卡的模块 (驱动程序)

    我们知道网络卡其实是硬件,所以当然需要核心支持才能驱动他。一般来说,目前新版的 Linux distributions 默认可以支持的网络卡芯片组数量已经很完备了,包括大厂的 3COM, Intel 以及初阶的 RealTek, D-Link 等网络卡芯片都已经被支持, 所以使用者可以很轻易的设定好他们的网络卡。不过,万一你的网络卡芯片组开发商不愿意释出开放源 (Open Source) 的硬件驱动程序,或者是该网络卡太新了,使得 Linux 核心来不及支持时,那么你就得要透过:

    1. 重新编译较新的核心,或者是
    2. 编译网络卡的核心模块 好让核心可以支持网络卡这块硬件啦!但是,重编核心或编译网络卡核心模块都不是简单的工作, 而且有时原始码又可能无法在每部主机上面编译成功,所以万一你的网络卡真的不被默认的 Linux 网络芯片所支持,那么鸟哥真的建议直接换一块被 Linux 支持的网络卡吧,例如很便宜的螃蟹卡! 免得花了太多时间在硬件确认上面,划不来的! ^_^

    另外,其实有的时候 Linux 的默认网络卡模块可能无法完全 100% 的发挥网络卡的功能的, 所以,有的时候你还是得必须要自行编译网络卡的模块才行喔!当然, 那个网络卡的模块就得要自行由网络卡开发商的官方网站下载了!不过,如果你的网络卡是自行编译安装的, 那么每次重新安装其他版本的核心时,你都必须要自行重新手动编译过该模块。 因为模块与核心是有相关性的啊!

  • 观察核心所捉到的网卡信息

    假设你的网络卡已经在主机上面,不论是内建的还是自行安插到 PCI 或 PCI-x 或 PCI-E 的接口上, 那么如何确认该网络卡有被核心捉到呢?很简单啊!就利用 dmesg 来查阅即可:

    [root@www ~]# dmesg | grep -in eth
    377:e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
    383:e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection
    418:e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
    419:eth0: no IPv6 routers present
    

    从上面的第 377 及 383 这两行,我们可以查到这部主机的两张网络卡都使用模块为 e1000,而使用的芯片应该就是 Intel 的网络卡了。此外,这个网卡的速度可达到 1000Mbps 的全双工模式哩 (418行) !除了使用 dmesg 来查询核心侦测硬件产生的信息外,我们也可以透过 lspci 来查询相关的设备芯片数据喔!如下所示:

    [root@www ~]# lspci | grep -i ethernet
    00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet 
    Controller (rev 02)
    

    请注意,鸟哥这里使用的是 Virtualbox 仿真的那部主机的环境 (请参考第一章 1.2.2-2),因此使用的是模拟出来的 Intel 网卡。 如果你是使用自己的实际硬件配备安装的主机,那么应该会看到不同的芯片啦!那是正常的!

  • 观察网络卡的模块

    从刚刚的 dmesg 的输出讯息中,我们知道鸟哥这部主机所使用的模块是 e1000 ,那核心有顺利的载入了吗?可以利用 lsmod 去查查看。此外,这个模块的相关信息又是如何呢?使用 modinfo 来查查看吧!

    [root@www ~]# lsmod | grep 1000
    e1000                 119381  0  <==确实有载入到核心中!
    
    [root@www ~]# modinfo e1000
    filename:    <u>/lib/modules/2.6.32-71.29.1.el6.x86_64/kernel/drivers/net/e1000/e1000.ko</u>
    version:     7.3.21-k6-NAPI
    license:     GPL
    description: Intel(R) PRO/1000 Network Driver
    .....(以下省略).....
    

    上面输出信息的重点在于那个档名 (filename) 的部分!那一场串的文件名目录,就是我们驱动程序放置的主要目录所在。 得要注意的是,那个 2.6.32-71.29.1.el6.x86_64 是核心版本,因此,不同的核心版本使用的驱动程序其实不一样喔!我们才会一直强调,更改核心后, 你自己编译的硬件驱动程序就需要重新编译啦!

    那你如何知道你的网络卡卡号呢?很简单啊!不管有没有启动你的网络卡,都可以使用: 『 ifconfig eth0 』来查询你的网卡卡号。如果你照着上面的信息来作, 结果发现网卡已经驱动了,恭喜你,准备到下一节去设定网络吧!如果没有捉到网卡呢?那就准备自己编译网卡驱动程序吧!


4.1.2 编译网卡驱动程序(Option)

一般来说,如果没有特殊需求,鸟哥不是很建议你自己编译网络卡的驱动程序!为啥? 因为想到每次更新核心都得要重新编译一次网卡驱动程序,光是想想都觉得烦~所以,没有被 Linux 预设核心支持的网卡, 就先丢着吧!

Tips: 鸟哥之前买了一张内建网卡的主板,该网卡并没有被当时的 Linux 预设核心所支持,所以就得要自己编译核心啦。因为 CentOS 很少更新核心,所以第一次编译完毕之后就忘记有这回事了。等到过了数周有新的核心出现后,鸟哥很开心的自动升级核心, 然后远程进行 reboot ,结果呢?没有网卡驱动程序了啦!我的主机无法联网,得要到主机前用 tty 登入后才能进行编译~唉~

如果你真的很有求知欲,而且该网卡的官网有提供给 Linux 的驱动程序原始码; 或者是你很想要某些官网提供的驱动程序才有的特殊功能;又或者是你真的很不想要再买一张额外的网卡。 此时,就得要重新编译网络卡的驱动程序啰。

Tips: 事实上,如果你要新添购硬件时,请先查阅一下硬件包装上面是否提及支持 Linux 的字样, 因为有些硬件厂商在推出新硬件时,常常会漏掉 Linux 驱动程序的撰写。 如果包装上面有提到支持的话,那么至少你会获得官方网站所提供的驱动程序原始码啊! ^_^

因为我们这里使用的网络卡是 Intel 的 82540EM Gigabit Ethernet 控制芯片,假设你需要的驱动程序得要由 Intel 官网取得最新的版本,而不要使用预设的核心所提供的版本时,那你该如何处理呢?请注意,鸟哥这个小节只是一个范例简介, 不同的厂商推出的驱动程序安装方式都有点不太一样,你得要参考驱动程序的读我档 (READ ME) 或相关档案来安装才行。 此外,如果默认驱动程序已经捉到了网络卡,鸟哥是建议使用预设的驱动程序就好了喔!

另外,由于编译程序需要编译程序以及核心相关信息,因此得要预安装 gcc, make, kernel-header 等软件才行。 但是我们选择的安装模式为『basic server』,这些软件默认都没有安装的,所以你得要先安装这些软件才行。 这些软件可以简单的透过 yum 使用『yum groupinstall 'Development Tools'』来安装,只可惜你并没有网络啊! 所以就得要透过原本光盘一个一个去处理 RPM 属性相依的问题来解决了~很麻烦的~不然的话,就得要透过更改 yum 配置文件,使用本机档案的类型来取得原版光盘的 yum 软件列表啰!鸟哥这里假设你已经安装了所需要的编译程序了, 接下来的动作是:

  1. 取得官方网站的驱动程序:

    再次说明,你可以复制鸟哥的环境,透过 Virtualbox 的模拟而来。我们这里使用的是 Intel 的网卡,你可以到如下的网站去下载:

  2. 解压缩与编译:

    使用 root 的身份进行如下工作吧:

    [root@www ~]# tar -zxvf e1000-8.0.30.tar.gz -C /usr/local/src
    [root@www ~]# cd /usr/local/src/e1000-8.0.30/
    # 此时在该目录下有个 README 的档案,记得看一看,这个档案内会说明很多信息,
    # 包括如何编译,以及这个模块所支持的芯片组哩!
    [root@www e1000-8.0.30]# cd src
    [root@www src]# make install
    

    最后这个模块会被编译完成且安装放置于如下的档名: /lib/modules/$(uname -r)/kernel/drivers/net/e1000/e1000.ko。 接下来我们得要重载这个新的模块才行呦!

  3. 模块之测试与处理

    由于这个模块已经被加载啦,所以我们得要先移除旧的模块后,才能够重载这个模块。使用的方法有点像这样:

    # 1\. 先移除已经加载在内存中的旧模块
    [root@www ~]# rmmod e1000
    # 此时已经捉到的网卡会整个消失不见!因为驱动程序被卸除了嘛!
    
    # 2\. 加载新模块,并且查阅一下有没有捉到正确的版本!
    [root@www ~]# modprobe e1000
    [root@www ~]# modinfo e1000
    filename:       /lib/modules/2.6.32-71.29.1.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
    version:        <u>8.0.30-NAPI</u>  <==就是这里!
    license:        GPL
    description:    Intel(R) PRO/1000 Network Driver
    

    请自行与前一小节比对一下,就会发现真的捉到正确的版本啰!不过,这个模块在下次新的核心推出后就会失效! 为什么呢?因为新核心会给一个新的驱动程序嘛!就不是你现在这个 8.0.30 的版本啰。这点还是要再次说明的。

  4. 设定开机自动启动网络卡模块 (Option)

    如果你在开机就能够正确的取得这个模块的话,那么你的网卡就没有问题啦!这个步骤是可以略过的。如果你的核心还是捉不到网卡, 那你可能得要自己处理一下模块的对应才行。怎么处理呢?很简单,在 /etc/modprobe.d/ 目录下建立一个名为 ether.conf 的档案, 内容将模块与网卡代号链接在一块即可!这样处理:

    [root@www ~]# vim /etc/modprobe.d/ether.conf
    alias eth0 e1000
    alias eth1 e1000  <==因为鸟哥有两张网卡嘛!
    
    [root@www ~]# sync; reboot
    

    为了测试一下刚刚的设定是否会生效,通常鸟哥都会尝试一次重新启动,然后开机完成之后观察一下是否有正确的启动网络卡, 并观察一下模块加载的情况,如果一切都顺利,那就太完美了!

  5. 尝试设定 IP

    等到一切就绪之后,总得试看看这样的网络卡模块是否可以顺利的设定好 IP 吧? 所以我们先手动给他一个私有 IP 看看先:

    [root@www ~]# ifconfig eth0 192.168.1.100
    [root@www ~]# ifconfig
    eth0      Link encap:Ethernet  HWaddr 08:00:27:71:85:BD
              inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
    ....(以下省略)....
    

    嘿嘿!真的设定妥当哩!然后利用 ping 这个指令去 ping 一下网域内的其他计算机, 看看能不能有响应,就知道你的网络卡是否 OK 的啦!通常是没有问题的啦!


4.1.3 Linux 网络相关配置文件案

我们知道 TCP/IP 的重要参数主要是: IP, Netmask, Gateway, DNS IP ,而且千万不要忘记你这部主机也应该要有主机名 (hostname)!此外,我们也知道 IP 的取得有手动设定、DHCP 处理等。那么这些参数主要是写在哪些配置文件?如何对应呢? 底下就让我们来处理一番!

所需网络参数 主要配置文件档名 重要参数
IP Netmask DHCP 与否 Gateway 等 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=网卡的代号 BOOTPROTO=是否使用 dhcp HWADDR=是否加入网卡卡号(MAC) IPADDR=就是IP地址 NETMASK=只网络屏蔽啦 ONBOOT=要不要默认启动此接口 GATEWAY=就是通讯闸啦 NM_CONTROLLED=额外的网管软件 鸟哥建议取消这个项目!
主机名 /etc/sysconfig/network NETWORKING=要不要有网络 NETWORKING_IPV6=支持IPv6否? HOSTNAME=你的主机名
DNS IP /etc/resolv.conf nameserver DNS的IP
私有 IP 对应的主机名 /etc/hosts 私有IP 主机名 别名

你没有看错,主要需要修改的就是这四个档案而已!因此没有很困难!大家都想太多了!详细的设定后续小节再来讲, 这里先有概念即可。除此之外,还有些档案或许你也应该要知道一下比较好呦!

  • /etc/services 这个档案则是记录架构在 TCP/IP 上面的总总协议,包括 http, ftp, ssh, telnet 等等服务所定义的 port number ,都是这个档案所规划出来的。如果你想要自定义一个新的协议与 port 的对应,就得要改这个档案了;

  • /etc/protocols 这个档案则是在定义出 IP 封包协议的相关数据,包括 ICMP/TCP/UDP 这方面的封包协议的定义等。

大概知道上面这几个档案后,未来要修改网络参数时,那就太简单了!至于网络方面的启动指令的话,可以记得几个简单的指令即可喔!

  • /etc/init.d/network restart 这个 script 最重要!因为可以一口气重新启动整个网络的参数! 他会主动的去读取所有的网络配置文件,所以可以很快的恢复系统默认的参数值。

  • ifup eth0 (ifdown eth0) 启动或者是关闭某张网络接口。可以透过这个简单的 script 来处理喔! 这两个 script 会主动到 /etc/sysconfig/network-scripts/ 目录下, 读取适当的配置文件来处理啊! (例如 ifcfg-eth0)。

大概你只要只到这些基本的指令与档案,哈哈!网络参数的设定就太简单啦! 不过,最好你还是要了解 shell script ,比较好!因为可以追踪整个网络的设定条件。 why ?这是因为每个 distributions 的设定数据可能都不太相同,不过却都以 /etc/init.d/network 作为启动的 script , 因此,你只要了解到该档案的内容,很容易就追踪得出来你的配置文件所需要的内容呢!对吧!

另外,新版的 CentOS 6.x 还有额外推出一个名称为 NetworkManager 的软件机制来管理网络, 不过,鸟哥还是比较喜欢手工打造自己的网络环境,所以很建议将该软件关闭呢!还好,我们安装的『basic server (第一章的 1.2.2-2)』 就这么巧的没有安装该软件!好佳在~^_^