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
  • 相关阅读:
    ASE19团队项目 beta阶段 model组 scrum report list
    ASE19团队项目 beta阶段 model组 scrum7 记录
    ASE19团队项目 beta阶段 model组 scrum6 记录
    ASE19团队项目 beta阶段 model组 scrum5 记录
    ASE19团队项目 beta阶段 model组 scrum4 记录
    ASE19团队项目 beta阶段 model组 scrum3 记录
    ASE19团队项目 beta阶段 model组 scrum2 记录
    ASE19团队项目 beta阶段 model组 scrum1 记录
    【ASE模型组】Hint::neural 模型与case study
    【ASE高级软件工程】第二次结对作业
  • 原文地址:https://www.cnblogs.com/xiaocen/p/3717693.html
Copyright © 2011-2022 走看看