通过硬盘镜像启动Linux(winxp)的试验

1.试验目的

       1.熟悉通过dd获得硬盘映像后,再部署出去后让linux的启动

       2.熟悉ramdisk的原理及制作

       3.解决节点上安装不同操作系统的问题

2.试验环境

     浪潮NF180服务器1台,配置如下:Linux操作系统为 2.4.20-8smp,

     浪潮NF260服务器1台,配置如下:Linux操作系统为 2.4.20-15smp,

一根双绞线。

NF180作为NFS(dhcp)的服务器(文中为server),

NF260作为启动的客户端(文中为client)

3.试验原理

     请查阅PXE,NFS原理

4.试验过程

1).配置server端的dhcp服务
dhcp服务器IP为10.151.11.149
PXE启动的客户端mac地址为00: 
   0C:76:AD:94:3B
PXE启动的客户端IP为10.151.11.176
配置/etc/dhcpd.conf文件,配置如下(红色标识为关键修改部分):
####################################
deny unknown-clients;
option subnet-mask 255.255.0.0;
option broadcast-address 10.151.255.255;
option domain-name "langchao";
option routers 10.151.11.149;
ddns-update-style none;
subnet 10.151.0.0 netmask 255.255.0.0 {
      group{
         host node{
                   hardware ethernet 00: 
   0C:76:AD:94:3B;
                   fixed-address 10.151.11.176;
                   filename "pxelinux.0";
                }
           }
}
####################################
配置完毕后,使用 service dhcpd start 启动dhcpd服务。

 
 
 
 

 
 
 
 

 
 
 
 
2).配置server端的tftp服务
     该linux内核自带的tftp-server即可
通过xinetd来使用tftp服务,我的/etc/xinetd.conf文件如下
####################################
service tftp
{
        Disable                 = no
socket_type             = dgram
        proctocol               = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /tftpboot
        per_source              = 11
        cps                     = 100 2
        flags                   = Ipv4
}
####################################
配置完毕后,使用service xinetd start 启动tftp服务。

 
 
 
 

 
 
 
 
3).配置server端上client启动时需要的文件
在server上建立目录 /tftpboot , 将/usr/bin/syslinux/pxelinux.0(如没有syslinux,则需要先安装RPM包)拷贝到/tftpboot/, pxelinux.0为启动文件,同时在/tftpboot下新建一个pxelinux.cfg目录,客户端启动时会在此目录下找与其IP相应的配置文件,该文件的名称规则为IP地址的16进制的输出(比如客户端通过dhcp得到的IP为10:151:11:176,则启动配置文件名为 
  0A970BB0),文件格式为
######################## 
            DEFAULT linux
PROMPT 0
LABEL linux
KERNEL vmlinuz
append initrd=initrd rw root=/dev/ram0 init=/linuxrc
####################################################

 
 
 
 
4).制作RamDisk(initrd image)
Ram:内存,Disk:磁盘,RamDisk就是指使用你的一部分内存空间来模拟出一个硬盘分区,实际是从内存中划出一部分作为一个分区使用,换句话说,就是把内存一部分当做硬盘使用,你可以向里边存文件。
拷贝client端原本的/boot/ initrd- 
   2.4.21-15.ELsmp.img作为启动的img(后面的image)
################################################ 
          cd /boot
          cp –a initrd- 
  2.4.21-15.ELsmp.img /tftpboot/initrd.img
           mv initrd.img initrd.gz
          gzip –d initrd.gz
          mount –o loop initrd /tmp
          cd /tmp
###############################################
在image中添加命令
   将/bin或者/sbin或者/usr/sbin下的命令拷贝到/tmp/bin下(使initrd中包括这些命令)
   按级别分:
       bash,chroot,init这是在启动时必须的命令;
       fdisk,insmod,lsmod,rmmod, gunzip,gzip,busybox,ls这些是启动
