设为首页 收藏本站
查看: 3723|回复: 0

[经验分享] 用脚本实现内核以/bin/bash为默认启动

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-29 08:42:39 | 显示全部楼层 |阅读模式
一、脚本功能简介
        首先在编写脚本前在虚拟机上添加一块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软件就是很好的配合。

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

二、实验脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
[iyunv@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




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

三、自己遇到的错误

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-91720-1-1.html 上篇帖子: python实现range函数 下篇帖子: Python的面向对象、Class 概念与使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表