用Shell脚本实现自动化完成属于自己的微型Linux!(二)

刚才我们已经完成了前三步的工作。我们再次对整个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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值