详细介绍网络安装 Linux

运维 系统运维
网络安装 Linux 并不是一个新鲜的话题,其过程也不是一个轻松的体验。为了让机器能通过网络来安装 Linux,如果还需要配合 kickstart 来自动化网络来安装 Linux过程的话,用户需要做大量的配置工作。

Linux经过长时间的发展,很多用户对网络安装 Linux概念,我发表一下个人理解出来和大家深入简述一下。但在现实环境下,很多原因会导致我们无法选择安装一个新的 Linux 发行版本文通过将网卡驱动加入到 initrd.img 中,使 Linux 内核在启动的过程中能识别并加载网卡驱动,从而使网络安装得以进行。如果熟悉 Linux 的启动过程和驱动程序,那么要解决本文的问题,基本上有两条路可走。

网络安装 Linux 并不是一个新鲜的话题,其过程也不是一个轻松的体验。为了让机器能通过网络来安装 Linux,如果还需要配合 kickstart 来自动化网络来安装 Linux过程的话,用户需要做大量的配置工作。众所周知,用户需要挑选一台机器作为服务器,然后在这台机器上配置 DHCP, TFTP, NFS/Http/Ftp, pxelinux, kickstart 等一系列的东西。

学习网络安装 Linux时,你可能会遇到XX问题,这里将介绍XX问题的解决方法,在这里拿出来和大家分享一下。但是所有的这一切能成功运作都至少有一个前提条件:我们所网络安装 Linux 能正确的识别并驱动所有客户机的网卡。如果网卡驱动不了,客户机根本无法通过网络从服务器取到所需要的东西,网络安装 Linux 就无从谈起了。

本文通过将网卡驱动加入到 initrd.img 中,使 网络安装 Linux 内核在启动的过程中能正确识别并加载网卡驱动,从而使网络安装得以进行。本文并不讲述网络安装 Linux 的背景知识(如为什么需要网络安装,网络安装的好处等)、具体配置和操作步骤(也就是配置 DHCP,TFTP,pxelinux 等内容)。此外,本文需要读者有熟练的 网络安装 Linux 操作经验和 Shell 编程的基本知识,而且对 Linux 启动过程和驱动程序有基本的了解。
注:所有被安装的机器我们称之为客户机,提供网络安装服务的机器我们称之为服务器

开始之前的建议

建议:如果您碰到了前言中所描述的问题的话,***的解决方法是 – 找一个能驱动客户机网卡的 Linux Distribution,这样能省却很多麻烦。
但在现实环境下,很多原因会导致我们无法选择安装一个新的 Linux 发行版。原因有很多,比如:
客户不同意我们选用其他的 网络安装 Linux 版本,因为客户有大量的应用程序已经在某个Linux 版本上编译,运行良好了,更换 Linux 发行版会带来应用的移植问题
客户拥有一些特殊的硬件,而这些硬件只有基于某个 Linux 发行版的驱动。更换 Linux 发行版,会导致这些硬件无法正常工作
没有一个 Linux 发行版能驱动客户机的网卡。网卡厂商只给我们提供了某个 Linux 发行版上的驱动,一切都要 DIY
您有着强烈的DIY情感,面对问题不是寻求别人的解决方案而是一切都要自己克服 – 毫无疑问,您就是本文最适合的读者

解决思路

如果熟悉 Linux 的启动过程和驱动程序,那么要解决本文的问题,基本上有两条路可走。***就是将网卡驱动编译进内核(静态链接进内核),第二种方法就是将网卡驱动做成模块,然后想办法在网络安装 Linux 启动的时候让 Linux 内核能找到并挂载该驱动。面对这两种方案,第二种方法有更好的可行性和扩展性。因为首先有些网卡驱动本身就不能被静态链接进入内核,而只能被编译成一个模块,例如下文要举的例子 - e1000 网卡驱动;其次,驱动做成模块的方式,可以适应多个内核版本,用方法 1,更换一个内核版本就要重新编译一次内核;***,等会会看到,相比编译内核,方法 2 更简单和可操作。

方法 2 的实现手段就是定制 initrd.img,将我们的网卡驱动加进去。initrd.img 是一个小型的根文件系统,在 Linux 内核没有挂载硬盘上的根分区的时候,initrd.img 将在内存中展开。一般情况下,initrd.img 中将包含一些必需的命令和驱动,如 insmod 命令和磁盘驱动。有了 insmod,才能将磁盘驱动挂载进内核,有了磁盘驱动,内核才能挂载位于磁盘上的根文件系统。

