说明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的说明见下图

!/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系统~的更多相关文章

  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. Python匿名函数详解

    python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的. 在Python中,lambda ...

  2. python中的多进程

    具体参考这个博客地址:http://www.cnblogs.com/lxmhhy/p/6052167.html

  3. json字符串与java对象的相互转换(jackson)

    1.java对象转换为json字符串 package com.chichung.json; import com.fasterxml.jackson.core.JsonProcessingExcept ...

  4. 16/11/22_plsql

    1.数据类型: char 固定长度,varchar 字符长度按照实际长度, varchar2 字符均存储2个字节, nvarchar 按照Unicode存储.number(m,n)总长度m,小数 n. ...

  5. HBase(八)HBase的协处理器

    一.协处理器简介 1. 起源 Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hbase 中,统计数 ...

  6. day5模块学习--hashlib模块

    hashlib模块     Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

  7. PHP session 写入数据库中的方法

    首先解释下为什么要把session 写到数据库中呢,session 一般默认是以文件的形式放在php.ini 配置的目录中的, 如果你的网站实现了多台服务器负载均衡,这样用户访问你的网站,可能进入的服 ...

  8. 程序设计实习MOOC / 程序设计与算法(二)第二周测验(2018春季)

    递归算法: 1:全排列 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < ' ...

  9. 【LOJ】#6391. 「THUPC2018」淘米神的树 / Tommy

    题解 一道非常神仙的计数题 如果只有一个点,就是非常简单的树型dp \(f_{u} = (siz_{u} - 1)! \prod_{v \in son_{u}} \frac{f_{v}}{siz_{v ...

  10. 阿里云ali-oss图片增加水印

    先附上文档连接 : https://helpcdn.aliyun.com/document_detail/44957.html 水印文字或图片必须经过一下转化 URL安全的Base64位编码 在图片处 ...