[目标]
有一批配置相同的服务器,现在需要安装同样的操作系统 ,进行同样的配置,通过网络方式(tftp)实现.
[思路]
1. 安装一台标准的server,并做好相应的配置,然后打包.
2. 通过PXE启动目标机器,并对目标机器分区
3. 把做好的image文件解到目标机器上.
4. 安装引导系统.
一. 安装PXE server
1. 软件需求:
Dhcp --- 目标机器通过pxe网卡从该server上获取IP
TFTP --- 目标机器获取IP后从pxe server上获取引导文件initrd
RedHat AS3.1 --- PXE server OS, 其他的也可以啦.
2. DHCP的安装.
直接使用系统自带的dhcp server, 配置文件如下:
[root@backup etc]# cat dhcpd.conf
ddns-update-style ad-hoc;
filename "/pxelinux.0";
max-lease-time 86400;
default-lease-time 43200;
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.10 192.168.100.254;
option broadcast-address 192.168.100.255;
}
3. 安装TFTP
直接使用系统自带的tftp和syslinux两个包
#cp /usr/lib/syslinux/pxelinux.0 /tftpboot/
把kernel和initrd文件复制到/tftpboot(其中initrd需要定制,方法在后面有)
修改/tftpboo/pxelinux.cfg/default文件,内容如下:
[root@backup pxelinux.cfg]# more default
PROMPT 1
TIMEOUT 500000
DISPLAY msg
default NULL
label 1
kernel vmlinuz-new
append initrd=initrd-new ramdisk_size=4250 load_ramdisk=1 prompt_ramdisk=0 root=/dev/ram0 rw
增加一个文件/tftpboot/msg,这个文件是在pxe引导时候的提示信息
修改/etc/xinet.d/tftp,把disable=yes改成no,注意:
这个文件中有一行: server_args = -s /tftpboot, 有人建议写成server_args = -s /tftpboot -l,后面-l这个参数能让tftp写log,可是如果有这个,往往目标机器无法从tftp上获取文件,在/var/log/message中有大量提示地址已经在使用的信息,所以不需用这个参数.
修改/etc/services,加上如下几条:
tftp 69/tcp
tftp 69/udp
pxe 67/udp
pxe 4011/udp
重新启动xinetd service,启动dhcp,启动目标机器,让其从网络启动,看看是否能获取到IP并能看到msg文件的提示内容,如果没有问题就可以往下了.
smallwl 于 2006-08-29 00:09:35发表:
制作image文件
1. 安装好一台样机器,并且做好配置.
2. 在tftp服务器上建一个nfs目录,用来存放image文件和runme.sh, 目录为/images,启动nfs service,并保证远程机器能读写该目录..
3. 在样机上做如下打包工作.
#mount 192.168.100.1:/images /mnt/cdrom
#cd /
#tar -czlpf /mnt/cdrom/centos.tgz . dev boot opt share tmp var
这里面, boot opt share tmp var为单独的分区, dev这么的目的是能将dev目录中的内容加到压缩包中,否则不行.
smallwl 于 2006-08-29 00:09:13发表:
Runme.sh的制作
#cat /images/runme.sh
dd if=/dev/zero of=/dev/sda count=1024
echo "n
p
1
+101M
n
p
2
+2000M
n
p
3
+996M
n
e
4
n
l
+996M
n
l
+996M
n
l
+996M
n
l
+996M
w
" |fdisk /dev/sda
mke2fs -j -L /boot1 /dev/sda1
mke2fs -j -L /opt /dev/sda8
mke2fs -j -L /1 /dev/sda2
mke2fs -j -L /var /dev/sda7
mke2fs -j -L /tmp /dev/sda6
mkswap /dev/sda5
mke2fs -j -L /spare /dev/sda3
mount -t ext3 /dev/sda2 /mnt
cd /mnt
mkdir boot opt spare tmp var
mount -t ext3 /dev/sda1 /mnt/boot
mount -t ext3 /dev/sda8 /mnt/opt
mount -t ext3 /dev/sda7 /mnt/var
mount -t ext3 /dev/sda6 /mnt/tmp
mount -t ext3 /dev/sda3 /mnt/spare
sleep 10
echo "Installing Image"
tar -xzpf /images/centos.tgz
chroot /mnt grub-install /dev/sda
umount boot
umount opt
umount spare
umount tmp
umount var
cd /
umount /mnt
echo "done"
reboot
这个shell实际就是分区,格式化,复制image文件.
注意:
a. 在格式化的时候指定该分区的卷标,名称一定要和样机系统的相同
b. 分区的名称也要对应.
smallwl 于 2006-08-29 00:08:53发表:
一. 制作initrd文件
1. 选择操作系统,这里就用FC2.0吧.
2. 安装busybox.
在这里, 需要一些命令去做一些事情, 比如fdisk, ls ,mv……如果把所有这些文件都做到initrd中,这个文件会太庞大了, busybox就是为了解决这个问题的.
从www.busybox.net上下载最新的版本, 解开后里面有一个INSTALL,按照INSTALL安装就可以了.
#cd /tmp/busybox
#tar xjvf busybox-1.1.0.tar.tar
#cd busybox-1.1.0
#make O=/tmp/busybox1 allyesconfig
#cd /tmp/busybox1
#make
3. 定制initrd
因为定制的initrd可能要包含一些文件,所以字节数需要大一点
#mkdir /tmp/initrd && cd /tmp/initrd
#mkinitrd initrd-new x.x.x-xx(后面的是kernel版本号)
在当前目录下会生成一个initrd-new文件.
#zcat initrd-new > 1(也可以使用gunzip)
#mkdir m1
#mount -oloop 1 m1
#cd m1
#mv bin bin.bak
#rm -rf sbin
在m1目录中就是initrd包含的文件了,目标机器读到initrd文件后,会去执行sbin/init文件,这个文件目前指到linuxrc,我们需要busybox
#cd /tmp/busybox1
#make PREFIX=/tmp/initrd/m1
再看看/tmp/initrd/m1/下的bin和shin目录
查一下busybox依赖的lib文件:
#ldd /tmp/busybox1/busybox
然后把对应的lib文件以及link放到/tmp/initrd/m1/lib目录中,
Busybox默认首先执行etc/init.d/rcS文件,所以我们要先建一个rcS文件:
#!/bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/sbin
# Mount filesystems in /etc/fstab.
if [ -x /bin/mount ]; then
/bin/mount -a -v
fi
echo "Loading modules..."
insmod /lib/e1000.ko
insmod /lib/sunrpc.ko
insmod /lib/lockd.ko
insmod /lib/jbd.ko
insmod /lib/ext3.ko
insmod /lib/nfs.ko
insmod /lib/scsi_mod.ko
insmod /lib/sd_mod.ko
insmod /lib/libata.ko
insmod /lib/ata_piix.ko
insmod /lib/sata_sis.ko
echo "Loading modules done"
#sleep 15
ifconfig eth0 192.168.100.100 netmask 255.255.255.0
portmap
sleep 15
echo "Connect nfs server and get image files..."
mount -o rsize=8192,wsize=8192,intr,nolock 192.168.100.1:/images /images
echo "Connecting nfs server done"
/images/runme.sh
根据这个shell,我们知道
a. 还需要bash文件,将bash复制到/tmp/initrd/m1/bin目录中,同时检查lib文件.
b. [root@backup etc]# cat fstab
none /proc proc defaults 0 0
c. 硬件驱动文件,文件系统驱动文件
insmod /lib/e1000.ko ------网卡
insmod /lib/sunrpc.ko
insmod /lib/lockd.ko
insmod /lib/jbd.ko
insmod /lib/ext3.ko
insmod /lib/nfs.ko ------以上为文件系统
insmod /lib/scsi_mod.ko
insmod /lib/sd_mod.ko
insmod /lib/libata.ko
insmod /lib/ata_piix.ko
insmod /lib/sata_sis.ko ------以上为硬盘控制器驱动
对于硬盘控制器,如果是IDE,就不需要,我这里是sata硬盘,比较恶心,如果是scsi硬盘,还需要一个aic
这些文件是从同类型机器上安装了FC2后获得的.
d. 需要一个portmap文件,在/sbin目录下.
e. Runme.sh需要自己手动建
接下来,还要处理dev目录中内容,我对dev目录不太了解,直接从/dev复制是不可以,只好使用现成的..
所有的文件都搞定后:
#cd /tmp/initrd/
#umount m1
#gzip -9 1
#cp 1.gz initrd-new