10.脚本练习2

1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)


POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) 
 --> Kernel+ramdisk(initrd) --> rootfs --> /sbin/init 
 --> (/etc/inittab,/etc/init/*.conf)

(1)加电自检:POST
    通电后主板CMOS中的BIOS进行硬件自检;

(2)BIOS,引导加载次序:Boot Squence
    按照BIOS中的设备启动顺序,找到第一个有引导程序的设备作为启动的设备;

(3)bootloader
    引导加载器,引导并提供菜单,让用户选择要启动的系统把选定的内核装载到
    内存中的特定空间中,解压、展开,并把系统控制权限移交给内核;

(4)kernel初始化操作
    探测可识别的所有硬件设备;加载硬件驱动;以只读方式挂在根文件系统;
    运行用户空间的第一个应用程序:/sbin/init

(5)init阶段
    根据对应的运行级别运行对应的运行级别定义的脚本

(6)运行初始化脚本
    系统初始化脚本对应文件:/etc/rc.d/rc.sysinit,设置主机名等信息,检测
    根文件系统,激活swap等;

(7)启动系统服务
    根据/etc/rc.d/init.d目录下的脚本启动相应的系统服务;

2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

  • (1) 为硬盘新建两个主分区;并为其安装grub;
  • (2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
  • (3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
  • (4) 为grub提供配置文件;
  • (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

[root@localhost ~]# lsblk /dev/sdb
  NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  sdb  8:16   0  60G  0 disk 
  ├─sdb1   8:17   0  10G  0 part 
  └─sdb2   8:18   0  10G  0 part

[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.ext4 /dev/sdb2

[root@localhost ~]# mkdir /mnt/{boot,sysroot}

[root@localhost ~]# mount /dev/sdb1 /mnt/boot/
[root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/

[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb

[root@localhost ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img
[root@localhost ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz

[root@localhost ~]# vim /mnt/boot/grub/grub.conf
  default=0
  timeout=5
  title CentOS 6
  root (hd0,0)
  kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
  initrd /initramfs.img

[root@localhost ~]# bash cpcommand.sh  #第八题的脚本
                    将ls,bash,cat命令及所依赖的库文件复制到/mnt/sysroot/中,
                    并将新加的磁盘挂载到新虚拟机中启动测试

3、制作一个kickstart文件以及一个引导镜像。描述其过程。


创建kickstart文件的方式:
            (1) 直接手动编辑;
                依据某模板修改;
            (2) 可使用创建工具:system-config-kickstart (CentOS 6)
                依据某模板修改并生成新配置;

[root@localhost ~]# yum install system-config-kickstart -y
[root@localhost ~]# system-config-kickstart  #使用kickstart图形另存为一个kickstart文件


kickstart文件的格式:
        命令段:指明各种安装前配置,如键盘类型等;
        程序包段:指明要安装的程序包组或程序包,不安装的程序包等;
            %packages
            @group_name
            package
            -package
            %end
        脚本段:
            %pre: 安装前脚本
                运行环境:运行于安装介质上的微型Linux环境

            %post: 安装后脚本
                运行环境:安装完成的系统;

        命令段中的命令:
            必备命令
                authconfig: 认证方式配置
                    authconfig --useshadow  --passalgo=sha512
                bootloader:bootloader的安装位置及相关配置
                    bootloader --location=mbr --driveorder=sda 
                               --append="crashkernel=auto crashkernel=auto 
                                 rhgb rhgb quiet quiet"
                keyboard: 设定键盘类型
                lang: 语言类型
                part: 创建分区
                rootpw: 指明root的密码
                timezone: 时区

            可选命令
                install OR upgrade
                text: 文本安装界面
                network
                firewall
                selinux
                halt
                poweroff
                reboot
                repo
                user:安装完成后为系统创建新用户
                url: 指明安装源

创建引导光盘:
            1)复制系统安装光盘/Packages /repodata外的所有文件到目录/myiso/
            2)创建引导光盘镜像
            # mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 
              --boot-info-table -V "CentOS 6.6 x86_64 boot" 
              -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/

4、写一个脚本

  • (1) 能接受四个参数:start, stop, restart, status
  • start: 输出“starting 脚本名 finished.”
  • (2) 其它任意参数,均报错退出;

[root@localhost ~]# cat status.sh 
#!/bin/bash
#
[ -d /var/log/subsys ] || mkdir -p /var/log/subsys
lockfile=/var/log/subsys/$0
Usage(){
    echo "Usage:$0 (start|stop|restart|status)" 
}

Start(){
    [ -e $lockfile ] && echo "$0 already Started." || touch $lockfile && echo "Starting $0 finished."
}

Stop(){
    [ -e $lockfile ] && rm -f $lockfile && echo "Stoping $0 finished." || echo "$0 no Running."
}

Status(){
    [ -e $lockfile ] && echo "$0 is Running." || echo "$0 is Stopped."
}

[ $# -ne 1 ] && Usage && exit 1

case $1 in
    start)
        Start;;
    stop)
        Stop;;
    restart)
        Stop&&Start;;
    status)
        Status;;
    *)
        Usage
        exit 2
        ;;
esac

5、写一个脚本,判断给定的用户是否登录了当前系统;

  • (1) 如果登录了,则显示用户登录,脚本终止;
  • (2) 每3秒钟,查看一次用户是否登录;

[root@localhost ~]# cat userlogin.sh 
#!/bin/bash
#
[ $# -ne 1 ] && echo "Usage:$0 username" && exit 1
while true;do
    who | grep "^\<$1\>" &>/dev/null && echo "$1 Login." && exit 0 || sleep 3
done

6、写一个脚本,显示用户选定要查看的信息;

  • cpu) display cpu info
  • mem) display memory info
  • disk) display disk info
  • quit) quit
  • 非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;

[root@localhost ~]# cat display.sh 
#!/bin/bash
#
cat << EOF
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
========================
EOF
Chose(){
read -p "Choose a option:(cpu|mem|disk|quit)" option
}

Chose
until [ $option == "quit" ];do
    case $option in
        cpu)
            lscpu && Chose;;
        mem)
            free -m && Chose;;
        disk)
            lsblk && Chose;;
    *)
            echo "Error,chose again!" && Chose;; 
    esac
done

7、写一个脚本

  • (1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
  • (2) 提示用户输入一个用户名或输入“quit”退出;
  • 当输入的是用户名,则调用函数显示用户信息;
  • 当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:

[root@localhost ~]# cat uidshell.sh 
#!/bin/bash
Show(){
    uid=`id -u $1`
    usershell=`grep "^\<$1\>" /etc/passwd | cut -d: -f7`
    echo "UID:$uid  Shell:$usershell" && chose
}

chose(){
    read -p "Enter a Username or quit:" username
}

chose
until [ $username == "quit" ];do
    ! id $username &>/dev/null && echo "No such User." && chose || Show $username
done

8、写一个脚本,完成如下功能(使用函数)

  • (1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
  • (2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
  • (3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;

[root@localhost ~]# cat cpcommand.sh 
#!/bin/bash
#
dir=/mnt/sysroot
cpbin(){
bincmddir=`echo $cmd | grep -o -E "^/.*/"`
[ -d $dir$bincmddir ] || mkdir -p $dir$bincmddir
[ -z $dir$cmd ] || cp $cmd $dir$bincmddir
}

