刚才我们已经完成了前三步的工作。我们再次对整个Shell脚本的实现方式进行一次分析:
实现过程分析:
1.分区,按照用户所选的盘,将其格式化,分区
2.挂载,按照用户设定的的分区好的盘分别挂载在我们宿主机的一个目录上。方便对微型linux进行编辑。
3.对微型Linux进行写入各项配置信息
4.将微型Linux中我们需要用到的Bash等命令放进去
5.放入内核,和启动必须加载的配置文件
6.对用户的硬盘安装引导程序。
----------------------------------------------------------------------------------------------------------
好的,刚才那算是帮助大家整理思路,算是“上集回顾”吧~接下来我们继续!将Shell脚本进行到底!
第四步:移植各种各样我们需要的命令进去:
脚本分析:
为了移植命令,我们就要先将我们宿主系统上的命令复制过去。
但是仅仅复制命令是不够的,我们还要将命令所对应的库文件复制过去。
那么,不同的命令有不同的样式,也有不同/相同的库文件。
我们就要辨别到底复制哪些库文件,复制到哪,有没有重复~
最后,我们要知道,不是仅仅复制一个命令就好,我们要循环的让用户选择到底需要什么命令。直到都复制结束~好的,分析OK,我们按照计划着手去做吧!
function COPYLIB { # 我们依然使用函数,方便以后的调用工作。
#copy command
if which $1 &> /dev/null ;then # 判断用户输入的命令是否真的是个命令,总不能我们输入1,也复制1进去吧~=。=
AA=`which $1 | tail -1 | awk '{print $1}'`
cp "$AA" $2"$AA" # 如果判断成功,则复制~
else
echo "$1 is not exist"
fi
#copy lib # 开始复制命令对应的lib库文件
for LIB in `ldd "$AA" | grep "/lib/" | sed '1,$s@^[[:space:]]/lib@aaa=> /lib@g' | awk -F"=> " '{print $2}' | cut -d" " -f1`;do
LIBPATH=`echo $LIB | sed 's@\(.*\)/[^[:space:]]\{1,\}@\1@g'` # 我们用了一个for循环,来判断我们输入的命令所含的lib,并且将他们对齐,列表
[ -d ${2}$LIBPATH ] || mkdir ${2}$LIBPATH # 判断我们即将复制过去的目录是否存在,万一不存在则创建
[ ! -e $2/$LIB ] && cp -f $LIB ${2}$LIBPATH && echo "$LIB done" # 开始复制~并提示 复制的效果~~
done
}
# 到这里,这个函数就结束了,下面我们准备调用。首先要知道,有两个命令是必须复制的,一个是bash ,一个是 init ,两个都是非常非常重要的命令。
echo "=========================================================="
echo -e "Please input COMMAND with \033[31mbash\033[0m and \033[31minit\033[0m !!!!!"
read -p "COMMAND you want?(Quit for 'q') :" CMD1 # 就是因为太重要,所以我们用上一条语句红色警示用户,必须先复制这两条。
# 然后我们制造一个循环,方便用户反复的加入各种各样的命令。
until [ $CMD1 == 'q' ]; do # 当然,不能总是输入吧,所以我们只需要按 ‘q’
COPYLIB $CMD1 /mnt/sysroot # 执行函数 并且传递我们所输入的命令。
echo -e "Please input COMMAND with \033[31mbash\033[0m and \033[31minit\033[0m !!!!!"
read -p "Which COMMAND you want use ?(Quit for 'q') :" CMD1
done
OK~这样一来,我们的小linux里也有了各种各样我们所输入的命令啦~接下来,就要往里添加内核了!
让我们的linux运行起来!!!!!
--------------------------------------------------------------------------------------------
第五步:弄个内核!让我们的Linux拥有心脏!
在手动打造属于自己的linux的时候,我们已经知道,我们的内核是直接用Redhat的内核文件。
然后再修改initrd这个能在内存中虚拟出一个小linux方便加载根目录系统的文件。
之后,我们将其移植进去就好。接下来,我们开始做吧~!
function YDFQ { # 依然是函数-。-
TMPDIR=`mktemp -d /tmp/little.XX` # 创建一个临时文件夹,一会儿我们要解压initrd.*.img 用哦~
cd $TMPDIR
zcat /boot/initrd-`uname -r`.img | cpio -id &> /dev/null ## 在临时文件夹中解压并展开我们的initrd文件,准备修改。
sed -i 's@^echo Scanning and configuring dmraid supported devices@#&@g' init
sed -i 's@^echo Scanning logical volumes@#&@g' init
sed -i 's@^lvm vgscan --ignorelockingfailure@#&@g' init
sed -i 's@^echo Activating logical volumes@#&@g' init
sed -i 's@^lvm vgchange -ay --ignorelockingfailure vol0@#&@g' init
sed -i 's@^resume LABEL=SWAP-sda3@#&@g' init # 在init文件中注释掉我们没用的行~
sed -i "s@\(mkrootdev.*\) /.*@\1 sda2@" init # 改变init文件中有用的,比如我们要判断到时候执行哪个盘。
find . | cpio -H newc -o --quiet | gzip -9 > /mnt/boot/initrd.gz # 重新归档并压缩成initrd.gz文件~
cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz # 将我们整理好的文件复制到我们的分区中去!
}
YDFQ /mnt/sysroot # 函数执行的开始-。- 好吧,请原谅我总是将它写在后面
ok~我们小linux的心脏也有了~接下来,就是最后一步了!!!给硬盘一个引导,让他知道自己该如何运行!!!!
---------------------------------------------------------------------------------------------------------
第六步:引导文件!
那么,既然需要引导,就又要提到我们伟大的 Grub了~ 它能直接给硬盘安装一个MBR进去~让其拥有boot loader~
这样一来,硬盘在开机启动之后就自己知道自己要做些什么了~~!
当然,我们的系统我们做主,所以里面要加上你自己的东西哟!!开始动手吧!
## 这里我们要传递四个值到我们的函数中
## $1=我们要安装对哪个硬盘安装bootloader
## $2=我们的主分区,就是内核文件等所在的分区
## $3=内核的名字
## $4=initrd 的名字~
##
function GRUB { ## 好吧,各种各样的函数-。-
if [ `basename $2` == boot ];then ## 判断用户输入的主分区是否是我们需要的主分区,不过这个肯定是了,因为下面我们手动指定了-。-
grub-install --root-directory=/mnt $1 &> /dev/null # 安装grub,到我们的分区去,这样我们就有了bootloader了!
cat >>$2/grub/grub.conf<< EOF # 制定我们自己的开机方式~~
default=0
timeout=10
title Little Linux
root (hd0,0)
kernel /${3} ro root=/dev/sda2 quiet
initrd /${4}
EOF
else
echo "It's not boot !Exit & Please set it again !"
fi
}
GRUB $DSK /mnt/boot vmlinuz initrd.gz # 好吧,函数开始执行了-。-
echo "Congratulation ! Your Mini Linux is install OK !" # 显示庆祝信息!告诉用户我们已经安装好了!
OK~~!!!! 一切搞定~接下来我们就去测试把~
按照这样的写下来,我们可以说基本实现了一键安装linux,并且是你自己制定的哟!!!!!
~
嗯~
看懂了么?会了么-。-那么,自己做做吧~~
当然,还是那样,如果发现有什么不同,或者各种意见,欢迎与我交流~
共同切磋才能共同进步嘛!!!!
weiyan
2011.8.4