bash编程之 ~制作Mini Linux系统~
说明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脚本 |

说明1:上图是Linux系统启动时的详细流程,其中黑色部分为主流程分支,蓝色部分为详细流程分支,绿色部分是注释部分。大家可点击查看大图。
说明2:增加了kernel和initrd间的关系,解决了鸡和蛋的问题^_^
关于GRUB的系统文件/boot/grub/grub.conf的说明见下图
- !/bin/bash
- #
- ##function fdisk
- BOOT=/mnt/boot
- SYSROOT=/mnt/sysroot
- mkdevice () {
- dd if=/dev/zero of=$ bs= count= &> /dev/null
- [ $? -ne ] && return
- echo '
- n
- p
- +500M
- n
- p
- +9G
- w' | fdisk $1 &> /dev/null
- [ $? -ne ] && return
- sync
- sleep
- mkfs.ext4 ${} &> /dev/null
- PAPT1=$?
- mkfs.ext4 ${} &> /dev/null
- PAPT2=$?
- [ $PAPT1 -ne -o $PAPT2 -ne ] && return
- }
- #umount for disk directory
- umountall () {
- for PAPT in `fdisk -l $ | grep -o "${1}[0-9]\{1,\}"`; do
- fuser -km $PAPT &> /dev/null
- umount $PAPT &> /dev/null
- done
- }
- #mount for disk directory
- mountall () {
- [ -d $BOOT ] || mkdir -p $BOOT
- [ -d $SYSROOT ] || mkdir -p $SYSROOT
- mount ${} $BOOT
- mount ${} $SYSROOT
- }
- #grub install for directory
- instgrub () {
- GRUBROOT=`dirname $BOOT`
- grub-install --root-directory=$GRUBROOT $
- }
- #mkdir for directory and file system
- mkrootfs () {
- mkdir -p $SYSROOT/{proc,boot,sys,dev,tmp,lib,lib64,bin,sbin,root,home,opt,mnt,media,misc} &> /dev/null
- mkdir -p $SYSROOT/usr{share/{man,doc},bin,sbin,local,src,lib,lib64} &> /dev/null
- mkdir -p $SYSROOT/var/{log,run,lock,spool,tmp} &> /dev/null
- mkdir -p $SYSROOT/lib/{modules,module} &> /dev/null
- mkdir -p $SYSROOT/lib64/{modues,module} &> /dev/null
- cp /lib/modules/2.6.-.el6.x86_64/kernel/drivers/net/e1000/e1000.ko $SYSROOT/lib/modules/
- cp /boot/vmlinuz-2.6.-.el6.x86_64 $BOOT/vmlinuz
- cp /boot/initramfs-2.6.-.el6.x86_64.img $BOOT/initramfs.img
- echo -e "default=0 \ntimeout=5 \ntitle MyCentos root (hd0,0) \nkernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/sbin/init
- initrd /initramfs.img " > $BOOT/grub/grub.conf
- touch $SYSROOT/sbin/init && cat /root/init > $SYSROOT/sbin/init && chmod +x $SYSROOT/sbin/init
- }
- Bcp () {
- COMMAND=`which --skip-alias $`
- #echo COMMAND
- COMPATH=`dirname $COMMAND`
- #echo $COMPATH
- [ -d $SYSROOT$COMPATH ] || mkdir -p $SYSROOT$COMPATH
- [ -e $SYSROOT$COMMAND ] || cp $COMMAND $SYSROOT$COMPATH
- for lib in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"` ; do
- LIBPATH=`dirname $lib`
- [ -d $SYSROOT$LIBPATH ] || mkdir -p $SYSROOT${LIBPATH}
- [ -e $SYSROOT$lib ] || cp $lib $SYSROOT${LIBPATH}
- done
- }
- main () {
- umountall $IDISK
- mkdevice $IDISK
- mountall $IDISK
- instgrub $IDISK
- mkrootfs
- while true; do
- read -p "A CommanD : " CMD
- case $CMD in
- q|Q|quit|exit)
- echo "Finished."
- exit
- ;;
- *)
- ! which $CMD &> /dev/null && echo "Wrong Command." && continue
- Bcp $CMD
- ;;
- esac
- done
- }
- .
- read -p "A disk : " IDISK
- if ! fdisk -l | grep "^Disk $IDISK" &> /dev/null; then
- echo "$IDISK is not a disk."
- exit
- fi
- read -p "Destroy all date on $IDISK, contine (y/n) : " ANSWER
- case $ANSWER in
- y)
- main
- ;;
- n)
- exit
- ;;
- *)
- echo "Wrong option."
- ;;
- esac
- cat/root/init> $SYSROOT/sbin/init&& chmod+x $SYSROOT/sbin/init
/root/init的内容是:
- #!/bin/bash
- #
- echo -e "\tWelcome to \033[34m MyCentos\033[0m Linux "
- mount -n -t proc porc /proc
- mount -n -t sysfs sysfs /sys
- insmod /lib/modules/e1000.ko
- [ $? -eq ] && echo -e "Load e1000 module succeeded [ \033[32mOK\033[0m ]"
- ifconfig lo 127.0.0.1/
- ifconfig eth0 172.16.251.111/
- mount -n -o remount,rw /dev/sda2 /
- /bin/bash
- #!/bin/bash
- #copy order and it's libs of depend
- noorder(){
- if ! which $cmd &> /dev/null;then
- echo "No such command!"
- return
- fi
- orderpath=`which --skip-alias $cmd`
- }
- cporder(){
- [ -d /mnt/sysroot`dirname $orderpath` ] || mkdir -p /mnt/sysroot`dirname $orderpath`
- [ -f /mnt/sysroot$orderpath ] || cp -r $orderpath /mnt/sysroot$orderpath
- }
- cplib(){
- for lib in `ldd $orderpath | grep -o "/[^[:space:]]\{1,\}"`;do
- [ -d /mnt/sysroot`dirname $lib` ] || mkdir -p /mnt/sysroot`dirname $lib`
- [ -f /mnt/sysroot`basename $lib` ] || cp -r $lib /mnt/sysroot$lib
- done
- }
- while true;do
- read -p "Please enter a command:" cmd
- if [[ "$cmd" = "q" || "$cmd" = "Q" ]];then
- echo "You choice quit,now quit!"
- exit
- else
- noorder
- [ $? == ] && continue
- cporder
- cplib
- fi
- done
bash编程之 ~制作Mini Linux系统~的更多相关文章
- 「Linux」制作一个Linux系统
一.前言 Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们 ...
- Shell脚本编程——了解你的Linux系统必须掌握的20个命令
要想详细了解你的Linux系统,为系统评估和性能调化提供准确的信息,那么,你会经常用到这几组命令. 一. 系统信息 1. 查看内核版本.编译主机.编译器版本和编译时间的信息 cat /p ...
- 入手Cubieboard2之制作最小Linux系统
前言 昨天终于入手了一块Cubieboard2板子,今年4月入职从事的就是与之相关的工作,因此趁现在有时间就好好熟悉一下. 一.主机环境 1.PC主机WIN 7旗舰版 1.虚拟机VM7.0 2.ubu ...
- Linux 系统编程 学习:09-线程:线程的创建、回收与取消
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
- 从头构建自己的Linux系统
2012-09-10 在博文“Linux系统启动过程分析”中我们了解了linux系统的启动流程,今天我们就来手动一步一步从头来构建一个最小的linux系统,然后用模拟器将其加载起来.常见 ...
- 所谓完整的linux系统包括哪些部分呢?【转】
本文转载自:http://www.eeskill.com/article/index/id/1358.html 简介:三部分:bootloader.linux kernel(linux内核).root ...
- 定制x86 Linux系统
/************************************************************************************* * 定制x86 Linux ...
- windows 10下安装linux系统
理员权限打开powershell,输入 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-L ...
- 初学Linux系统最应该做对的4件事情[长文]
“闲来无事,逛逛贴吧”已经是本人无事消磨时间的最佳选择了.五花八门的问题,各式各样的回答,总能给自己带来无限的欢乐.当然也有些问题值得自己去思考或者回答.之前就有人在贴吧里问到“Linux好难啊!该怎 ...
随机推荐
- 读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
假设你正在操作一个Rectangle类.每个矩形可以通过左上角的点和右下角的点来表示.为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放 ...
- VM虚拟机和主机互传文件,使用xshell连接Ubuntu
安装虚拟机后,有时需要在window和Ubuntu互传文件,安装VMwave tooles比较麻烦,干脆直接用xshell连接Ubuntu即可 1,已经安装Ubuntu和xshell 2,在Ubunt ...
- EPC摘抄
S6a MME – HSS 完成用户位置信息的交换和用户签约信息的管理,传送控制面信息 Diameter MME:主要负责信令处理及移动性管理,功能包括:NAS信令及其安全:跟踪区域(Tracking ...
- Go 1 Release Notes
Go 1 Release Notes Introduction to Go 1 Changes to the language Append Close Composite literals Goro ...
- Android Studio配置opencv
安装过程参考:http://www.cnblogs.com/tail/p/4618476.html demo参考:http://blog.csdn.net/gao_chun/article/detai ...
- AdvStringGrid 单元格字体颜色、背景颜色
procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin AdvStringGrid1.RowCount := ;// ...
- Codeforces 734C Anton and Making Potions(枚举+二分)
题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种 ...
- SQL Server数据库存在判断语句及系统表简介
Transact-SQL Exists Sentences--判断数据库是否存在IF EXISTS(SELECT * FROM master.sysdatabases WHERE name=N'库名' ...
- Ubuntu 搭建docker registry 私有仓库
一.为什么要搭建 docker 私有仓库 原因有几个: 项目需要,不希望将项目放到 docker hub 上. 环境需求,考虑网络.效率的问题,希望在私有服务器上建立自用的仓库,提高便利性和访问速度. ...
- springboot 1.5.X junit测试
import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; impo ...