client端linux后可以使用的命令,根据需要可删除,也可加载别的命令;
将这些命令拷贝到/tmp/bin下,就需要拷贝这些命令对应的模块文件,才能保证正确使用,先使用ldd 查找当前命令需要的lib库,然后将其拷贝到/tmp/lib下
该试验最后的模块文件为,其中lib(ld)开头的文件为后来加入的。
-rwxr--r--    1 0        0          214188 
  2004-09-02  aic79xx.o
-rwxr--r--    1 0        0            5076 2004-09-02  diskdumplib.o
-rwxr--r--    1 0        0          115000 2004-09-02  ext3.o
-rwxr--r--    1 0        0           72380 2004-09-02  jbd.o
-rwxr-xr-x    1 0        0          103840  3月 28 06:42 ld-linux.so.2
-rwxr-xr-x    1 0        0           19248  3月 30 01:41 libacl.so.1
-rwxr-xr-x    1 0        0            7148  3月 30 01:41 libattr.so.1
-rwxr-xr-x    1 0        0         1567768  3月 28 06:41 libc.so.6
-rwxr-xr-x    1 0        0           14868  3月 28 06:41 libdl.so.2
-rwxr-xr-x    1 0        0           11784  3月 28 06:41 libtermcap.so.2
-rwxr--r--    1 0        0          142340 2004-09-02  scsi_mod.o
-rwxr--r--    1 0        0           19800 2004-09-02  sd_mod.o

 
 
 
 
c)添加驱动程序
    在/tmp下 新建文件夹drv,添加client端的网卡和nfs驱动(如映象获得不是通过nfs传给服务器,还需要加载别的驱动,例如:如果将获得的硬盘映象存在SAN上,则添加了HCA卡的驱动),该试验只需要添加nfs和网卡的驱动
    cd /lib/modules/ 
  2.4.20-8smp/
找到modules.dep文件(记录了各个驱动模块所依赖的模块)
###############################################
………………………………………
  /lib/modules/ 
  2.4.20-8smp/kernel/fs/nfs/nfs.o:   /lib/modules/2.4.20-8smp/kernel/fs/lockd/lockd.o /
        /lib/modules/ 
  2.4.20-8smp/kernel/net/sunrpc/sunrpc.o
   ………………………………………
表明nfs.o最先依赖sunrpc.o,其次lockd.o,然后在加载nfs.o
同理加载网卡的驱动,网卡的驱动一般就是百兆或者千兆
/lib/modules/ 
  2.4.20-8smp/kernel/drivers/net/e100/e100.o:
/lib/modules/ 
  2.4.20-8smp/kernel/drivers/net/e1000/e1000.o:
该试验中client端网卡为千兆网卡,故最后drv目录结构为:
    drwxr-xr-x    2 0        0            1024  3月 28 07:39 net
drwxr-xr-x    2 0        0            1024  3月 28 07:39 nfs

 
 
 
 
nfs目录下(nfs需要的驱动)
-rwxr--r--    1 0        0           75764  3月 28 07:36 lockd.o
-rwxr--r--    1 0        0          125108  3月 28 07:35 nfs.o
-rwxr--r--    1 0        0          107856  3月 28 07:39 sunrpc.o:
net目录下(网卡需要的驱动)
   -rwxr--r--    1 0        0           89684  3月 30 01:38 e1000.o

 
 
 
 
d)修改/tmp/etc/inittab文件
      修改initrd中的etc/inittab文件,修改后如下:
###############################################
id:5:initdefault:
# System initialization.
si::sysinit:/bin/bash
#10:0:wait:/etc/rc.d/rc 0
#11:1:wait:/etc/rc.d/rc 1
#l2:2:wait:/etc/rc.d/rc 2
#l3:3:wait:/etc/rc.d/rc 3
#l4:4:wait:/etc/rc.d/rc 4
#l5:5:wait:/etc/rc.d/rc 5
#l6:6:wait:/etc/rc.d/rc 6

 
 
 
 
