用脚本实现内核以/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软件就是很好的配合。

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

二、实验脚本

[[email protected] ~]# 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

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

三、自己遇到的错误

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

时间: 2024-10-10 18:52:20

用脚本实现内核以/bin/bash为默认启动的相关文章

脚本格式之殇——/bin/bash^M: 没有那个文件或目录

Linux下的bash脚本是不支持换行符\r的,如果运行从windows拷贝的文件,出现/bin/bash^M: 坏的解释器: 没有那个文件或目录这样的错误提示,不妨检查下文件格式是否有误. 如果是格式问题,有如下两种方法: 一.查找替换法 第一步: cat -A filename查看'\n及\r空白符,\n会显示为$,而\r会显示为^M`. 第二步: sed -i 's/\r$//'filename替换掉全部\r字符. 二.VIM重置文档格式 第一步: :set ff?查看文件格式,能看到fi

/bin/bash^M: 坏的解释器: 没有那个文件或目录(bad interpreter: No such file or directory)

在Linux下编译cocos2d-x运行脚本的时候出现"/bin/bash^M: 坏的解释器: 没有那个文件或目录(bad interpreter: No such file or directory)"这样的错误如下图. 解决方法: 使用在终端输入sed -i 's/\r$//' make-all-linux-project.sh即可 其中make-all-linux-project.sh为我的文件名,这里改成自己需要的即可 原因: 这个文件在Windows 下编辑过,在Window

Linux - Shell - #!/bin/bash

概述 简单解释一下 shell 脚本卡头的 #!/bin/bash 水一篇, 少一篇 背景 shell 脚本中的注释 通常是 以# 卡头的行 但是有时候执行 shell 的时候, 会有这种内容 #!/bin/bash 1. #!/bin/bash 这不是注释 他是有意义的 shell 脚本执行 场景 一个 脚本 由 shell 执行 !/bin/bash 作用 指定 shell 2. 尝试 场景1: bash 脚本: test01.sh #!/bin/bash echo 'hello' 执行 命

Redhat/Centos 设置默认启动内核

一般编译新内核完成后 ,系统默认启动的还是之前的旧内核,如果不手动选择是不会自己启动新内核的,所以我们可以更改新内核为默认启动! #此案例是编译的4.4.0的新内核! 查看默认启动的内核 # grub2-editenv list 可以看出默认启动的内核是3.10.0! 2.查看所有内核 # cat /boot/grub2/grub.cfg | grep menuentry 可以看出有两个内核版本! 3.接着修改修改最新内核为默认启动(这儿只能使用上面命令输出中双引号 " " 或者单引号

修改Centos7.2系统的默认启动内核模式

总所周知,修改centos6的内核启动顺序,只需要修改/etc/grub.conf 里的default项配置即可.那么centos7系统该如何修改呢? 下面就centos7系统修改内核,做如下记录: 一般在编译安装新内核完成后,系统默认启动的还是旧内核,你需要告诉系统我要启动新内核,系统才会启动新内核,所以在linux中,你需要更改配置文件告知它!#在这里我使用的最新内核为4.4.0   一.首先查看默认启动的内核   二.查看新内核在配置文件中的顺序 [[email protected] ~]

Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

一.意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径. 其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本. 比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等. #!/bin/bash同理. 二.区别 GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again

CentOS6 Shell脚本/bin/bash^M: bad interpreter错误解决方法

在windows下保存了一个脚本文件,用ssh上传到centos,添加权限执行nginx提示没有那个文件或目录.shell脚本放到/etc/init.d/目录下,再执行/etc/init.d/nginx,提示多了这句/bin/bash^M: bad interpreter.网上找了资料才知道如果这个脚本在Windows下编辑过,就有可能被转换成Windows下的dos文本格式了,这样的格式每一行的末尾都是以\r\n来标识,它的ASCII码分别是0x0D,0x0A.如果你将这个脚本文件直接放到Li

[shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 转自:http://www.cnblogs.com/EasonJim/p/6850319.html 一.意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是此解释此脚本的shell的路径. $ cat /etc/shells可以查看系统支持的shell格式 其实第一句的#!是对脚

Shell之/bin/bash脚本的基础实战

本人菜鸟一枚,初次接触linux的shell脚本: shell script,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法. shell脚本的好处: 在一些复杂的linux运维工作中,大量的重复的输入和交互操作,可以通过shell脚本批量的处理,自动化的完成维护,从而减轻更多的人力成本. linux的s