Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3170188
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2015-03-12 13:45:50

原文地址:http://blog.csdn.net/decload/article/details/7407698

一、定制LFS镜像

     定制LFS镜像的思想是在已构建完成的系统上,将整个文件系统目录打成tar包,然后制作liveCD,接着把文件系统的tar包放入liveCD中,利用liveCD启动在内存的临时系统,然后把文件系统的tar包解压到目标分区中,如果把boot提取出单独分区也解压到相应的分区中,然后重新写入MBR使系统能够从硬盘启动,安装就完成了
     这种方法应该也适用于任何一种系统,只是由于打包的系统是针对原来系统的硬件配置,所以在解压之后要做相应的修改使新的系统能适应新的机器。

详细过程步骤如下:

1. 分区中已经有一个完整的系统,以LFS为例。

2. 打包系统目录
通过liveCD光盘启动,进入liveCD, 打包LFS系统目录:

		

export LFS=/mnt/lfs mkdir -pv $LFS mount /dev/hda2 /mnt/lfs cd $LFS tar jcvpf ~/lfs-6.3.tar.bz2 ./*--exclude boot cd $LFS/boot tar jcvpf ~/boot.tar.bz2 ./*


这里LFS安装在hda2分区,首先挂载分区,然后将根目录下排除boot目录打包成lfs-6.3.tar.bz2,用来制作系统分区; 然后将boot目录打包成boot.tar.bz2,用来制作启动分区。

3. 制作liveCD
这里采用的是grub引导,也可用isolinux引导。
首先下载gnu grub,安装后会得到stage2_eltorito这个文件,用来引导启动系统,也可以直接网上下载这个文件。

		

export ISO=~/iso

mkdir $ISO

mkdir -pv $ISO/boot/grub

cp /boot/grub/stage2_eltorito $LFS/boot/grub



接着编辑menu.lst,用来制作引导菜单:

		

cat > $ISO/boot/grub/menu.lst <<EOF

default0

timeout30

color green/black light-green/black

title grub bootcd

root (cd)

kernel /boot/kernel

initrd /boot/initramfs.gz

EOF


这样就能通过grub引导了,但是要制作liveCD还要加入内核和initramfs。
首先下载内核源码,配置内核,配置内核的时候注意选择相应的驱动,比如SCSI接口和SATA接口的驱动,还有USB键盘鼠标的支持,将需要在liveCD中用到的硬件驱动和支持编译进内核,编译后得到bzImage,然后移至ISO下:

		

cp arch/X86/boot/bzImage $ISO/boot/kernel



接着制作initramfs,可以利用发行版的initramfs稍作修改,initramfs是个经过cpio和gzip压缩的文件,需要用gunzip解压,再用cpio取出:

		

export INITFS=~/initfs

mkdir $INITFS{,/out}

cp /boot/initramfs.gz $INITFS

gunzip initramfs.gz

cd out

cpio -div <../initramfs


解压后得到一系列的目录,包括bin、usr等文件夹,需要的话可以加入相应的命令到bin目录中,用ldd查看该命令需要的库,将库也复制到lib下就可以使用相应的命令了。

这里我们建立一个install文件夹,用来存放安装系统的tar包和相应的脚本:

		

mkdir install

cp ~/lfs-6.3.tar.bz2 install

cp ~/boot.tar.bz2 install

cp ~/install.sh install


脚本install.sh用来控制安装过程,详细内容下面阐述。

之后利用cpio和gzip重新制作initramfs文件:

		

find .| cpio -H newc -o | gzip >../initramfs.gz


建立出来的initramfs.gz就是我们需要的liveCD中的文件系统了。

将initramfs.gz移至ISO中:

		

mv ../initramfs.gz $ISO/boot



现在有了kernel和initramfs就可以制作liveCD了,利用mkisofs工具制作:

			

cd $ISO

mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4-boot-info-table \ -o liveCD-lfs-6.3.iso $ISO


生成的liveCD-lfs-6.3.iso即为我们需要的镜像文件,这样liveCD就制作好了。

4. 控制安装过程脚本文件:
在上一步骤中添加进initramfs中install目录的install.sh脚本用来控制安装过程,详细内容如下:

		

#!/bin/bash

#find the disk DISK=`find /dev -type b | grep '.*[shv]d[a-d][0-9]' | sed -e 's/.$//' | head -1`&& echo "Your DISK is $DISK"&& DISK_PRE=`echo $DISK | sed -e 's/.$//'`&& #set the partition echo "Input Your SWAP Partition for a number:"&& read SWAP_NUM && DISK_SWAP=${DISK}${SWAP_NUM}&& echo "Input Your BOOT Partition for a number:"&& read BOOT_NUM && DISK_BOOT=${DISK}${BOOT_NUM}&& echo "Input Your ROOT Partition for a number:"&& read ROOT_NUM && DISK_ROOT=${DISK}${ROOT_NUM}&& #init swap partition mkswap $DISK_SWAP && #swapon $DISK_SWAP && #init root partition mkfs.ext3 $DISK_ROOT && mount $DISK_ROOT /mnt/lfs && cd /mnt/lfs && tar jxvpf /install/lfs-6.3.tar.bz2 && cp ${DISK_PRE}*/mnt/lfs/dev/-R && echo "install ROOT finished"&& #init boot partition mkfs -t ext3 $DISK_BOOT && mount $DISK_BOOT /mnt/boot && cd /mnt/boot && tar jxvpf /install/boot.tar.bz2 && echo "install BOOT finished"&& #init fstab echo "${DISK_ROOT} / ext3 defaults 1 1">/mnt/lfs/etc/fstab && echo "${DISK_SWAP} swap swap pri=1 0 0">>/mnt/lfs/etc/fstab && echo "${DISK_BOOT} /boot ext3 defaults 0 0">>/mnt/lfs/etc/fstab && echo "proc /proc proc defaults 0 0">>/mnt/lfs/etc/fstab && echo "sysfs /sys sysfs defaults 0 0">>/mnt/lfs/etc/fstab && echo "devpts /dev/pts devpts gid=4,mode=620 0 0">>/mnt/lfs/etc/fstab && echo "shm /dev/shm tmpfs defaults 0 0">>/mnt/lfs/etc/fstab && #init grub menu.lst if[ $BOOT_NUM =1];then GRUB_BOOT=0 else GRUB_BOOT=`expr $BOOT_NUM - 1` fi&& echo "default 0">/mnt/boot/grub/menu.lst && echo "timeout 30">>/mnt/boot/grub/menu.lst && echo "color green/black light-green/black">>/mnt/boot/grub/menu.lst && echo "">>/mnt/boot/grub/menu.lst && echo "title LFS 6.3">>/mnt/boot/grub/menu.lst && echo "root (hd0,$GRUB_BOOT)">>/mnt/boot/grub/menu.lst && echo "kernel /kernel-2.6.39.4 root=${DISK_ROOT} vga=788">>/mnt/boot/grub/menu.lst && #reset MAC address rm -f /mnt/lfs/etc/udev/rules.d/70-persistent-net.rules && #chroot and MBR cd /&& umount /mnt/boot && mount $DISK_BOOT /mnt/lfs/boot && chroot /mnt/lfs /bin/bash -c "echo -e 'root (hd0,$GRUB_BOOT)\nsetup (hd0)\nquit' | /usr/sbin/grub"&& echo "******************************************************************"&& echo "******************** install finish now reboot *******************"&& echo "******************************************************************"&& chroot /mnt/lfs/ /bin/bash -c "reboot"



