用脚本实现内核以/bin/bash为默认启动

一、脚本功能简介

        首先在编写脚本前在虚拟机上添加一块10G的虚拟硬盘,本文磁盘名为/dev/sdb,你若不一样可以自行更改,同时定义个fdiskPartion函数来进行分区,在这用户要手动输入你的磁盘/dev/sdb,同时要保证此磁盘不能有任何分区,接着格式化两个硬盘并将其弄为ext4文件的系统,还要创建磁盘挂载的目录为/mnt/boot和/mnt/sysroot,创建玩目录后将/dev/sdb1挂载至/mnt/boot上,并进行写入grub文件,之后还要将宿主机上的内核文件复制到/mnt/boot中,下面挂载/dev/sdb2 磁盘至/mnt/sysroot上,并在其上创建根目录相关的目录,由于自己在脚本开头提前定义了函数cmdCopy和libCopy,两者的主要目的是复制命令的可执行文件以及库文件,下面就是写入grub配置文件grub.conf,以及配置网卡的模块文件,最后创建启动程序init,通过本脚本的实验发现在init脚本最后写上/bin/bash用来可以进入简易的shell环境,可是实验结果并不理想,并不能做到搭建shell环境,然而若在grub上定义启动环境不是默认的init脚本而是/bin/bash则就不会上述错误,在这里若有人知道原因请帮我解决。谢谢了!

        最后对于这个脚本的实际用以意义个人感觉并不大,但是还是能锻炼写脚本的能力的,若想深入还是学习自己手动编译内核+busybox软件就是很好的配合。

        同时还要注意在做实验时,宿主机和试验机一定不要都同时开启,不然带来的错误自己处理。。。。。。。


二、实验脚本

[root@hpf-linux ~]# cat  shell/jingxiang.sh 
#!/bin/bash
#
fdiskPartion (){
  fdisk $disk <<EOF
  n
  p
  1
  1
  +100M
  n
  p
  2
  15
  +1G
  w
EOF
}

cmdCopy (){
 for i in $*;do
   bash=`which --skip-alias $i`
   dirname=`dirname $bash`
   [ -d /mnt/sysroot$dirname ] || mkdir -p /mnt/sysroot$dirname
   [ -f /mnt/sysroot$bash ]||cp $bash /mnt/sysroot$dirname/
 done
}

libCopy (){
 for i in $* ;do
 bash=`which --skip-alias $i`
   for lib in `ldd $bash |grep -o "/[^[:space:]]\{1,\}"`; do
      libDir=`dirname $lib`
      [ -d /mnt/sysroot$libDir ] || mkdir -p /mnt/sysroot$libDir
      [ -f /mnt/sysroot$lib ] || cp $lib /mnt/sysroot$libDir/
   done
done
}

read -p "请输入刚插入的新磁盘:" disk 
   fdiskPartion  || echo "磁盘分区错误!"
   mke2fs -t ext4 /dev/sdb1 > /dev/null  || echo "格式化/dev/sdb1错误!"
   mke2fs -t ext4 /dev/sdb2 > /dev/null  || echo "格式化/dev/sdb2错误!"

if [ -e  /mnt/boot ] && [ -e /mnt/sysroot ]
then
   mkdir -p /mnt/{boot,sysroot}
else
   rm -rf /mnt/{boot,sysroot}
   mkdir -p /mnt/{boot,sysroot} 
fi

mount /dev/sdb1 /mnt/boot || echo "/dev/sdb1挂载失败"
grub-install --root-directory=/mnt /dev/sdb || echo "grub安装失败" 

[ -e /mnt/boot/grub ] && echo "grub 创建成功! "

  cp /boot/vmlinuz* /mnt/boot/vmlinuz || echo "复制vmlinuz文件失败!"
  cp /boot/initramfs* /mnt/boot/initramfs.img || echo "复制initramfs.img文件失败!"

mount /dev/sdb2 /mnt/sysroot ||echo "挂载/dev/sdb2失败!"

mkdir -p /mnt/sysroot/{etc/rc.d,dev,proc,sys,tmp,var,usr,lib,lib64,bin,sbin,boot,srv,root,home,mnt,media} ||echo "创建目录失败!"
 
cmdCopy bash vim ls cat vi mkdir cp mv mount umount ps reboot ifconfig route ping ip insmod rmmod kill
libCopy bash vim ls cat vi mkdir cp mv mount umount ps reboot ifconfig route ping ip insmod rmmod kill

#ln -s /mnt/sysroot/bin/bash /mnt/sysroot/bin/sh || echo "bash链接文件创建失败"
cd /mnt/sysroot/bin && ln -s bash sh && echo "创建链接文件成功"

if [ -f /mnt/sysroot/boot/grub/grub.conf ] ; then
  echo "grub未安装!"
else
  touch /mnt/boot/grub/grub.conf
  echo "default=0" >> /mnt/boot/grub/grub.conf
  echo "timeout=5" >> /mnt/boot/grub/grub.conf
  echo "title test linux" >> /mnt/boot/grub/grub.conf
  echo "root (hd0,0)" >> /mnt/boot/grub/grub.conf
  echo "kernel /vmlinuz ro root=/dev/sda2 selinux=0 " >> /mnt/boot/grub/grub.conf
  echo "initrd /initramfs.img" >> /mnt/boot/grub/grub.conf
fi

mkdir /mnt/sysroot/lib/modules/  
cp /lib/modules/2.6.32-504.el6.x86_64/kernel/drivers/net/e1000/e1000.ko  /mnt/sysroot/lib/modules/

if [ -f /mnt/sysroot/sbin/init ]; then
  echo "未创建init脚本"
else
  touch /mnt/sysroot/sbin/init
  echo "#!/bin/bash" >> /mnt/sysroot/sbin/init
  echo 'echo -e "Welcome to \033[34m test linux\033[0m"' >> /mnt/sysroot/sbin/init
  echo "mount -n -t proc proc /proc" >> /mnt/sysroot/sbin/init
  echo "mount -n -t sysfs sysfs /sys" >> /mnt/sysroot/sbin/init
  echo "insmod /lib/modules/e1000.ko" >> /mnt/sysroot/sbin/init
  echo "ifconfig lo 127.0.0.1/8" >> /mnt/sysroot/sbin/init
  echo "ifconfig eth0 192.168.1.9/16" >> /mnt/sysroot/sbin/init
  echo "mount -n -o remount,rw /dev/sda2 /" >> /mnt/sysroot/sbin/init
  echo "/bin/bash" >> /mnt/sysroot/sbin/init
fi
  chmod +x /mnt/sysroot/sbin/init


        最后关于虚拟机的操作我就不多做介绍了,在这里说下本人的脚本水平有限,若有啥不对的地方还请指正,大神勿喷~~~


三、自己遇到的错误


wKiom1W3fKiyxrlmAAIuwSnj_90486.jpg

      通过上图说下问题:就是正常的shell环境按回车键是往下的然而本例是平行出现,本人也不知道啥原因,若各位看管大人知道原因还请批评指正,勿喷,谢谢!






你可能感兴趣的:(linux,/bin/bash)