说明1:在一个Linux宿主机系统上,通过以上步骤,可以制作一个微小的Linux系统(可以放置在U盘中等),然后在其它的主机(虚拟机或者物理机)上运行,以实现最小化定制系统的目的。

说明2:上图中黑色部分是主要流程,蓝色部分是详细流程,棕色部分是注释说明等

对于上图中几点细节的详解:

阶段 说明
目标磁盘分区格式化挂载 目标磁盘是/dev/sdb,大小为1G,分区sdb1:100M,sdb2:500M即可
安装grub至目标磁盘
复制内核和initrd文件 VERSION是内核版本,如2.6.32-358.el6.x86_64
创建目标主机的根文件系统
移植常用命令

移植常用命令的脚本

在移植后的bash程序所在的目录下创建sh软链接

为grub提供配置文件 grub配置文件
创建sbin/init脚本 init脚本
 
如下图所示linux 启动详解:

说明1:上图是Linux系统启动时的详细流程,其中黑色部分为主流程分支,蓝色部分为详细流程分支,绿色部分是注释部分。大家可点击查看大图。

说明2:增加了kernel和initrd间的关系,解决了鸡和蛋的问题^_^

关于GRUB的系统文件/boot/grub/grub.conf的说明见下图

  1. !/bin/bash
  2. #
  3. ##function fdisk
  4. BOOT=/mnt/boot
  5. SYSROOT=/mnt/sysroot
  6. mkdevice () {
  7. dd if=/dev/zero of=$ bs= count= &> /dev/null
  8. [ $? -ne ] && return
  9. echo '
  10. n
  11. p
  12.  
  13. +500M
  14. n
  15. p
  16.  
  17. +9G
  18. w' | fdisk $1 &> /dev/null
  19. [ $? -ne ] && return
  20. sync
  21. sleep
  22. mkfs.ext4 ${} &> /dev/null
  23. PAPT1=$?
  24. mkfs.ext4 ${} &> /dev/null
  25. PAPT2=$?
  26. [ $PAPT1 -ne -o $PAPT2 -ne ] && return
  27. }
  28.  
  29. #umount for disk directory
  30. umountall () {
  31. for PAPT in `fdisk -l $ | grep -o "${1}[0-9]\{1,\}"`; do
  32. fuser -km $PAPT &> /dev/null
  33. umount $PAPT &> /dev/null
  34. done
  35. }
  36. #mount for disk directory
  37. mountall () {
  38. [ -d $BOOT ] || mkdir -p $BOOT
  39. [ -d $SYSROOT ] || mkdir -p $SYSROOT
  40.  
  41. mount ${} $BOOT
  42. mount ${} $SYSROOT
  43.  
  44. }
  45. #grub install for directory
  46. instgrub () {
  47. GRUBROOT=`dirname $BOOT`
  48. grub-install --root-directory=$GRUBROOT $
  49. }
  50.  
  51. #mkdir for directory and file system
  52. mkrootfs () {
  53. mkdir -p $SYSROOT/{proc,boot,sys,dev,tmp,lib,lib64,bin,sbin,root,home,opt,mnt,media,misc} &> /dev/null
  54. mkdir -p $SYSROOT/usr{share/{man,doc},bin,sbin,local,src,lib,lib64} &> /dev/null
  55. mkdir -p $SYSROOT/var/{log,run,lock,spool,tmp} &> /dev/null
  56. mkdir -p $SYSROOT/lib/{modules,module} &> /dev/null
  57. mkdir -p $SYSROOT/lib64/{modues,module} &> /dev/null
  58. cp /lib/modules/2.6.-.el6.x86_64/kernel/drivers/net/e1000/e1000.ko $SYSROOT/lib/modules/
  59. cp /boot/vmlinuz-2.6.-.el6.x86_64 $BOOT/vmlinuz
  60. cp /boot/initramfs-2.6.-.el6.x86_64.img $BOOT/initramfs.img
  61. echo -e "default=0 \ntimeout=5 \ntitle MyCentos root (hd0,0) \nkernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/sbin/init
  62. initrd /initramfs.img " > $BOOT/grub/grub.conf
  63. touch $SYSROOT/sbin/init && cat /root/init > $SYSROOT/sbin/init && chmod +x $SYSROOT/sbin/init
  64. }
  65.  
  66. Bcp () {
  67. COMMAND=`which --skip-alias $`
  68. #echo COMMAND
  69. COMPATH=`dirname $COMMAND`
  70. #echo $COMPATH
  71. [ -d $SYSROOT$COMPATH ] || mkdir -p $SYSROOT$COMPATH
  72. [ -e $SYSROOT$COMMAND ] || cp $COMMAND $SYSROOT$COMPATH
  73. for lib in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"` ; do
  74. LIBPATH=`dirname $lib`
  75. [ -d $SYSROOT$LIBPATH ] || mkdir -p $SYSROOT${LIBPATH}
  76. [ -e $SYSROOT$lib ] || cp $lib $SYSROOT${LIBPATH}
  77. done
  78. }
  79.  
  80. main () {
  81. umountall $IDISK
  82. mkdevice $IDISK
  83. mountall $IDISK
  84. instgrub $IDISK
  85. mkrootfs
  86. while true; do
  87. read -p "A CommanD : " CMD
  88. case $CMD in
  89. q|Q|quit|exit)
  90. echo "Finished."
  91. exit
  92. ;;
  93. *)
  94. ! which $CMD &> /dev/null && echo "Wrong Command." && continue
  95. Bcp $CMD
  96. ;;
  97. esac
  98. done
  99. }
  100. .
  101. read -p "A disk : " IDISK
  102. if ! fdisk -l | grep "^Disk $IDISK" &> /dev/null; then
  103. echo "$IDISK is not a disk."
  104. exit
  105. fi
  106. read -p "Destroy all date on $IDISK, contine (y/n) : " ANSWER
  107. case $ANSWER in
  108. y)
  109. main
  110. ;;
  111. n)
  112. exit
  113. ;;
  114. *)
  115. echo "Wrong option."
  116. ;;
  117. esac
  1. cat/root/init> $SYSROOT/sbin/init&& chmod+x $SYSROOT/sbin/init

