系统裁剪 网络安装

项目基本结束,这个是其中系统裁减的一个总结文档,不知道有没有人感兴趣:)

=============================================

前言:
为了完成用户的需求,需制作一个完整的环境供AP运行,且存在一些约束条件。

关键字:
DOM Kernel Busybox X-Window Window-Manager Interbase nvidia cutdown

目标说明:
在一个64M的DOM(Disk on module)上建立可以运行完整的AP的环境

约束条件:
1、可利用的总空间为64M,由DOM提供,但实际可用空间只有53-59M,原因可能与设备文件和DOM本身有关,未确定
2、显卡为nvidia系列
3、kernel选用2.4.20,没有使用redhat自带的版本。采集卡的Driver目前还只能在2.4.20的kernel下编译,由于其移植性较差,已经开始考虑重新整理成可适合kernelversion大于2.4.25的所有kernel,参考bttv的最新实现
4、数据库选用interbase系列,目前使用的为firebird-1.5(firebird为interbase的开源实现,接口和interbase基本相同)。
5、其他附属的功能要求,在后面的文档中会有说明

制作流程:
某些部分的原理和实现没有办法写的很全面,但基本上会提供一些url的连接,供相关人员参考。基本上按照制作流程来写,前后相互牵连的部分不做特别说明。

