通过硬盘镜像启动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 重新修改权限,问题解决