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脚本

如下图所示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=$1 bs=512 count=1 &> /dev/null
[ $? -ne 0 ] && return 67
echo ‘
n
p
1

+500M
n
p
2

+9G
w‘ | fdisk $1 &> /dev/null
[ $? -ne 0 ] && return 68
sync
sleep 2
mkfs.ext4 ${1}1 &> /dev/null
PAPT1=$?
mkfs.ext4 ${1}2 &> /dev/null
PAPT2=$?
[ $PAPT1 -ne 0 -o $PAPT2 -ne 0 ] && return 69
}

#umount for disk directory
umountall () {
for PAPT in `fdisk -l $1 | 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 ${1}1 $BOOT
mount ${1}2 $SYSROOT

}
#grub install for directory
instgrub () {
GRUBROOT=`dirname $BOOT`
grub-install --root-directory=$GRUBROOT $1
}

#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.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko $SYSROOT/lib/modules/
cp /boot/vmlinuz-2.6.32-431.el6.x86_64 $BOOT/vmlinuz
cp /boot/initramfs-2.6.32-431.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 $1`
#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 0
;;
*)
! 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 5
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 0 ] && echo -e "Load e1000 module succeeded [ \033[32mOK\033[0m ]"
ifconfig lo 127.0.0.1/8
ifconfig eth0 172.16.251.111/16
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 3
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 0
else
noorder
[ $? == 3 ] && continue
cporder
cplib
fi
done

时间: 2024-08-07 07:59:44

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

手动制作mini linux详细步骤—之一

8.2.1.mini linux内核编译 实验目的: 对Linux内核以非模块化手动编译,并借助busybox安装根文件系统,来制作最小化的linux系统.所谓非模块化,就是将各种所需的硬件驱动.支持的文件系统等直接编译进内核,所以initramfs也就不需要了,对于网卡驱动,我们采用模块化编译,当然也可以根据自己网卡型号,直接将驱动编译进内核:最终在我们的mini linux上能通过DHCP自动获取ip并实现基于dropbear的远程终端登录. 实验环境: 操作系统:centos6.8(x86

构建一个mini linux系统

mini linux: 启动流程: centos6:post>bootsequence(bios)>BootLoader(mbr)>kernel(如无法直接识别硬盘驱动,需借助ramdisk)>rootfs>/sbin/init centos7:post>bootsequence(bios)>BootLoader(mbr)>kernel(如无法直接识别硬盘驱动,需借助ramfs)>rootfs>/sbin/systemd bootloader:l

制作最小Linux系统并且让其在新的虚拟机上运行

以当前虚拟机里的系统为宿主机,为其增加一块新的虚拟硬盘(后缀为vmdk的)创建为单个文件 用fdisk命令查看新的硬盘信息 Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes    Device Boot      Start         End      Blocks   I

25.1 mini Linux制作

搭建虚拟机环境:  配置服务器:192.168.1.64 一.搭建环境 1.关闭配置服务器,添加一块硬盘,用来存放mini Linux系统(大小建议10G左右,名字为mini.vmdk),启动配置服务器. 2.安装编译环境所需的软件 [[email protected] ~]# yum groupinstall "Development Tools" "Server Platform development" -y 二.配置Mini Linux 1.基本配置 [[e

制作自己的Linux系统与启动光盘

1.step1 准备 isolinux.bin 和工作目录 在准备制作 ISO 的目录里添加一个子目录,比如 isolinux/ ,然后放入 isolinux.cfg 和一个对所有光盘都一样的 isolinux 提供的引导介质 isolinux.bin.isolinux.bin 可以这样得到,访问syslinux 的官方网站(如下),下载它所提供的syslinux-4.04.tar.bz2 文件,目前最新版为4.04. http://www.syslinux.org/wiki/index.php

Linux系统开发学习路线

一:嵌入式c语言 C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识.包括:基本数据类型.数组.指针.结构体.链表.文件操作.队列.栈等. 二:Linux基础 Linux操作系统的概念.安装方法,详细了解Linux下的目录结构.基本命令.编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建. 三:Linux系统编程 重点学习标准IO库,Linux多任务编程中的多进

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

本文转载自:http://www.eeskill.com/article/index/id/1358.html 简介:三部分:bootloader.linux kernel(linux内核).rootfile(根文件系统). 那么这3部分是怎么相互协作来构成这个系统的呢?各自有什么用呢?三者有什么联系?怎么联系?系统的执行流程又是怎么样的呢?搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统就打下了另一个重要的根基. 下面是笔者针对网上bootloader.linuxk

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

"闲来无事,逛逛贴吧"已经是本人无事消磨时间的最佳选择了.五花八门的问题,各式各样的回答,总能给自己带来无限的欢乐.当然也有些问题值得自己去思考或者回答.之前就有人在贴吧里问到"Linux好难啊!该怎么学习呢?"针对此问题本人谈谈个人的想法: 一. 熟悉掌握Linux系统中必须的命令 如果把学习Linux比作是建造一座高楼的话,那Linux命令就是构建这个大楼的必备材料.所谓的命令,是我们在命令行输入的一串字符.shell负责理解并执行这些字符串.shell命令可以

Linux系统裁剪之二(Bash脚本编程之十二)

Linux系统裁剪之二(Bash脚本编程之十二) 系统函数库 ·Linux系统的启动流程     1,POST(加电自检) 计算机本身并不会执行程序,它只是一堆破铜烂铁,但是它可以在开机的时候先去载入一段程序,系统在刚刚启动的时候能够实现将某个ROM芯片中的程序映射到CPU能够寻址的地址空间中去,并且让CPU能够执行其中的指令,这些指令大部分都是用来做系统检测的,当检测完成后,如果系统中所有的基本硬件和核心硬件都没有问题的话,接下来就会根据BIOS中设定的系统启动次序(Boot Sequence