红联Linux门户
Linux帮助

通过image文件远程安装已经配置的Linux

发布时间:2006-08-29 00:08:29来源:红联作者:smallwl
[目标]

有一批配置相同的服务器,现在需要安装同样的操作系统 ,进行同样的配置,通过网络方式(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文件的提示内容,如果没有问题就可以往下了.
文章评论

共有 3 条评论

  1. 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目录中的内容加到压缩包中,否则不行.

  2. 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. 分区的名称也要对应.

  3. 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