一、Kernel的选择和编译:
由于driver的缘故,只能使用2.4.20的kernel。2.4.20和2.4.25都有对Driver做过尝试,其他版本的kernel没有试过,应该是可以的,尚未确认。在2.6的kernel上无法编译,目前确定的原因是makefile有问题,估计做一些相应的修改还是可以的,可参考bttv的makefile(http://linux.bytesex.org/v4l2/bttv.html)。
回到kernel上来,基本上的编译原则是尽量减去不需要的部分,以及除了一些需要临时加载的Driver尽量不要出现module。由于上面所说的理由,DOM中使用的kernel为原始的2.4.20,可以从http://www.kernel.org下载,本文档的附加文件里也可以找到。
另外,由于需求的定义,系统启动时需要显示splash画面,所以kernel还需要加入bootsplash功能,这个功能是第三方提供的,作为补丁加入kernel。作法如下:

1、打内核补丁并编译内核
假设内核源文件安装在/usr/src/linux/。下载bootsplash 3.07(地址:ftp://ftp.suse.com),然后:

yourbox:~ # cd /usr/src/linux
yourbox:/usr/src/linux # patch -p1 < /path/to/bootsplash-3.0.7-2.4.20-vanilla.diff
yourbox:/usr/src/linux #

配置内核,如make menuconfig或make xconfig,在”Console drivers” -> “Frame-Buffer support” 选择 “VESA VGA graphics console” 或其他与你的显卡相应的驱动。打开 “Use splash screen instead of boot logo”. 在 “Block Devices”中打开”Initial Ramdisk support”,保存配置并编译内核,将生成的内核拷到/boot 下,并修改lilo或grub的配置文件以使用新的内核来启动。

2、加入图片
下载并安装splash工具:ftp://ftp.suse.com/pub/people/

# cd ~/splash
# tar xvjf splashutils.tar.bz2
splashutils/
splashutils/Makefile
splashutils/splash.c
[..]
splashutils/ChangeLog
splashutils/COPYING
# cd splashutils
# make splash
gcc -Os -Wall -c -o splash.o splash.c gcc -Os -Wall -o splash splash.o
strip splash
# cp splash /sbin/
# cd ..

将图片及相关的信息加入到initrd中去:
/sbin/splash -s -f /etc/bootsplash/themes/yourtheme/config/bootsplash-1024x768.cfg >> /boot/initrd.splash

图片在附件文件中

3、运行lilo更新配置文件(grub就不用更新了),重新启动,如果一切正常,就可以看到启动画面了。同时会有这样一些信息:

vesafb: framebuffer at 0xf0000000, mapped to 0xdc816000, size 65472k vesafb: mode is 1024x768x16, linelength=2048, pages=41 vesafb: protected mode interface info at c000:5137 vesafb: scrolling: redraw
vesafb: directcolor: size=0:5:6:5, shift=0:11:5:0 Looking for splash picture.... silenjpeg size 11165 bytes, found (1024x768, 4912 bytes, v3) Got silent jpeg.

kernel的config文件比较大,在附件中有,这里就不列举了。

编译过程:
1、获取2.4.20的原始kernel压缩包(linux-2.4.20.tar.bz2)
2、tar xvjpf linux-2.4.20.tar.bz2
3、cp config-2.4.20 (kernelsource)/.config #拷贝config-2.4.20到kernel source所在目录中并以.config为新的文件名
4、cd (kernelsource)
5、make menuconfig #不需要做任何改动,直接退出
6、make dep && make bzImage && make modules && make modules_install && make install
7、如果没有问题,继续下一步,如果有问题,请检查编译环境是否正确,并重复step 6
8、此时kernel已经编译完毕,需要做两件事情,一是保存将来放入DOM的文件,二是将当前的发行版的kernel换成2.4.20,以便后面的nvidia显卡dirver的正确编译。
9、创建一个保存目录,比如~/kernelbackup
10、cp (kernelsource)/arch/i386/boot/bzImage ~/kernelbackup # 保存kernel
11、cp /lib/modules/2.4.20 ~/kernelbackup/ -arf # 保存编译出的所有modules
12、如果当前的发行版使用的是grub,则修改/boot/grub/grub.conf(如果没有这个文件可以修改/boot/grub/menu.lst,都是一样的),如果是lilo,修改/etc/lilo.conf。下面是grub的修改说明,lilo的修改办法可以参考相关文档:

# add below to your grub.conf
title new kernel(2.4.20) # title just, u can modify it anywhere
root (hd0,0) # root setup
kernel (hd0,0)/boot/bzImage-2.4.20 ro root=/dev/hda1 vga=791 splash=silent # just.....
initrd (hd0,0)/boot/initrd.splash # splash that show when booting of OS

13、reboot
14、选择新的启动选项,检查是否正确

二、Shell的选择和编译:
到目前为止,kernel的裁减基本上结束,下面是shell的选择和编译。对于linux而言,kernel只是提供系统调用接口,本身无法直接使用,需要外部shell的支持。一般shell有几种选择,如bash、ash、busybox等,由于busybox相对尺寸最小,而且提供了基本完整的功能,所以选择busybox做为系统的shell。详细信息参阅www.busybox.net,附件中有目前使用的busybox版本。busybox的流程主要是编译和安装,从而联合kernel组成一个基本系统。 busybox的配置文件在附件中有,这里就不列举了。

编译过程:
和kernel基本相似
1、解压busybox
2、复制config到busybox源码目录下
3、make menuconfig #不做改动即可退出
4、make dep && make

三、基本系统的安装:
到此时,busybox和kernel都已经准备完毕,接下来需要一个分区来安装他们。不管是使用一个单独的分区还是完整的DOM都可以,但总归需要一个完整的目标分区供使用。假设目标分区为/dev/hdc1,下面的说明会以此为基准。需要说明的一点是,一开始尽量不要用DOM直接调试,因为其速度和容量都十分的不好,会造成调试的困难,直到调试后期再使用是个比较不错的主意。

现在进入基本系统的组装:
# fdisk /dev/hdc1 and format it with ext2 or ext3. My suggest is ext3.
Mount /dev/hdc1 /mnt/dom # mount目标分区
mkdir /mnt/dom/boot
mkdir /mnt/dom/boot/grub
cp (kernelbackup)/bzImage /mnt/dom/boot # copy kernel to dom
cp (kernelbackup)/initrd.splash /mnt/dom/boot # copy initrd splash to dom
mkdir /mnt/dom/lib
mkdir /mnt/dom/lib/modules
cp (kernelbackup)/2.4.20 /mnt/dom/lib/modules -arf # copy all modules to dom cd (busyboxpath)
make PREFIX=/mnt/dom install # install busybox to dom
现在,一个基本系统基本安装完毕,接下来是配置问题:
mkdir /mnt/dom/etc # all config here
mkdir /mnt/dom/dev # device file
mkdir /mnt/dom/mnt
mkdir /mnt/dom/proc
mkdir /mnt/dom/tmp
mkdir /mnt/dom/var
mkdir /mnt/dom/lib
mkdir /mnt/dom/root # home of root
mkdir /mnt/dom/usr # X window-manager lib, etc
cp (busyboxpath)/examples/bootfloppy/etc/* /mnt/dom/etc -arf # base config
cp /dev/* /mnt/dom/dev -arf # device file. Will cutdown part of all

下面是加入必需的连接库:
1、ldd busybox
2、查看busybox使用了哪些连接库,拷贝至目标分区中同样的路径下,一般为/lib
3、再用ldd查看连接库是否还有需要的库文件,如果有同样拷贝到目标分区中
4、重复第三步
5、cp /dev/* /mnt/dom/dev/ -arf # 后期还会做一些裁减
Grub配置:
# add below to your grub.conf
title new kernel(2.4.20) # title just, u can modify it anywhere
root (hd0,0) # root setup
kernel (hd0,0)/boot/bzImage-2.4.20 ro root=/dev/hda1 vga=791 splash=silent # just.....
initrd (hd0,0)/boot/initrd.splash # splash that show when booting of OS

现在可以做一些测试,看看基本系统是否工作正常。执行下面的命令
cd /mnt
mkdir dom
mount /dev/hdc1 dom # mount it
chroot /mnt/dom /bin/sh
如果你看到登陆成功的信息就表示基本系统没有什么问题了。

重新启动机器,并选择新的启动选项,看看基本系统是否正常,如果有问题,重新检查前面的步骤是否做的有问题。如果启动正常,那么,基本系统就基本完备,可以继续后面的步骤了。

四、Xfree86的裁减和安装:
基本系统已经正常工作,接下来就是xfree86的裁减和安装,首先切换到目标分区并确定系统处于正常工作状态。
在这里需要说明一下Linux的目录分布和作用情况。首先通过“ls /”列举一下根分区,大致会有以下目录:
bin boot dev etc home lib mnt opt proc root sbin tmp usr var
下面逐一说明:
bin: shell的工作目录,比如sh、bash、mount等命令
boot: kernel、ramdisk文件以及grub(lilo)的存放目录,有的发行版会为此目录单独创建一个分区,以防止系统崩溃的影响。在DOM中是不考虑的。
dev: 所有的设备文件都存放在这里,比如/dev/video0、/dev/hda等。全部设备文件大概要占用400K左右的空间,但似乎全部拷贝过来的话,DOM总是会报空间不足,但实际还是有空间的,原因不明。目前的做法是对设备文件做了一些调整,去除了不需要的部分,参考后面的文件列表。
etc: Ap配置以及系统配置存放目录
home:普通用户的工作目录根
lib:基本库存放目录
mnt:mount
opt:看情形,目前是用做存放firebird
proc:系统工作所需的目录
root:一般为root的工作目录,可以调换
sbin:常规命令存放目录
tmp:一般为临时目录
usr:所有扩展命令和xfree86,以及window-manager所在目录,是系统最大的一个目录,包含内容最多。对于DOM来说,主要是存放连接库、xfree86、字体、window-manager等。
Var:临时目录,一般在发行版中为存放website文件、安装文件以及一些log信息等,在DOM中只作为临时目录使用

大致的分布情况说明完毕,接下来就是具体的裁减工作了。实际上,xfree86有一些替代实现,比如freedesktop、fb等,甚至framebuffer也是一个可以考虑的方向,但是由于AP使用了nvidia显卡提供的opengl 1.3接口,导致目前的唯一选择就是xfree86。也许有其他更小的实现,希望能在以后改进。进入正题,xfree86的主程序实际上就是一个XFree86,位于/usr/X11R6/bin,有的发行版下X是一个指向XFree86的连接,有的却是一个完整的程序,但不管怎么样,Xfree86就是最主要的程序。现在,在目标分区上mount发行版,以便可以拷贝我们所需要的:
cd /mnt
mkdir dist # create mount path of distribute
mount /dev/hda1 dist # /dev/hda1 is root partition of your distribute. Check it.
现在/mnt/dist就是发行版所在的位置。

mkdir /usr/X11R6
mkdir /usr/X11R6/bin
mkdir /usr/lib
mkdir /usr/X11R6/lib
创建一些需要的目录。

cp /mnt/dist/usr/X11R6/bin/XFree86 /usr/X11R6/bin -arf 拷贝xfree86的主程序。
cp /mnt/dist/usr/bin/ldd /sbin # copy ldd that is used to cutdown
ldd是用来在DOM的环境中做裁减工作的,直接输入ldd看看是否可以运行,如果执行有问题,一般是相关的连接库不全,按照之前的方法复制过来就可以了。

现在,要查看XFree86需要哪些连接库和配置文件,以保证其可以运行起来。
cd /usr/X11R6/bin
ldd Xfree86
此时会看到很多的连接库,那么就需要把这些库全部从发行版上复制过来,可以直接复制到相对应的目录下,比如/usr/lib/或者/usr/X11R6/lib/下,需要注意的一点是,有些库本身还会需要其他的库,可以一层层的ldd出来,网络中有人做过自动工作的工具,但还是手动裁减比较可靠。全部的库导入完毕后,尝试运行/usr/X11R6/bin/XFree86,会看到一些出错信息,提示/etc/X11/XF86Config不存在,那么就将发行版中的/etc/X11目录全部复制到目标分区中:
cp /mnt/dist/etc/X11 /etc -arf
实际上这个目录中不是全部都需要的,某些部分是可以删除的,但我没有具体实验,而且尺寸并不是很大,就全部使用了。
现在再执行/usr/X11R6/bin/XFree86,会提示一些库没有找到,但实际上之前已经全部复制过来了,原因是从shell执行一条命令的时候,命令所需要的库是从以下的途径得到的:
1、搜索/lib
2、搜索/etc/ld.so.cache
之前所复制的库文件大半是放在/usr/lib和/usr/X11R6/lib下的,而且现在的/etc下还没有ld.so.cache文件,要生成这个文件就需要ldconfig这个命令:
cp /mnt/dist/sbin/ldconfig /sbin -arf
现在ldconfig是有了,但还需要与之有关的配置文件/etc/ld.so.conf,所以:
vi /etc/ld.so.conf
/usr/lib
/usr/X11R6/lib
现在执行ldconfig,就会在/etc/下出现一个ld.so.cache。以后如果有新加入的库文件,而且不是存放在/lib/下的,都按照这个步骤来导入。现在,执行/usr/X11R6/bin/XFree86,出现的错误提示为无法打开/var/kdb和/var/log。
这里需要说明配置上的一个修改,cat /etc/fstab,会看到现在的fstab只有一句话:
none /proc proc defaults 0 0
现在要加入一些新的配置,新的fstab如下:
proc /proc proc defaults 0 0
none /var tmpfs defaults 0 0
none /tmp tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /data tmpfs defaults 0 0
现在/var、/tmp和/data都是在内存中了,其中/data是将来mount磁盘的地方,需要手动mkdir出来:
mkdir /data
现在修改/etc/init.d/rcS:
#! /bin/sh

/bin/mount -a

mkdir /var/log
mkdir /var/lib
mkdir /var/lib/xkb

重启DOM,现在应该存在/var/log、/var/lib、/var/xkb目录了,当然这些目录只是存放在内存中,所以需要每次启动时临时创建。
再运行XFree86,应该会看到一个错误的提示,说明还需要opengl的一些连接库,从发行版中复制出来就可以了。
尝试在目标分区中执行/usr/X11R6/bin/XFree86,如果没有进入X界面,需要检查之前的步骤是否有没有做对的地方。

五、Window-Manager的选择安装:
到目前为止,X已经完全移植到DOM中了,但一个包含基本系统和X的系统还不能满足AP的要求,接下来是Window-manager的选择和安装。
kde和gnome是无法安装到DOM中的,尺寸太大,可能的选择包括twm、fluxbox、windowmaker、icewm等,但需要满足以下几个条件:
1、有caption,而且Modal dialog不能被切到后台,以符合用户的操作习惯
2、X上不能有任何多余的部分,即除了AP,不存在任何UI,如taskbar之类
3、尺寸要小
4、最好不要有system menu和system buttons

经过挑选,最终选择了fluxbox作为DOM的window-manager,尺寸相对其他window manager要大一些(10M),但是较好的满足了以上条件。

安装过程:
1、下载fluxbox
2、./configure
3、make
4、make install
5、复制相关文件到DOM的相同目录中
6、测试,如果有问题,重复第一步
等window manager安装完毕后,一个包含基本系统和window的环境就创建成功了。接下来就是一些附属部件的裁减和安装了。

六、其他部件的裁减和安装:
先切换到发行版。最后定义的数据库引擎为Firebird 1.5,所以先下载firebird 1.5(http://prdownloads.sourceforge.net/f...-0.i686.tar.gz),然后在发行版上先安装。firebird会安装在/opt目录下,将/opt/firebird复制到目标分区中:
cp /opt/firebird /mnt/dom/opt -arf

然后修改配置文件:
vi /mnt/dom/etc/init.d/rcS
#! /bin/sh

/bin/mount -a

mkdir /var/log
mkdir /var/lib
mkdir /var/lib/xkb

/opt/firebird/bin/fb_lock_mgr &
/opt/firebird/bin/fb_inet_server &

现在切换到目标分区中,会看到进程列表中有一个fb_lock_mgr,这说明firebird已经安装成功。

由于实际的裁减过程中会遇到各种各样的问题,有些方面牵涉太广,以至没有办法单独说明,所以接下来是一些可能会遇到的问题说明:
1、nvidia的驱动需要先在发行版上解开,再执行make && make install > install,然后修改install中的目标路径以将相关文件安装到DOM上,比如cp libGL.so /usr/lib改为cp libGL.so /mnt/dom/usr/lib。具体操作就不列举了。
2、busybox的mount有问题,不能mount -o loop,所以cramfs的文件需要用发行版的mount,所以在dom的/mnt/cramfs目录下有一个mount,而/bin也有一个mount
3、为了便于调试,在dom中加入了telnet server和ftp client,分别使用的是utelnetd和cmdftp,出处可以通过google搜索
4、grub的安装使用grub-install即可
5、由于firebird等模块至少需要一个root用户,而busybox缺省是没有用户的,所以需要在/etc下复制两个文件:shadow和passwd
6、dhcp client使用的是udhcpc
7、字体主要和以下目录有关:/usr/lib/gconv、/usr/lib/locale、/usr/X11R6/lib/X11/font和/usr/X11R6/lib/X11/locale(限于redhat,其他发行版会有一些差异,但具体内容是一样的)
8、硬件自检使用的是hwsetup,并对源代码做过一些修改,只保留了audio和network card的检测,在附件里有原始和修改过的两个版本,可以对比参考
9、web site功能是用kylix自己实现的,没有使用apache
10、由于dom的空间不足以摊平所有文件,所以/usr下面的文件全部都是以一个cramfs文件的格式出现的,参看后面的文件列表。

七、DOM的最后安装和打包:
cramfs文件的创建:
1、确定目标分区的可运行
2、确定/mnt/dom/usr/目录下的文件完整性
3、mkcramfs /mnt/usr.cramfs /mnt/dom/usr # make a cramfs file of usr path
4、保存/mnt/dom下的完整列表,以备将来的修改
5、rm /mnt/dom/usr/* -rf
6、mkdir /mnt/dom/mnt/cramfs
7、cp /mnt/usr.cramfs /mnt/dom/mnt/cramfs
8、cp /bin/mount /mnt/dom/mnt/cramfs -arf
9、add /mnt/dom/etc/init.d/rcS:/mnt/cramfs/mount -o loop -t cramfs /mnt/cramfs/usr.cramfs /usr

现在,/mnt/dom目录下就已经是一个除了grub全部都是完整的DOM镜像了。那么最后要将这个镜像导入真实的DOM之中:
mkdir /mnt/realdom
mount /dev/hdc1 /mnt/realdom # assume /dev/hdc1 is real dom
cp /mnt/dom/* /mnt/realdom/ -arf
sync
此时DOM中已经有了一个完整的镜像,但还没有grub,那么执行:
grub-install /dev/hdc1
重新启动,并在BOIS中选择真正的DOM,确认DOM的启动没有问题。重新切换到发行版,开始做DOM的镜像文件:
dd if=/dev/hdc of=domfs # domfs is image of dom
保存好这个名字为domfs的镜像文件,这就是一个可安装的包,安装到其他DOM中时,输入:
dd if=domfs of=/dev/hdc
到目前为止,所有的流程都走了一遍,剩下的就是不断的实践和验证了。

后记:
经过一次完整的裁减过程,很自然的对Linux的整体结构和方式有了很清晰的了解,虽然不能对kernel有深入了解,但是起码为以后kernel方面的学习打下了很好的基础。由于牵涉方面比较多和杂,有些部分只能是实践过后才能知道其中的诀窍,当然大体的过程是一样的。







系统裁减工具,实际上没有什么特别的地方!
通常情况下的裁减,所作的工作就是对文件系统各个功能包的倚赖建立正确的关系.根据具体的需要,调出需要包组合在一起就可以了.这些工作,手工当然可以作,但是效率很低下.写成脚本文件,或则作一个图形的界面,使用起来的确要方便得多.作这个工作的难点就在于,如何建立有效倚赖关系.不同的应用要求,它们的需求不同.建立一个最优关系就是一个关键.这个大家都明白,这些都是从项目中慢慢积累起来的.然后逐步完善这套工具.
这套工具完成起来不困难,对Linux系统比较熟悉的人,有过项目经验,用不了多长时间.
这样看来,这套工具的实际意义也没有上面提到的那么伟大.
实际上真正有价值的地方不是上面所讲的.有价值的是工具所管理的内容.Linux是一个完全open source的东西.我们需要的东西都可以从网上down下来,自己组合来适合我们自己的需要.问题在于,这些现成的东西并没有进行任何的优化,没有一个严格的性能标准.所以目前国内大多数的linux产品都给人一种不完美的感觉.原因就是很多的公司没有在上面作出优化进行测试,甚至有时候基本功能都不正确就到处吹嘘.
如果管理工具是管理的是自己经过优化的东西,那么这套管理工具就的确是非常价值了.如果管理的东西没有任何优化,还是网上的"原装",那么我不认为管理工具的价值可以达到所谓的 X万元.

我见过作得不错的是Redsonic的RedBuilder,这是一个完全的集成开发工具平台.有自己优化的内核,等等.他的整个一套东西一就不过几万.当然,其它的公司也有自己的东西.
如果只是一个简单的管理工具,需要X万,实在是不值.
而且据我所知,网上有一个免费的系统裁减工具:
http://www.embeddedlinuxinterfacing.com/chapters/04/buildrootfilesystem
大家有兴趣可以去拿来用用.
 
 
mkEmbox裁剪工具的用途和优点

1、定制自己的linux系统:
现在的linux版本越来越大,动则几个GB,绝大多数软件跟本用不上,用裁剪工具,三下五除二,全载掉,只留自己看着顺眼的。
2、研究如何裁剪linux系统:
业余爱好者可以上手就成功裁剪出嵌入式linux系统,裁剪成功后再慢慢研究其中的奥秘。省的了看了很多文档,左试右试,还不知从哪下手。
3、软件硬化:
你写的软件,人家可能认为它不值钱,把它封到一个盒子里,做成硬件,买的人觉得物有所值,而且耐用,也好维护。软件由软变硬的过程交给mkEmbox,轻而易举。
4、嵌入式系统研发的得力助手:
做过嵌入式linux系统的人都知道,系统得不断的测试,调整,大部分是枯燥、耗时间的体力劳动。让软件来记录、跟踪这些变化,重复原来手工做的劳动,把你从数字奴隶的状态解脱出来,可以把更多的精为放在方案设计、系统优化上和调整上,你会觉得它是一个让你省时省力的助手。别人接手项目时,你积累经验可以通过它立即继承。
mkEmbox裁剪工具即是省时省力的机器,又是活文档。
 
 
 
 
 
 
 
 
如何让无盘工作站 从网络启动
2009-06-18 17:57
第一步:进入CMOS(以AWARD的BIOS为例)在Adwanced BIOS Features将First Boot Device项设为LAN( 简称局域网)。保存BIOS设置,并重启。

第二步:启动时按住Shift+F10组合键,将会出现网卡启动芯片的配置菜单
            第三步:用键盘的上下键选取“Network Boot Protocol”项,再用空格键将该项设为PXE。

(PXE解释(preboot execute environment)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持来自网络的操作系统的启动过程,其启动过程中,终端要求服务器分配IP地址,再用TFTPtrivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中并执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统,如:Windows 95/98/2000/xp/2003/vista/2008,linux等。

PXE最直接的表现是,在网络环境下工作站可以省去硬盘,但又不是通常所说的无盘站的概念,因为使用该技术的PC在网络方式下的运行速度要比有盘PC3倍以上。当然使用PXEPC也不是传统意义上的TERMINAL终端,因为使用了PXEPC并不消耗服务器的CPURAM等资源,故服务器的硬件要求极低。)
  第四步:选取“Boot Order”,将该项设为“Int 19h(表示网卡配置菜单中的启动顺序Boot ROM优先)”或“Int 18h”。
  第五步:按照提示,按F4键进入保存设置。
      如果在将带有BOOTROM芯片的网卡插入PCI插槽,并且设定好CMOS设置后重启计算机,发现未能出现第二步的信息,则有可能网卡硬件中的BOOT ROOM SIZE参数未正确设置,可以按如下方法来设置(以RTL8139网卡为例)- - -

      我们可用随网卡提供的驱动软盘中的Rset8139.exe软件来进行设置,使用其软件还可对网卡的其它参数进行设置,并保存在网卡的存储芯片中(即网卡上的93C46串行芯片);这样无论网卡插到任何主板上,都可按串行芯片中的参数进行工作。
        8139系列网卡的设置程序在驱动盘中可以找到,也可从网站下载最新5.03版本。
        Rset8139.exe程序可在DOS和WIN环境下直接运行,但系统中必须有一块8139芯片组网卡(单网卡),否则程序将提示没有找到网卡,而且出错停止运行;运行Rset8139.exe,在信息界面中按提示键入空格键进入程序主界面。
      
      主菜单:
      选择项一、显示网卡当前参数信息   

 

   选择项二、设置网卡参数
      选择项三、运行诊断程序                   

选择项四、退出设置程序
        使用光标键上下移动光标条,选择第一项回车,即可显示网卡当前的设置工作参数。
        信息分别为:网卡的ID(即卡号)、传输速度、传输模式、输入输出地址(I/O)、中断值、网卡BootRom(芯片容量)等信息(如下图所示):
 
        按“ESC”键返回程序主界面,选择进入第二项,在此即是我们可以修改的一些配置参数,(如下图所示):
 
        将光标条移到“BootRomSize”,回车,在弹出的选择菜单中选择disable bootrom,如选择enable bootrom,则又一选择菜单弹出,(如下图所示:)
 
        在此你可按需要使用的网卡启动芯片的容量来进行选择(因为BIOS文件的容量是按字节显示的,因此32KB的文件,需要使用256Kb的芯片,1KB=8Kb),如果不是很清楚那最好时选择128KB这项。(如下图所示:)
 
        正确选择后按回车键确认,按“ESC”返回主界面;其中我们还可以设置Wake ON LAN,即是否启用网卡远程唤醒功能(当然还需要与主板设置配合使用,但如此选项是关闭的,你是无法使用网卡唤醒功能的);确定无误后即可保存退出设置程序。  

 
 
 
 

        经过以上设置,看一下,是否可以使用其BOOT启动芯片了,自行修改的还原卡也可正常引导了。
        目前几乎所有的网卡都有些配置程序的,而且功能也尽不相同;不过,不同的网卡只能使用其对应的设置程序的。

 

 

 
 
 
 
 
 
http://sourceforge.net/
 
 
 
 
 
 
 
利用TFTP DHCP PXE 自架Linux 网络(自动)安装服务器
??自动获取IP网络(自动)安装Red Hat Enterprise Linux 4.0的服务器架设实例
   实现自动获取IP网络安装linux是这样的:客启端PXE网卡启动??>通过Bootp协议??>DHCP服务器??>获得IP??>从TFTP上下载 pxelinux.0及系统内核文件vmlinuz、initrd.img??>启动系统??>(到指定地点去下载ks.cfg文件??>根据ks.cfg文件去NFS/HTTP/FTP服务器自动)下载RPM包及安装系统??>完成安装。
注意:以下的所有试验都是在WinXP SP2下的VMWare5.5.1中完全安装的RHEL AS4中实现的。实现基本步骤如下:      
         步骤1:
1)把ISO文件或系统安装光盘挂载到一个目录
[root@rhel]#mkdir /media/rhel4
[root@rhel]#mount -o loop,ro /root/RHEL4.iso /media/rhel4    #挂载ISO文件
[root@rhel]#mount -o loop,ro /dev/cdrom /media/rhel4        #挂载光盘
    2)8. 如果在开机时自动加载,可在/etc/fstab加一行:
[root@rhel]#vi /etc/fstab
/root/RHEL4.iso   /media/rhel4 nfs intr
3)挂载ISO后,把isolinux目录下的initrd.img、vmlinuz都复制到/tftpboot/linux-install/下:
[root@rhel]#cp /media/rhel4/isolinux/initrd.img /tftpboot/linux-install/
[root@rhel]#cp /media/rhel4/isolinux/vmlinuz /tftpboot/linux-install/
4)如果没有RHEL AS 4的ISO文件,能建立一个共享目录(如:rhel)把RHEL的第一张光盘所有内容复制到这个目录下,然后把第二、三、四张光盘的RPMS目录下的rpm包都复制到/rhel/RedHat/RPMS目录下,并开启NFS服务。把上面的的挂载目录/media/rhel4/改为建立的rhel目录即可,其他操作同上。
   步骤2:
1)安装DHCP服务器包(使用RPM包安装DHCP)。
[root@rhel]#cd /rhel/RedHat/RPMS/
[root@rhel]#rpm ?ivh dhcp-3.0p12-6.14.i386.rpm
[root@rhel]#rpm ?ivh dhcp-devel-3.0p12-6.14.i386.rpm
[root@rhel]#rpm ?ivh dhclient -3.0p12-6.14.i386.rpm
2) 设置DHCP服务器,。/etc/dhcpd.conf通常包括三部分:parameters、declarations 、option。
DHCP设置文件中的parameters(参数):
ddns-update-style 设置DHCP-DNS 互动更新模式。
default-lease-time 指定确省租用时间的长度,单位是秒。
max-lease-time 指定最大租用时间长度,单位是秒。
hardware 指定网卡接口类型和MAC地址。
server-name 通知DHCP客户服务器名称。
get-lease-hostnames flag 检查客户端使用的IP地址。
fixed-address ip 分配给客户端一个固定的地址。
authritative 拒绝不正确的IP地址的需求。
    DHCP设置文件中的declarations (声明):
shared-network 用来告知是否一些子网络分享相同网络。
subnet 描述一个IP地址是否属于该子网。
range 起始IP 终止IP 提供动态分配IP 的范围。
host 主机名称 参考特别的主机。
group 为一组参数提供声明。
allow unknown-clients ?deny unknown-client 是否动态分配IP给未知的使用者。
allow bootp;deny bootp 是否响应激活查询。
allow booting?deny booting 是否响应使用者查询。
filename 开始启动文件的名称,应用于无盘工作站。
next-server 设置服务器从引导文件中装如主机名,应用于无盘工作站。
    DHCP设置文件中的option(选项):
subnet-mask 为客户端设定子网掩码。
domain-name 为客户端指明DNS名字。
domain-name-servers 为客户端指明DNS服务器IP地址。
host-name 为客户端指定主机名称。
routers 为客户端设定默认网关。
broadcast-address 为客户端设定广播地址。
ntp-server 为客户端设定网络时间服务器IP地址。
time-offset 为客户端设定和格林威治时间的偏移时间,单位是秒。
注意:如果客户端使用的是视窗操作系统,不要选择“host-name”选项,即不要为其指定主机名称。
    运行DHCP服务器还需要一个名为 dhcpd.leases 的文件,保持所有已分发出去的 IP 地址。在Redhat Linux 发行版本中,该文件位于 /var/lib/dhcp/ 目录中。如果你通过 RPM 安装 ISC DHCP,那么该目录应该已存在。dhcpd.leases的文件格式为:
Leases address {statement}
    典型的文件内容如下:
lease 192.168.1.255 { #DHCP服务器分配的IP地址#
starts 1 2005/05/02 03:02:26; # lease 开始租约时间#
ends 1 2005/05/02 09:02:26; # lease 结束租约时间#
binding state active;
next binding state free;
hardware ethernet 00:00:e8:a0:25:86; #客户机网卡MAC地址#
uid "\001\000\000\350\240%\206"; #用来验证客户机的UID标示#
client-hostname "cjh1"; #客户机名称#
}
    注意lease 开始租约时间和lease 结束租约时间是格林威治标准时间(GMT),不是本地时间。
    第一次运行DHCP服务器时dhcpd.leases是个空文件,也不用手工建立。如果不是通过 RPM 安装 ISC DHCP,或 dhcpd 已安装,那么你应该试着确定 dhcpd 将其 lease 文件写到何处,并确保该文件存在。也能手工建立一个空文件:
[root@rhel]#touch /var/lib/dhcp/dhcpd.leases
编辑DHCP服务器设置文件,这里是个示例:
[root@rhel]#vi /etc/dhcp.conf
#全局设置
                  ddns-update-style interim;
                   ignore client-updates;
                   allow booting;
                   allow bootp;
#子网的(多)作用域
                   subnet 192.168.1.0 netmask 255.255.255.0 {
                        option routers                  192.168.1.1;
                        option subnet-mask              255.255.255.0;
                        option nis-domain               "domain.org";
                        option domain-name             "domain.org";
                        option domain-name-servers      192.168.1.1;
                        filename "/linux-install/pxelinux.0";
                        range dynamic-bootp 192.168.1.50 192.168.1.100;
                       default-lease-time 21600;
                            max-lease-time 43200;
                            subnet 192.168.1.0 netmask 255.255.255.0 {
                        option routers                  192.168.1.1;
                        option subnet-mask              255.255.255.0;
                        option nis-domain               "domain.org";
                        option domain-name             "domain.org";
                        option domain-name-servers      192.168.1.1;
                        filename "/linux-install/pxelinux.0";
                        range dynamic-bootp 192.168.1.150 192.168.1.200;
                       default-lease-time 21600;
                  max-lease-time 43200;
                    }
3) 设置DHCP的客户端,设置为自动启动连网,则要修改你的网络设置文件,添加,或用ntsysv设置也能:
[root@rhel]#vi /etc/sysconfig/network
NETWORKING=yes
让引导的时候启动连网,或使用:
[root@rhel]#echo “NETWORKING=yes”>/etc/sysconfig/network
然后再修改你的网卡设置文件:
[root@rhel]#vi /etc/sysconfig/network-scriptes/ifcfg-eth0
应该包含这几行
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
4) 修改/etc/sysconfig/dhcpd文件,设置DHCP服务器在哪个设备上启动,这样对于带有两张网卡的DHCP服务器更安全:
[root@rhel]#vi /etc/sysconfig/dhcpd
DHCPDARGS=eth0
5)开机自动在所有正常的运行级别中启动DHCP服务
[root@rhel]#chkconfig --list dhcpd
[root@rhel]#chkconfig dhcpd on
    6)启动DHCP服务:启动服务器的目的是帮助在待安装机器上启动Red Hat Linux 安装程式。启动服务器上需要搭建一个DHCP 服务器和一个TFTP 服务器。前者是为了给待安装机器分配IP地址,后者则是提供了一个让待安装机器下载启动映像的途径。
启动方法一:
[root@rhel]#service dhcpd restart
启动方法二:
[root@rhel]#/etc/rc.d/ini.d/dhcpd restart
7)设置DHCP中继代理,编辑/etc/sysconfig/dhcrelay
[root@rhel]#vi /etc/sysconfig/dhcrelay
INTERFACES=”eth0”
DHCPSERVERS=”192.168.1.65”
启动DHCP中继代理:
[root@rhel]#service dhcrelay restart
    步骤3:
这个TFTP服务能不用设置,因为大都是相同的!能默认。
1)编辑TFTP 服务器的设置文件,设置文件如下:
[root@rhel]#vi /etc/xinetd.d/tftp
service tftp
{  
socket_type        = dgram
protocol          = udp
       wait              = yes
       user              = root
       server            = /usr/sbin/in.tftpd
       server_args       = -s /tftpboot
        disable           = no
}
2)启动TFTP服务的话要启动xinetd这个守护服务:
[root@rhel]#server xinetd.d restart
  步骤4:
1) 将/usr/lib/syslinux/下的启动映像文件pxelinux.0拷到TFTP服务器/tftpboot/linux-install/下:
[root@rhel]#cp /usr/lib/syslinux/pxelinux.0 /tftpboot/linux-install/
2) 将/isolinux/下的isolinux.cfg复制到TFTP服务/tftpboot/linux-install/pxelinux.cfg/下:
[root@rhel]#cp /media/rhel4/isolinux/isolinux.cfg /tftpboot/linux-install/pxelinux.cfg/default
3) 将/isolinux/下的所有名为.msg文件拷到TFTP服务器/tftpboot/linux-install/下:[root@rhel]#cp /media/rhel4/isolinux/*.msg /tftpboot/linux-install/
4)设置客户端显示的目录,修改/tftpboot/linux-install/boot.msg,如下:
[root@rhel]#vi /tftpboot/linux-install/boot.msg
-  To install or upgrade in graphical mode, press linux.
-  To install or upgrade in text mode, press test.
-  To install or upgrade in rescue mode, press rescue.
-  To install or upgrade in auto_ks install mode, press ks.
-  Use the function keys listed below for more information.
[F1-Main] [F2-Options] [F3-General] [F4-Kernel] [F5-Rescue]^O07
5)/tftpboot/linux-install/pxelinux.cfg/default此文件能默认不用设置,但也能修改:
[root@rhel]#vi /tftpboot/linux-install/pxelinux.cfg/default
default linux
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
F7 snake.msg
label linux
kernel vmlinuz
append initrd=initrd.img ramdisk_size=8192
label test
kernel vmlinuz
append initrd=initrd.img text ramdisk_size=8192
label rescue
kernel vmlinuz
append rescue initrd=initrd.img ramdisk_size=8192
label ks
kernel vmlinuz
append ks=nfs:192.168.1.65:/tftpboot/linux-install/huang-ks.cfg initrd=initrd.img ramdisk_size=8192
label expert
kernel vmlinuz
append expert initrd=initrd.img ramdisk_size=8192
label lowres
kernel vmlinuz
append initrd=initrd.img lowres ramdisk_size=8192
    步骤5:
设置NFS服务器
1) 编辑NFS服务器设置文件 /etc/exports,以允许其他机器通过NFS访问目录/madia/rhel4,文件内容如下:
[root@rhel]#vi /etc/exports
/media/rhel4/         *(ro,sync)
/tftpboot/linux-install/  *(ro,sync)
2) 重新启动NFS服务以使新设置生效
[root@rhel]# service nfs restart
    步骤6:
复制/root下的anaconda-ks.cfg文件到/tftpboot/linux-install/并改名为huang-ks.cfg
[root@rhel]#cp /root/anaconda-ks.cfg /tftpboot/linux-install/huang-ks.cfg
2)设置自动安装参数,修改/tftpboot/linux-install/huang-ks.cfg,如下:
[root@rhel]#vi /tftpboot/linux-install/huang-ks.cfg
#Generated by Kickstart Configurator
#platform=x86, AMD64, 或 Intel EM64T
#System  language
lang zh_CN
#Language modules to install
langsupport en_US --default=zh_CN
#System keyboard
keyboard us
#System mouse
mouse
#Sytem timezone
clearpart --all
part /boot --fstype ext3 --seze=128
part / --fstype ext3 --size=4000
part /home --fstype ext3 --size=256
part swap --seze=512
timezone Asia/Shanghai
#Root password
rootpw --iscrypted $1$cNKZCOfZ$1g1p9Q4x0x6x2sHHZYinK1
#Reboot after installation
reboot
#Install OS instead of upgrade
install
#Use NFS installation Media
nfs --server=10.0.2.202  --dir=/media/rhel4
#System bootloader configuration
bootloader --location=mbr
#Clear the Master Boot Record
zerombr yes
#Partition clearing information
clearpart --linux --initlabel
#System authorization infomation
auth  --useshadow  --enablemd5
#Network information
network --bootproto=dhcp --device=eth0
#Firewall configuration
firewall --disabled
#Do not configure X视窗系统
skipx
#Package install information
%packages --resolvedeps
@everything
kernel
grub
kernel-devel
e2fsprogs
    步骤7:
让DHCP服务器在chroot jail(chroot“监牢”)中运行:
dhcpd运行在jail需要几个库文件,能使用ldd(library Dependency Display缩写)命令,ldd作用是显示一个可执行程式必须使用的共享库。
[root@rhel]#ldd dhcpd
[root@rhel]#ln ?s libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
[root@rhel]#ln ?s /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    在“监牢”中创建lib目录,并将库文件复制到其中。手工完成比较麻烦的,此时能用jail软件包来帮助简化chroot“监牢”建立的过程:
1)Jail软件的编译和安装
Jail官方网站是:
http://www.jmcresearch.com/
,最新版本:1.9a。
[root@rhel]#Wget
http://www.jmcresearch.com/static/dwn/projects/jail/jail_1.9a.tar.gz
#下载jail软件
[root@rhel]#tar xzvf jail.tar.gz  #解压缩到当前目录
[root@rhel]#vi jail/READEM;vi jail/doc/INSTALL  #查看安装文件说明
[root@rhel]# cd jail/src/Makefiles; #把安装路径/tmp/jail为/usr/local
[root@rhel]#make; make install
2)用jail创建监牢
jail软件包提供mkjailenv、addjailuser和addjailsw三个Perl脚本作为其核心命令。
mkjailenv:创建chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。addjailsw:从真实文件系统中拷贝二进制可执行文件及其相关的其他文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。addjailuser:创建新的chroot“监牢”用户。
    停止当前dhcpd服务,然后建立chroot目录:
[root@rhel]#/sbin/service dhcpd start
[root@rhel]#mkjailenv /chroot/
[root@rhel]#mkjailenv  
    为“监牢”添加dhcpd程式的过程:
[root@rhel]# addjailsw /var/chroot/ -P /usr/sbin/dhcpd
[root@rhel]# addjailsw  
    将dhcpd的相关文件拷贝到“监牢”中(可做可不做):
[root@rhel]# mkdir -p /chroot/dhcp/etc
[root@rhel]# cp /etc/dhcpd.conf /chroot/dhcp/etc/
[root@rhel]# mkdir -p /chroot/dhcp/var/state/dhcp
[root@rhel]# touch /chroot/dhcp/var/state/dhcp/dhcp.leases
    重新启动dhcpd服务器:
[root@rhel]#  /chroot/usr/sbin/dhcpd
    使用ps命令检查dhcpd进程:
[root@rhel]# ps -ef | grep dhcpd
    root 2402 1 0 14:25 ? 00:00:00 /chroot/usr/sbin/dhcpd
    root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd
    注意此时进程名称已改动,使用检查dhcpd运行的端口:
[root@rhel]# netstat -nutap | grep dhcpd
    udp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd
端口号没有改动。目前dhcpd已成功运行在“监牢”中。
    步骤8:
启动客户机进行测试,能在WinXP SP2下的VMWare5.5.1中新建一个虚拟机,从 网络启动安装来测试是否设置成功。
对服务器而言,要确保网卡正常工作,并具有广播功能。对客户机而言,还要确保客户机的网卡正常工作。如果dhcpd进程没有启动,那么能浏览消息文件/var/log/messages。
    网络中的客户机却没办法取得IP地址一般是Linux DHCP服务器的网卡没有设置具有MULTICAST功能。为了让dhcpd(dhcp程式的守护进程)能够正常的和DHCP客户机沟通,需要修改路由表以激活MULTICAST功能;
[root@rhel]# route add -host 255.255.255.255 dev eth0
    如果报错:255.255.255.255:Unkown host
[root@rhel]# vi /etc/hosts#加入一行:
    255.255.255.255 dhcp
    DHCP客户端程式和DHCP服务器不兼容,不同版本使用DHCP客户端程式和DHCP服务器也不相同。Linux提供了四种DHCP客户端程式:pump, dhclient, dhcpxd, 和dhcpcd。了解不同Linux发行版本的服务器端和客户端程式对于常见错误排除是必要的。脚本 附加设置文件
Red Hat Linux 9.0的dhclient 无 /sbin/ifup /etc/sysconfig/network,/etc/sysconfig/network-scripts/ifcfg-eth0

参考上面的方法,大家能尝试配出完美的服务器来。
 
 

你可能感兴趣的:(linux开发/应用)