zoukankan      html  css  js  c++  java
  • 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的说明见下图

    wKioL1MUc9ez5uRHAAqVSvcMyy8049.jpg

    !/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 
    timeout=5 
    title MyCentos root (hd0,0) 
    kernel /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 "	Welcome to 33[34m MyCentos33[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                    [ 33[32mOK33[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
  • 相关阅读:
    4.JDBC编程
    android 多线程
    android 网络请求Ⅰ
    android 数据存储Ⅱ
    android 数据存储Ⅰ
    android 界面设计基本知识Ⅳ
    《将博客搬至CSDN》
    android 界面设计基本知识Ⅲ
    android 界面设计基本知识Ⅱ
    android 界面设计基本知识
  • 原文地址:https://www.cnblogs.com/xiaocen/p/3717693.html
Copyright © 2011-2022 走看看