Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78954
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 434
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-23 09:31
个人简介

天行健,君子以自强不息;地势坤,君子以厚德载物

文章分类
文章存档

2018年(11)

2017年(30)

我的朋友

分类: LINUX

2018-01-06 18:18:42

bash脚本编程之十二(Linux系统裁剪之二)-系统函数库

系统启动流程:
POST-->BIOS(boot sequence)-->BootLoader(MBR) -->Kernel(initrd,initramfs(redhat6))-->init(/etc/inittab,upstart(RHEL6))
注:upstart包含:/etc/inittab和/etc/init/*.conf    
    
    /etc/inittab功能:
        设定默认运行级别
        系统初始化(/etc/rc.d/rc.sysinit)
        运行指定级别的服务脚本
            /etc/rc.d/init.d
                /etc/rc.d/rc#.d
                    rc0.d--rc6.d
                        K*
                        S*
                            00--99:运行次序
        启动虚拟终端
        启动图形终端
    /etc/rc.d/rc.sysinit功能:
        检测并以读写方式重新挂载根文件系统;
        设定主机名;
        检测并挂载/etc/fstab中的其他文件系统
        启动swap分区
        初始化外围硬件设备的驱动
        根据/etc/sysctl.conf设定内核参数
        激活udev和selinux
        激活LVM和RAID设备
        清理过期锁和PID文件
        装载键映射
        
    
    
    内核初始化工作:
        硬件探测
        装载驱动
        挂载根文件系统(rootfs)
        启动用户空间中的第一进程init

本章节实现功能:
    1、关机和重启;
    2、主机名;
    3、运行对应服务脚本;
    4、启动终端;
    5、运行用户;
    6、定义单用户级别;
    7、装载网卡驱动,启用网络功能;
    8、提供一个web服务器;
mount:
    -n:挂载时不更新/etc/mtab文件;
cat /proc/mounts :显示当前系统上挂载的所有系统
    
bincp.sh 脚本:使其实现输入一个命令,能够自动将其配置文件及依赖库文件拷贝到/mnt/sysroot目录下:
#!/bin/bash
#
DEST=/mnt/sysroot
libcp() {
        LIBPATH=${1%/*}
        [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
        [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo echo "copy lib $1 finished."
}

bincp() {
        CMDPATH=${1%/*}
        [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
        [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH

        for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
                libcp $LIB
        done
}

read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
        ! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continue
        COMMAND=`which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
        bincp $COMMAND
        echo "copy $COMMAND finished."
        read -p "Continue: " CMD
done


将根文件系统重新挂载为读写模式(litle系统为只读模式):mount -n -o remount,rw /
脚本编程知识点:
    1、变量中字符的长度:${#VARNAME}
        例:[root@localhost sysroot]# A="Starting tserver."
            [root@localhost sysroot]# echo ${#A}
            17
    2、显示屏幕长度及列宽:stty -F /dev/console size
        [root@localhost sysroot]# stty -F /dev/console size
        25 80                        #表示25行,80列#

例:
[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz    
        
        
        
        
编写脚本etc/rc.d/init.d/functions ,实现每行字符串后面的标示符[OK],[FAILED] 上下对齐;        
#!/bin/bash
#
SCREEN=`stty -F /dev/console size`
COLUMNS=${SCREEN#* }

SPA_COL=$[$COLUMNS-14]

RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
NORMAL='\033[0m'

success() {
        string=$1
        RT_SPA=$[$SPA_COL-${#string}]
        echo -n "$string"
        for I in `seq 1 $RT_SPA`; do
                echo -n " "
        done
        echo -e "[   ${GREEN}OK${NORMAL}   ]"
}

failure() {
        string=$1
        RT_SPA=$[$SPA_COL-${#string}]
        echo -n "$string"
        for I in `seq 1 $RT_SPA`; do
                echo -n " "
        done
        echo -e "[ ${RED}FAILED${NORMAL} ]"
}

success "starting tserver."
success "string hello world how are you."
failure "starting tserver."
阅读(911) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~