/root/init的内容是:

  1. #!/bin/bash
  2. #
  3. echo -e "\tWelcome to \033[34m MyCentos\033[0m Linux "
  4. mount -n -t proc porc /proc
  5. mount -n -t sysfs sysfs /sys
  6. insmod /lib/modules/e1000.ko
  7. [ $? -eq ] && echo -e "Load e1000 module succeeded [ \033[32mOK\033[0m ]"
  8. ifconfig lo 127.0.0.1/
  9. ifconfig eth0 172.16.251.111/
  10. mount -n -o remount,rw /dev/sda2 /
  11. /bin/bash
  1. #!/bin/bash
  2. #copy order and it's libs of depend
  3. noorder(){
  4. if ! which $cmd &> /dev/null;then
  5. echo "No such command!"
  6. return
  7. fi
  8. orderpath=`which --skip-alias $cmd`
  9. }
  10. cporder(){
  11. [ -d /mnt/sysroot`dirname $orderpath` ] || mkdir -p /mnt/sysroot`dirname $orderpath`
  12. [ -f /mnt/sysroot$orderpath ] || cp -r $orderpath /mnt/sysroot$orderpath
  13. }
  14. cplib(){
  15. for lib in `ldd $orderpath | grep -o "/[^[:space:]]\{1,\}"`;do
  16. [ -d /mnt/sysroot`dirname $lib` ] || mkdir -p /mnt/sysroot`dirname $lib`
  17. [ -f /mnt/sysroot`basename $lib` ] || cp -r $lib /mnt/sysroot$lib
  18. done
  19. }
  20. while true;do
  21. read -p "Please enter a command:" cmd
  22. if [[ "$cmd" = "q" || "$cmd" = "Q" ]];then
  23. echo "You choice quit,now quit!"
  24. exit
  25. else
  26. noorder
  27. [ $? == ] && continue
  28. cporder
  29. cplib
  30. fi
  31. done