下面对重点过程做相应解释:

		

#find the disk DISK=`find /dev -type b | grep '.*[shv]d[a-d][0-9]' | sed -e 's/.$//' | head -1`&&


这行用来找出机器中的硬盘的设备文件,返回如/dev/sda之类的字符串给DISK


		

#set the partition echo "Input Your SWAP Partition for a number:"&& read SWAP_NUM && DISK_SWAP=${DISK}${SWAP_NUM}&& echo "Input Your BOOT Partition for a number:"&& read BOOT_NUM && DISK_BOOT=${DISK}${BOOT_NUM}&& echo "Input Your ROOT Partition for a number:"&& read ROOT_NUM && DISK_ROOT=${DISK}${ROOT_NUM}&&


以上为和用户的交互过程,让用户键入需要安装的分区编号,包括boot分区、swap分区、文件系统分区。


		

#init swap partition mkswap $DISK_SWAP && #swapon $DISK_SWAP &&


这里用mkswap格式化swap分区,swapon可以打开swap分区,暂不需要。


		

#init root partition mkfs.ext3 $DISK_ROOT && mount $DISK_ROOT /mnt/lfs && cd /mnt/lfs && tar jxvpf /install/lfs-6.3.tar.bz2 && cp ${DISK_PRE}*/mnt/lfs/dev/-R && echo "install ROOT finished"&&


将文件系统分区格式化成ext3的文件格式,挂载到/mnt/lfs目录下,然后解压目标文件系统的tar包到相应的分区,接着复制liveCD中的相应设备文件到目标系统的/dev目录下。


		

