|
制作fanx1.2rc-pxe-server.iso的详细过程
声明:本文为作者lanche<lanche@163.com>版权所有,未经授权不得擅自转载。
为了方便更多的朋友学习,本人将此文同时在 www.linuxeden.com 、www.linuxfans.org 、 www.linuxsir.cn 的论坛上发表。
最近在整理自己几年来的试验笔记,其中有个两年前做的slax/fanx试验,看到网上有很多朋友对slax/fanx PXE很感兴趣,只可惜很少有人愿意分享资料而无法学习掌握,所以现将本文发表出来与大家分享,希望能够帮助许多需要它的朋友们。文中所述的方法适用于slax5.1.8/fanx1.2的PXE启动(slax6.07/fanx2.0的请参考另外的文章)。
配置PXE服务器需要几个软件:dhcp、tftp、nfs和syslinux(只需要其中的pxelinux.0文件),slax-5.1.8/fanx1.2是基于slackware10.2修改而来的,但slackware12.1的软件包也一样可以用,到slackware网站去下载它们吧。
搭建试验环境需要一个宿主系统,这里使用的是winxp,ip:192.168.2.1,并用Virtual PC建立两个虚拟机(请读者不要问为什么不用Linux作宿主、VMware或VirtualBox虚拟机这种无聊的问题), vpc01 作PXE服务器,随便建立一个虚拟硬盘(几百兆也就可以了)作临时工作区以便修改及保存数据;vpc02作无盘客户机,不用建虚拟硬盘。暂以fanx1.2rc.iso为例,以之启动vpc01,用cfdisk 给虚拟硬盘分区(只分一个区就够了),格式化后挂载(个人喜欢xfs文件系统):
# mkfs.xfs /dev/hda1
# mkidr /mnt/hda1
# mount /dev/hda1 /mnt/hda1
注:#号是命令提示符,不需要输入。
在硬盘上建立临时的工作目录,将以上几个软件组织在一起并进行必要的修改。为方便大家观察及操作,每一段操作前一般都会重新确定当前工作目录,并尽量使用绝对路径,而且在使用通配符的地方尽量保留足够直观的文件目录名或标识符。
# mkdir /mnt/hda1/pxe-server
# cd /mnt/hda1/pxe-server
# installpkg –root . /YOUR-PATH/dhcp*
# installpkg –root . /YOUR-PATH/portmap*
# installpkg –root . /YOUR-PATH/nfs-utils*
# installpkg –root . /YOUR-PATH/tftp*
注:/YOUR-PATH是指你放置以上几个软件包的目录,使用-root参数把它们安装到/mnt/hda1/pxe-server以便修改后打包成*.mo文件。
比如我是把它们放在宿主机的共享文件夹share的:
# mkdir /mnt/smb
# ifconfig eth0 192.168.2.10
# mount –t smbfs //192.168.2.1/share /mnt/smb
那么这里的/YOUR-PATH就是/mnt/smb。
建立rc.inet1配置文件(用vi 或 mcedit 修改均可,以下同),指定PXE服务器启动时使用的IP地址:
# cd /mnt/hda1/pxe-server
# vi rc.inet1
#!/bin/sh
if [ “$1” = “start” –o “$1” = “” ]; then
ifconfig lo down 2>/dev/null
/sbin/ifconfig lo 127.0.0.1 2>/dev/null
/sbin/route add –net 127.0.0.0 netmask 255.0.0.0 lo 2>/dev/null
/sbin/ifconfig eth0 down 2>/dev/null
/sbin/ifconfig eth0 192.168.1.1 2>/dev/null
/sbin/route add default gw 192.168.1.1 netmask 255.255.255.0 2>/dev/null
fi
修改dhcpd.conf配置文件,为客户机指定动态地址池范围、tftp server的地址、PXE启动时要下载的文件名等:
# vi dhcpd.conf
ddns-update-style none;
allow client-updates;
one-lease-per-client false;
allow booting;
allow bootp;
subnet 192.168.1.0 netmask 255.255.255.0 {
interface eth0;
range 192.168.1.100 192.168.1.200;
default-lease-time 600;
max-lease-time 7200;
option router 192.168.1.1;
next-server 192.168.1.1;
filename “/pxelinux.0”;
}
修改exports文件以配置nfs共享目录:
# vi /mnt/hda1/pxe-server/etc/exports
/boot *(ro,sync,fsid=40)
在etc/rc.d目录下建立控制dhcpd服务的脚本(尽管不是必须的,但有了它在需要调试时启动、停止或重启dhcpd服务时就比较容易,也比较规范):
# cd /mnt/hda1/pxe-server/etc/rc.d
# vi rc.dhcpd
#!/bin/sh
dhcpd_start ( ) {
if [ -x /usr/sbin/dhcpd ]; then
echo “Starting dhcpd: /usr/sbin/dhcpd”
/usr/sbin/dhcpd
fi
}
dhcpd_stop ( ) {
killall dhcpd
}
dhcpd_restart ( ) {
dhcpd_stop
sleep 2
dhcpd_start
}
Case “$1” in
‘start’)
dhcpd_start
;;
‘stop’)
dhcpd_stop
;;
‘restart’)
dhcpd_restart
;;
*)
echo “Usage: /etc/rc.d/rc.dhcpd start|stop|restart”
;;
esac
控制 tftpd 服务的脚本也类似,只需要将rc.dhcpd拷贝后做简单的修改:
# cd /mnt/hda1/pxe-server/etc/rc.d
# vi rc.tftpd
#!/bin/sh
tftpd_start ( ) {
if [ -x /usr/sbin/in.tftpd ]; then
echo “Starting tftpd: /usr/sbin/in.tftpd –l –v –s /root/tftproot”
/usr/sbin/in.tftpd –l –v –s /root/tftproot
fi
}
tftpd_stop ( ) {
killall in.tftpd
}
tftpd_restart ( ) {
tftpd_stop
sleep 2
tftpd_start
}
Case “$1” in
‘start’)
tftpd_start
;;
‘stop’)
tftpd_stop
;;
‘restart’)
tftpd_restart
;;
*)
echo “Usage: /etc/rc.d/rc.tftpd start|stop|restart”
;;
esac
在 etc/rc.d 目录下建立修改 rc.local 脚本,以便让系统在引导时启动 dhcpd 和 tftpd 服务(portmap和nfs软件包自有rc.portmap和rc.nfsd控制脚本,它们由rc.inet2自动调用)。当然你也可以在其它脚本中启动它们,我个人喜欢放到rc.local里。
# cd /mnt/hda1/pxe-server/etc/rc.d
# vi rc.local
#!/bin/sh
/etc/rc.d/rc.dhcpd start 2>/dev/null
/etc/rc.d/rc.tftpd start 2>/dev/null
配置tftpd 服务使用的根目录,这里使用 /root/tftproot (你可以使用其它目录,但记得要在前面的脚本中作相应改动)。客户机经PXE启动后经由DHCP服务器的指引从tftpd 服务器下载pxelinux.0到本地后运行,根据pxelinux的配置再从tftp服务器装载内核vmlinuz及initrd.gz后启动一个简单系统,进一步装载slax/fanx的*.mo模块直至完成整个系统的启动。
将syslinux软件包解压到某一临时目录,将pxelinux.0拷贝到tftpd服务器根目录,然后删除临时目录:
# mkdir /mnt/hda1/tmp
# tar zxvf /YOUR-PATH/syslinux* -C /mnt/hda1/tmp
# cp /mnt/hda1/tmp/usr/share/syslinux/pxelinux.0 /mnt/hda1/pxe-server/root/tftproot
# rm –fr /mnt/hda1/tmp
# mkidr /mnt/hda1/pxe-server/root/tftproot/pxelinux.cfg
# vi /mnt/hda1/pxe-server/root/tftproot/pxelinux.cfg/default
display splash.cfg
default slax
prompt 1
timeout 40
F1 splash.txt
F2 splash.cfg
label slax
kernel vmlinuz
append vga=769 noload=pxe_server max_loop=255 initrd=initrd.gz init=initrc load_ramdisk=1
prompt_ramdisk=0 ramdisk_size=8192 root=/dev/ram0 rw
客户机只启动一般的slax/fanx,不用装载pxe_server.mo,所以向内核传送的参数append后是noload=pxe_server。通过load/noload参数的控制,可以在服务器端加进标准版、killbill、popcron等的*.mo模块,服务器使用noload参数不加载它们,而客户机则配置pxelinux.cfg/default不同的label来分别启动它们。
接下来还需要准备vmlinuz和initrd.gz,你可以自己编译并生成它们(外国朋友都是用这一招),也可以直接利用slax/fanx光盘上的(在光盘启动slax/fanx,光盘上的内容就被转挂到/boot/boot目录下),虽然那个initrd.gz太过简单,内核驱动模块也太少,我们仍然可以将它修改成所需要的功能:
# cd /boot/boot
# cp initrd.gz vmlinuz splash* /mnt/hda1/pxe-server/root/tftproot
我们还要修改 /mnt/hda1/pxe-server/root/tftproot/initrd.gz 中的 linuxrc 脚本,这样才能让它挂载PXE服务器上的nfs共享目录,然后从远程装入*.mo模块(而不是从光盘或硬盘装入)并最终chroot到新的union文件系统,从而完成slax/fanx的远程启动。
这个initrd.gz中的内核模块目录下很空,驱动很少,我们将从当前系统拷贝必要的网卡驱动和nfs支持模块(如果自己将这些驱动编译进内核就用不着以下的操作了)。我只需在Virtual PC虚拟机及具有rtl8139网卡的真机上测试,所以只需拷贝tulip.ko、8139too.ko和mii.ko(8139too.ko需要它),另外nfs支持还需要nfs.ko、lockd.ko和sunrpc.ko。
先备份后再继续操作是个好习惯:
# cd /mnt/hda1/pxe-server/root/tftproot
# cp initrd.gz initrd-org.gz
# gunzip initrd.gz
# mkdir /mnt/initrd
# mount –o loop initrd /mnt/initrd
# mkdir /mnt/initrd/lib/modules/2.6.16/kernel/drivers/net
# cd /lib/modules/2.6.16/kernel/drivers/net
# cp 8139too.ko mii.ko tulip/tulip.ko /mnt/initrd/lib/modules/2.6.16/kernel/drivers/net
# cd /lib/modules/2.6.16/kernel/fs
# cp –R nfs lockd /mnt/initrd/lib/modules/2.6.16/kernel/fs
# cp /lib/modules/2.6.16/kernel/net/sunrpc/sunrpc.ko /mnt/initrd/lib/modules/2.6.16/kernel/net
修改initrd的linuxrc脚本装载以上的驱动模块并连接nfs共享目录装载*.mo模块:
# vi /mnt/initrd/linuxrc
定位到 # try to find livecd data directory. If not found, try modprobing 这一行,在其之前加入:
# add by lanche 2006.2.26
mkdir –p /mnt/pxe
insmod /lib/modules/2.6.16/kernel/drivers/net/tulip.ko
insmod /lib/modules/2.6.16/kernel/drivers/net/mii.ko
insmod /lib/modules/2.6.16/kernel/drivers/net/8139too.ko
insmod /lib/modules/2.6.16/kernel/net/sunrpc.ko
insmod /lib/modules/2.6.16/kernel/fs/lockd/lockd.ko
insmod /lib/modules/2.6.16/kernel/fs/nfs/nfs.ko
ifconfig eth0 up
dhcpcd eth0
. /var/lib/dhcpc/dhcpcd-eth0.info
mount $DHCPSIADDR:/boot /mnt/pxe –o nolock
DATA=/mnt/pxe
因为在本试验环境中清楚地知道网卡的驱动,所以就不用写脚本自动检测网卡使用modprobe来加载驱动了,直接用insmod,用鼠标拷贝粘贴很方便,也省得再修改modules.dep和modules.alias。
这个initrd也还没有dhcpcd(如果没有它,则在第二阶段的引导中客户机就不能获取动态IP,也就不能正确连接nfs服务器以进一步引导),也需要从当前系统拷过来,顺便建立其需保存信息的目录:
# cp /sbin/dhcpcd /mnt/hda1/initrd/sbin
# mkdir /mnt/hda1/pxe-server/var/lib
# mkdir /mnt/hda1/pxe-server/var/lib/dhcpc
OK,到这里我们已经将几个必须的软件组织并修改好了,下面把它制作成*.mo模块,准备导出到宿主机后制作iso映象:
# cd /mnt/hda1/pxe-server
# umount /mnt/initrd
# gzip initrd
# dir2mo /mnt/hda1/pxe-server /mnt/hda1/pxe_server.mo
# ifconfig eth0 192.168.2.10
# mkdir /mnt/smb
# mount –t smbfs //192.168.2.1/share /mnt/smb
# cp /mnt/hda1/pxe_server.mo /mnt/smb
# umount /mnt/smb
# rm –fr /mnt/smb
在宿主系统中用UltraISO打开原fanx1.2rc.iso文件,将pxe_server.mo 放到其 optional 目录下,修改该iso根目录下的isolinux.cfg ,在 append 后加入 load=pxe_server 参数。
修改过的isolinux.cfg:
display boot/splash.cfg
default slax
prompt 1
timeout 40
F1 boot/splash.txt
F2 boot/splash2.txt
F3 boot/splash.cfg
label slax
kernel boot/vmlinuz
append vga=769 load=pxe_server max_loop=255 initrd=boot/initrd.gz init=linuxrc load_ramdisk =1 prompt_ramdisk=0 ramdisk_size=4444 root=/dev/ram0 rw
另存为fanx1.2rc-pxe-server.iso,一切OK!
用它来启动虚拟机 vpc01,就已经是一个PXE服务器了,现在再来启动虚拟机 vpc02 ,进入CMOS设置为优先从网络PXE启动,就可以看到 vpc02 能正确通过PXE启动fanx1.2rc了;用另外一台有rtl8139网卡的机器也正常启动。 |
|