# Trap CTRL-ALT-DELETE
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

 
 
 
 
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
#pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

 
 
 
 
# If power was restored before the shutdown kicked in, cancel it.
#pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

 
 
 
 

 
 
 
 
# Run gettys in standard runlevels
#1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
#x:5:respawn:/etc/X11/prefdm -nodaemon
###############################################

 
 
 
 
e)修改linuxrc
    可以将/tmp/drv下的驱动写在linuxrc中,这样当client启动时就自动加载驱动了;(试验中我是采用client启动后,手动insmod xxxx驱动的,效果一样)
    修改后的linuxrc文件为
###############################################
#!/bin/nash

 
 
 
 
echo "Loading scsi_mod.o module"
insmod /lib/scsi_mod.o max_scsi_luns=128
echo "Loading sd_mod.o module"
insmod /lib/sd_mod.o
echo "Loading diskdumplib.o module"
insmod /lib/diskdumplib.o
echo "Loading aic79xx.o module"
insmod /lib/aic79xx.o
echo "Loading jbd.o module"
insmod /lib/jbd.o
echo "Loading ext3.o module"
insmod /lib/ext3.o
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating block devices
mkdevices /dev
echo Creating root device
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem

 
 
 
 

 
 
 
 
#mount -o defaults --ro -t ext3 /dev/root /sysroot
#pivot_root /sysroot /sysroot/initrd
#umount /initrd/proc

 
 
 
 
exec /bin/chroot . /sbin/init < dev/console > dev/console 2>&1
###############################################
5).制作
       这是client启动需要的内核,在client启动的配置文件中表明
制作过程如下:
    cd /root 
    cp –a vmlinuz- 
  2.4.20-8smp /tmp/vmlinuz
6).配置NFS服务
修改server端的/etc/exports文件,提供nfs服务
修改后文件内容为:
/mnt/sdb   *(rw,async,all_squash)
    service  nfs start启动nfs服务
7).启动client
配置client从网卡启动
启动成功后,配置client端的网卡,mount上server端的nfs目录
   busybox  ifconfig eth0 10.151.11.176 netmask 255.255.0.0
   busybox  mount –o nolock 10.151.11.149:/mnt/sdb /drv
8).制作client的硬盘映象
cd /drv
busybox dd if=/dev/sda bs=1024k | gzip –v9 > fs.gz
(………漫长的等待………) 
9).分发client的硬盘映象
执行试验过程的步骤7)后
busybox dd if=fs.gz | gzip –v > /dev/sda
10).启动client
修改启动顺序,从硬盘启动,ok!
11).更改client的操作系统
将client上装了win2003server,装完后重复制作硬盘映象的过程
通过网卡重启client,成功。

 
 
 
 
5.试验总结
   试验过程中,出现了如下问题:
1.              有时候client启动时发现得到的IP并不是该server配置的IP,导致无法找到启动启动配置文件(根据IP规则得到的文件)
分析:由于该网段内还存在其他的dhcp服务器,所以出现此类问题
解决:用双绞线将两台机子对连,或者断开外部的网络,使局域网内只有server作为dhcp的服务器
2                     client通过pxe启动后,执行到Creating block devices(查initrd中的linuxrc文件可知,执行mkdevices /dev过程),系统不往下走了;
分析:可能缺少部分驱动程序;
解决:第一次作试验的过程中,是从server端拷贝的initrd.img以及相应的驱动程序,发现好像少了一些驱动程序,考虑到server与client硬件的差异,在第二次试验过程中,重新作initrd.img时,用client端自带的initrd.img作为ramdisk,
发现此次的initrd中多出了一个aic79xx.o,在重启client后,发现错误解决。
3                     客户端通过pxe启动后,发现mount不上NFS,
分析:权限没有设置正确;
解决:将/mnt/sdb 重新修改权限,问题解决