bash编程之 ~制作Mini Linux系统~的更多相关文章

  1. 「Linux」制作一个Linux系统

    一.前言 Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们 ...

  2. Shell脚本编程——了解你的Linux系统必须掌握的20个命令

    要想详细了解你的Linux系统,为系统评估和性能调化提供准确的信息,那么,你会经常用到这几组命令. 一. 系统信息     1. 查看内核版本.编译主机.编译器版本和编译时间的信息    cat /p ...

  3. 入手Cubieboard2之制作最小Linux系统

    前言 昨天终于入手了一块Cubieboard2板子,今年4月入职从事的就是与之相关的工作,因此趁现在有时间就好好熟悉一下. 一.主机环境 1.PC主机WIN 7旗舰版 1.虚拟机VM7.0 2.ubu ...

  4. Linux 系统编程 学习:09-线程:线程的创建、回收与取消

    Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...

  5. 从头构建自己的Linux系统

    2012-09-10        在博文“Linux系统启动过程分析”中我们了解了linux系统的启动流程,今天我们就来手动一步一步从头来构建一个最小的linux系统,然后用模拟器将其加载起来.常见 ...

  6. 所谓完整的linux系统包括哪些部分呢?【转】

    本文转载自:http://www.eeskill.com/article/index/id/1358.html 简介:三部分:bootloader.linux kernel(linux内核).root ...

  7. 定制x86 Linux系统

    /************************************************************************************* * 定制x86 Linux ...

  8. windows 10下安装linux系统

    理员权限打开powershell,输入 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-L ...

  9. 初学Linux系统最应该做对的4件事情[长文]

    “闲来无事,逛逛贴吧”已经是本人无事消磨时间的最佳选择了.五花八门的问题,各式各样的回答,总能给自己带来无限的欢乐.当然也有些问题值得自己去思考或者回答.之前就有人在贴吧里问到“Linux好难啊!该怎 ...

随机推荐

  1. 读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)

    假设你正在操作一个Rectangle类.每个矩形可以通过左上角的点和右下角的点来表示.为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放 ...

  2. VM虚拟机和主机互传文件,使用xshell连接Ubuntu

    安装虚拟机后,有时需要在window和Ubuntu互传文件,安装VMwave tooles比较麻烦,干脆直接用xshell连接Ubuntu即可 1,已经安装Ubuntu和xshell 2,在Ubunt ...

  3. EPC摘抄

    S6a MME – HSS 完成用户位置信息的交换和用户签约信息的管理,传送控制面信息 Diameter MME:主要负责信令处理及移动性管理,功能包括:NAS信令及其安全:跟踪区域(Tracking ...

  4. Go 1 Release Notes

    Go 1 Release Notes Introduction to Go 1 Changes to the language Append Close Composite literals Goro ...

  5. Android Studio配置opencv

    安装过程参考:http://www.cnblogs.com/tail/p/4618476.html demo参考:http://blog.csdn.net/gao_chun/article/detai ...

  6. AdvStringGrid 单元格字体颜色、背景颜色

    procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin AdvStringGrid1.RowCount := ;// ...

  7. Codeforces 734C Anton and Making Potions(枚举+二分)

    题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种 ...

  8. SQL Server数据库存在判断语句及系统表简介

    Transact-SQL Exists Sentences--判断数据库是否存在IF EXISTS(SELECT * FROM master.sysdatabases WHERE name=N'库名' ...

  9. Ubuntu 搭建docker registry 私有仓库

    一.为什么要搭建 docker 私有仓库 原因有几个: 项目需要,不希望将项目放到 docker hub 上. 环境需求,考虑网络.效率的问题,希望在私有服务器上建立自用的仓库,提高便利性和访问速度. ...

  10. springboot 1.5.X junit测试

    import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; impo ...