大部分的 Linux 发行版都提供了用于网络安装 Linux 的 initrd.img,一般位于***张安装光盘的 images/pxeboot 目录下。在一台已经装好 Linux 的机器中,在 /boot 目录下我们也能找到 initrd.img,比较一下这两个 initrd.img,会发现 pxeboot 目录下的 initrd.img 会比 /boot 下的大很多,这是因为在网络安装的情况下,Linux 不会尝试去挂载位于磁盘上的根分区(事实上,在没有安装Linux的机器上,此时磁盘中可能什么数据都没有),所以此时的 initrd.img 需要包含大量的驱动,使网络安装 Linux 能识别大量的硬件。位于 /boot 下的 initrd.img,基本上唯一需要的东西就是磁盘驱动,只要内核能访问磁盘,那么其余所需的东西都可以从磁盘取得而不需要依赖 initrd.img。

具体操作和实例

从安装光盘中取得 initrd.img 之后,就可以开始对其进行定制。这里要感谢 Jeremy Mates,他写的 initrd-util.sh 能很好的解开和生成一个 initrd.img。脚本可以在http://sial.org/howto/linux/initrd/initrd-util下载到。
下面我们以RedHat Enterprise Linux Advance Server 4 Update 2 x86_64,Intel e1000网卡驱动为例,讲述具体的操作过程(在本例中,服务器和客户机拥有相同的Intel e1000网卡,而且我们已经手动在服务器上安装完成了正确的e1000驱动):
首先从光盘取到initrd.img,登录到服务器,然后用initrd-util.sh解开:

命令输出 1. 解开initrd.img
[root@ericvm ~]# cd `./initrd-util.sh unpack initrd.img |tail -1`
info: initrd unpack expanded into: /var/tmp/initrd-util.workdir.DA29317
[root@ericvm initrd-util.workdir.DA29317]# pwd
/var/tmp/initrd-util.workdir.DA29317
[root@ericvm initrd-util.workdir.DA29317]# ls
2.6.9-22.EL  bin  dev  etc  linuxrc  lost+found  modules
proc  sbin  selinux  sys  tmp  var

initrd-util.sh很简单,利用gunzip, mount和cpio这些工具将initrd.img解开,其中驱动包位于modules目录下,名为modules.cgz,将这个文件解开后,生成了2.6.9-22.EL目录,进入该目录,就能找到包含在initrd.img中的驱动。本例中,RedHat已经包含了一个e1000的驱动,但是这个驱动不能驱动我们新的Intel e1000网卡。为此,我们在e1000网站下载新版的驱动,然后在服务器上编译完成,生成ko模块文件,然后拷贝到2.6.9-22.EL目录下,覆盖原文件即可。

驱动更新完毕后,现在我们需要将2.6.9-22.EL这个目录重新制作成modules.cgz,这个功能initrd-util.sh不能为我们完成,所以我们手动操作:

命令输出 2. 加入驱动并重新打包
[root@ericvm initrd-util.workdir.DA29317]# find 2.6.9-22.EL | cpio -o -H crc > newmodules
16582 blocks
[root@ericvm initrd-util.workdir.DA29317]# gzip -n -9 newmodules
[root@ericvm initrd-util.workdir.DA29317]# mv newmodules.gz modules
[root@ericvm initrd-util.workdir.DA29317]# cd modules
[root@ericvm modules]# rm -f modules.cgz
[root@ericvm modules]# mv newmodules.gz modules.cgz
[root@ericvm modules]# pwd
/var/tmp/initrd-util.workdir.DA29317/modules

驱动包重新生成了并不意味着Linux就可以识别网卡了,因为网络安装 Linux必须依靠一种逻辑,将硬件设备和驱动模块文件对应起来。这个逻辑就被定义在modules目录下的除modules.cgz之外的文件中:

命令输出 3. 设备驱动识别信息文件
               
[root@ericvm modules]# ls
module-info  modules.cgz  modules.dep  modules.pcimap  modules.usbmap  pci.ids  pcitable

如上所示,pcitable, modules.pcimap中定义了PCI设备和驱动模块之间的对应关系,modules.dep中定义了模块和模块之间的依赖关系(比如,各种SCSI设备都会依赖一个基础的SCSI驱动模块),module-info中定义了驱动的静态描述信息......

要填写这些文本文件,也很简单,首先我们必须要知道这块e1000网卡的PCI设备信息,由于在服务器上e1000这块网卡已经安装完成了,所以我们可以在服务器上取到我们想要的信息:

命令输出 4. 查看网卡硬件信息
[root@ericvm ~]# lspci
............  ignore some outputs
04:00.0 Ethernet controller: Intel Corporation Enterprise Southbridge DPT LAN Copper
04:00.1 Ethernet controller: Intel Corporation Enterprise Southbridge DPT LAN Copper
............  ignore some outputs
lspci列出了服务器上两块网卡的设备信息,根据网卡设备的ID号码(04:00.0, 04:00.1),我们就可以在lspci –n的输出中找到设备的vendor code和device code(请参考lspci的manual了解lspci):

命令输出 5. 查看网卡code
[root@ericvm ~]# lspci –n
............  ignore some outputs
04:00.0 Class 0200: 8086:1096 (rev 01)
04:00.1 Class 0200: 8086:1096 (rev 01)
............  ignore some outputs

在lspci –n的输出中,我们找到了两块网卡的vendor code和device code – 8086和1096。得到了vendor code和device code之后,就可以更新initrd.img中modules目录下的pcitable, modules.pcimap等这些文件了。举例来说,在pcitable中查找e1000,能发现很多设备和e1000这个驱动关联,但是唯独没有8086:1096的组合,这就是为什么Linux无法驱动这块e1000网卡的原因了,我们需要手动将8086, 1096这两个code加入到pcitable中,并将这个设备对应到e1000驱动上。照此方法,更新其余的文件,如module-info, modules.pcimap等。

这样我们就完成了对initrd.img的完全修改,用initrd-util.sh重新将目录打包,生成一个新的initrd.img:

命令输出 6. 重新生成initrd.img
[root@ericvm ~]# ./initrd-util.sh pack /var/tmp/initrd-util.workdir.DA29317/
notice: new initrd size: 6144K
6144+0 records in
6144+0 records out
mke2fs 1.35 (28-Feb-2004)
info: initrd packed into: /var/tmp/initrd-util.initrd-new.IV29439.gz
/var/tmp/initrd-util.initrd-new.IV29439.gz
[root@ericvm ~]# ls -lh /var/tmp
total 3.7M
-rw-r--r--   1 root root 3.7M Jun 20 17:10 initrd-util.initrd-new.IV29439.gz
drwxr-xr-x  12 root root 4.0K Jun 20 17:10 initrd-util.workdir.DA29317
drwxr-xr-x  13 root root 4.0K Jun 20 15:53 initrd-util.workdir.ID29288

initrd-util.sh首先创建一个“空洞文件”,然后在这个文件中建立ext2 文件系统,然后将这个文件mount到一个目录中,***用rsync这种方式将我们更新过的文件“拷贝”到了mount的目录下,这样“空洞”文件中就有了内容,***对文件进行压缩,生成最终的img文件。

将/var/tmp/initrd-util.initrd-new.IV29439.gz改名成initrd.img,放到tftp配置的目录下,就可以让客户机在网络启动的时候取到新的initrd.img了,从而识别网卡开始网络安装 Linux。

【编辑推荐】

  1. 三大***Linux发行版 今天你用了吗?
  2. 对Linux操作系统的内核系统概述
  3. 介绍Linux硬盘系统建立分区步骤挂载
  4. 讲述Linux系统挂载分区的使用
  5. 阐述Linux操作系统特权帐号与普通帐号的区别
责任编辑:佚名 来源: CSDN
相关推荐

2010-03-02 14:35:58

linux文本环境安装

2010-03-02 15:29:11

Linux图形软件安装

2010-06-21 16:57:11

Linux Arch

2009-12-30 17:25:34

Linux Ubunt

2009-12-21 13:37:00

Linux系统安装

2010-03-03 09:57:37

Linux虚拟机

2010-03-04 15:37:17

Linux优盘引导安装

2009-12-24 16:47:22

Linux安装Perl

2009-12-25 14:24:59

Linux指令od

2009-12-11 15:59:00

Linux grep指

2010-01-05 16:56:28

2010-06-23 15:36:23

Linux Bug B

2010-06-22 09:28:31

Linux at命令

2010-06-18 17:35:16

Linux Anacr

2010-03-04 15:20:30

Linux优盘引导安装

2010-03-11 09:20:54

Ubuntu网络配置

2010-03-10 11:04:30

Linux时间转化方法

2009-12-24 10:04:38

Linux进行C编译

2010-03-09 09:55:14

Linux mount

2010-03-10 18:29:41

点赞
收藏

51CTO技术栈公众号