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

相关推荐

  • grep命令和find命令的练习

    1、显示系统上root、Fedora、或user1用户的默认shell [root@localhost ~]# grep -E “^(root|fedora|user1)\>” /etc/passwd | cut -d: -f1,7 root:/bin/bash fedora:/bin/bash user1:/bin/bash 2、找出/etc/rc.…

    Linux干货 2017-07-30
  • 马哥教育网络班21期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who | cut -d' ' -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 [ro…

    Linux干货 2016-07-29
  • 8.5-文本处理工具(作业篇)

     1、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序 [root@localhost ~]# netstat -nt Active Internet connections (w/o servers) Proto Recv-Q Send-Q&nb…

    Linux干货 2016-08-07
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-29
  • 浅谈HTTP协议以及httpd的十八般武艺

      初识HTTP协议                HTTP(hyper text transfer protocal)作为互联网应用最广泛的协议,任何一个运维人员都无法回避它,HTTP的目的就是提供一种发布和…

    Linux干货 2016-02-14
  • 系统启动流程 grub

    grub CentOS 6启动流程: POST —> Boot Sequence(BIOS) —> Boot Loader —>Kernel(ramdisk) —> rootfs —> switchroot —> /sbin/init—>(/etc/inittab, /etc/init/*.conf) —> 设…

    Linux干货 2016-09-16