cplib(){
liblist=`/usr/bin/ldd $cmd | grep -o "[^[:space:]]*/lib[^[:space:]]*"`
for lib in $liblist;do
    cmddir=`echo $lib | grep -o -E "^/.*/"`
    [ -d $dir/$cmddir ] || mkdir -p $dir$cmddir
    [ -z $dir/$lib ] || cp $lib $dir$cmddir
done
}
   
while true;do
read -p "Enter a Command:(Commamd|quit)" command
[ $command == "quit" ] && echo "quit..." && exit 0
which $command &>/dev/null && cmd=`which --skip-alias $command` || echo "No correct Command."
[[ -x $cmd ]] && cpbin $command && cplib $command || echo "No correct Command."
done

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87434

(0)
N27_jiangyefanN27_jiangyefan
上一篇 2017-09-20 00:03
下一篇 2017-09-20 00:12

相关推荐

  • mysql基础篇(一些基本概念的总结)

    一、安装以及初始化     软件包来源         1. vendor, rpm           2. 官网,source code 编译 &…

    Linux干货 2015-12-03
  • LAMP平台基于NFS实现web服务器负载均衡

    前言 随着访问量的逐渐增大,一台web服务器可能已经无法满足需求,这就需要增加web服务器的数量了,于是问题就来了:如何保证两台服务器数据同步呢?本文将讲解如何基于NFS实现web服务器的负载均衡及数据同步。 NFS服务介绍 NFS(Network File System)网络文件系统,允许一个系统通过网络共享目录和文件,通过使用NFS,用户和程序可以像访问…

    Linux干货 2015-04-22
  • linux发行版说明和哲学思想,以及常用命令说明

    Linux发行版主要流行的版本有3种:debian,slackware,red 其说明和特点如下图。 Linux哲学思想: 1、一切皆文件;所有的一切都变成了文件!不光是软件方面的比如传统文件、目录、字符设备、还包括硬件或者接口。如鼠标/mouse、打印机/lp、还有接口比如/usb. 2、单一目的的小程序;一个程序只负责干一件事,而且要把这个任务做好。 3…

    Linux干货 2016-10-30
  • 马哥教育21期网络班—第二周课程+练习

    目录管理类命令: mkdir, rmdir, tree mkdir mkdir [options] /path/to/somewhere -p: 存在于不报错,且可自动创建所需的各目录; -v: 显示详细信息 -m MODE: 创建目录时直接指定权限; tree tree:  需要安装  yum -y install …

    Linux干货 2016-06-29
  • Linux的文本处理工具练习题

    练习一:     1、找出ifconfig命令结果中本机的所有IPv4地址 2、查出分区空间使用率的最大百分比值 3、查出用户UID最大值的用户名、UID及shell类型 4、查出/tmp的权限,以数字方式显示  练习二:       1、显示/proc/meminfo文件中以大…

    Linux干货 2016-08-08
  • CentOS6.6上编译安装httpd2.4

    简介    现在apache软件基金会正在维护的httpd项目有三个版本,分别为Version 2.4,Version 2.2与Version 2.0。    三个版本的区别暂不一一介绍,有兴趣的可以去httpd.apache.org了解,下面着重介绍httpd 2.4版本。新特性 &nb…

    Linux干货 2015-06-26