#init boot partition mkfs -t ext3 $DISK_BOOT && mount $DISK_BOOT /mnt/boot && cd /mnt/boot && tar jxvpf /install/boot.tar.bz2 && echo "install BOOT finished"&&


和文件系统分区类似,先格式化分区,在解压boot分区的tar包到分区中。


		

#init fstab echo "${DISK_ROOT} / ext3 defaults 1 1">/mnt/lfs/etc/fstab && echo "${DISK_SWAP} swap swap pri=1 0 0">>/mnt/lfs/etc/fstab && echo "${DISK_BOOT} /boot ext3 defaults 0 0">>/mnt/lfs/etc/fstab && echo "proc /proc proc defaults 0 0">>/mnt/lfs/etc/fstab && echo "sysfs /sys sysfs defaults 0 0">>/mnt/lfs/etc/fstab && echo "devpts /dev/pts devpts gid=4,mode=620 0 0">>/mnt/lfs/etc/fstab && echo "shm /dev/shm tmpfs defaults 0 0">>/mnt/lfs/etc/fstab &&


这里重新写入目标文件系统的fstab文件,fstab表存放了系统启动时自动挂载的文件系统和相应的挂载点,而我们的系统是直接打成tar包的,其中的fstab表记录的还是原来的系统的挂载信息,磁盘类型以及分区结构和挂载点都不会一样,所以要重新写入。利用脚本的记录的变量写入fstab表中。


		

#init grub menu.lst if[ $BOOT_NUM =1];then GRUB_BOOT=0 else GRUB_BOOT=`expr $BOOT_NUM - 1` fi&& echo "default 0">/mnt/boot/grub/menu.lst && echo "timeout 30">>/mnt/boot/grub/menu.lst && echo "color green/black light-green/black">>/mnt/boot/grub/menu.lst && echo "">>/mnt/boot/grub/menu.lst && echo "title LFS 6.3">>/mnt/boot/grub/menu.lst && echo "root (hd0,$GRUB_BOOT)">>/mnt/boot/grub/menu.lst && echo "kernel /kernel-2.6.39.4 root=${DISK_ROOT} vga=788">>/mnt/boot/grub/menu.lst &&


这里重新制作目标系统的grub的启动菜单,也就是menu.lst文件,通过脚本的相应变量写入到目标系统的boot分区下grub目录下的menu.lst。


		

#reset MAC address rm -f /mnt/lfs/etc/udev/rules.d/70-persistent-net.rules &&


这里重置MAC地址,由于解压的系统记录着原来的网卡的MAC地址,MAC地址记录下/etc/udev/rules.d/70-persistent-net.rules文件下,将这个文件删除后在下次启动时会自动识别当前机器的MAC地址,也可手动修改该文件为当前机器的MAC地址。
如果不做修改的话在启动系统完成后会提示" interface eth0 doesn't exist  ",这时ifconfig中也没有相应的网卡信息。


		

#chroot and MBR cd /&& umount /mnt/boot && mount $DISK_BOOT /mnt/lfs/boot && chroot /mnt/lfs /bin/bash -c "echo -e 'root (hd0,$GRUB_BOOT)\nsetup (hd0)\nquit' | /usr/sbin/grub"&& echo "******************************************************************"&& echo "******************** install finish now reboot *******************"&& echo "******************************************************************"&& chroot /mnt/lfs/ /bin/bash -c "reboot"


到这里系统文件修改的差不多了,但是由于机器硬盘的MBR区还未写入当前系统的引导信息,所以需要将grub的引导信息写入硬盘的MBR:
首先需要利用chroot命令切换到目标系统中,设置grub的root目录,然后setup保存就可以了,完成后提示安装完成,系统就安装完毕了。重启后就能利用硬盘的引导进入目标系统中。



二、利用LiveCD安装系统过程


安装方法:以光驱或U盘启动载入liveCD后选择grub进入livecd中 ,用liveCD中的的fdisk对磁盘进行分区,分区完后执行/install/install.sh自动安装,安装完后会自动重启。


1.       制作U盘启动系统, 将liveCD-lfs-6.3.iso 放入U盘,BIOS中选择U盘启动。

2.       进入grub引导界面,选择 grub bootcd,启动LiveCD中。

3.       fdisk 将磁盘分区,应该至少有swap分区、boot分区和文件系统分区。

4.       执行 /install/install.sh 脚本文件,键入grubboot、文件系统分区编号后自动安装,安装完自动重启,重启时选择硬盘启动进入grub,启动系统即可。



阅读(2152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~