马哥教育21期网络班—第10周课程+练习—-成长进行时–不退步

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

POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端
POST:
加电自检;
ROM:CMOS
BIOS:Basic Input and Output System :基本输入输出系统
主机先激活CPU
ROM+RAM
检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常Boot Sequence(BIOS) 
按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备;bootloader: 引导加载器,程序Boot Loader (MBR)446: bootloader64: fat2: 55AAGRUB: 
stage1:stage1的代码直接存在于MBR,是后续引导的入口,无识别文件系统的能力。
stage1.5: MBR之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统,具有识别文件系统的能力。
stage2:加载磁盘分区(/boot/grub/)
kernel:
        自身初始化:
        探测可识别到的所有硬件设备;
        加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
        以只读方式挂载根文件系统;
        运行用户空间的第一个应用程序:/sbin/init
init程序的类型:
          SysV: init, CentOS 5
            配置文件:/etc/inittab
          Upstart: init, CentOS 6
            配置文件:/etc/inittab, /etc/init/*.conf          Systemd:systemd, CentOS 7 自己能加载服务
            配置文件:/usr/lib/systemd/system, /etc/systemd/systemramdisk --> ramfs            CentOS 5: initrd,  工具程序:mkinitrd           CentOS 6: initramfs, 工具程序:mkinitrd, dracutsh
设置运行级别
运行级别:为了系统的运行或维护等应用目的而设定;          0-6:7个级别            0:关机            1:单用户模式(root, 无须登录), single, 维护模式;            2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;            3:多用户模式,正常模式;文本界面;            4:预留级别;可同3级别;            5:多用户模式,正常模式;图形界面;            6:重启
/etc/rc.d/rc.sysinit: 系统初始化脚本
          (1) 设置主机名;
          (2) 设置欢迎信息;
          (3) 激活udev和selinux; 
          (4) 挂载/etc/fstab文件中定义的文件系统;
          (5) 检测根文件系统,并以读写方式重新挂载根文件系统;
          (6) 设置系统时钟;
          (7) 激活swap设备;
          (8) 根据/etc/sysctl.conf文件设置内核参数;
          (9) 激活lvm及software raid设备;
          (10) 加载额外设备的驱动程序;
          (11) 清理操作;
  • 2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

  • (1) 为硬盘新建两个主分区;并为其安装grub;

  • (2) 为硬盘的第一个主分区提供内核和ramdisk文件为第二个分区提供rootfs;

  • (3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

  • (4) 为grub提供配置文件;

  • (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

# mkfs -t ext4 /dev/sdb1 && mkfs -t ext4 /dev/sdb2
# mount /dev/sdb1 /media/boot
# grub-install --root-directory=/media /dev/sdb
# cp /boot/vmlinuz-2.6.32-358.el6.i686 /media/boot/vmlinuz
# cp /boot/initramfs-2.6.32-358.el6.i686.img /media/boot/initrmfs.img
# vim /media/boot/grub/grub.conf
default=0
timeout=5
title centos (express)
    root (hd0,0)
    kernel /vmlinuz ro root=/dev/sda2
    initrd /initrmfs.img
# mount /dev/sdb2 /mnt/sysroot
# sh cpcom.sh 
Enter a command:bash
Enter a command:ls
Enter a command:cat
Enter a command:quit
Quit

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

创建kickstart文件的方式:
      (1) 直接手动编辑;
        依据某模板修改;
      (2) 可使用创建工具:system-config-kickstart (CentOS 6)
        依据某模板修改并生成新配置;
检查ks文件的语法错误:ksvalidator
      # ksvalidator /PATH/TO/KICKSTART_FILE
创建引导光盘:
      # 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) 其它任意参数,均报错退出;

#!/bin/bash
      read -p "Please enter start,stop,restart or status:" option
      case $option in 
      start) 
          echo "Starting $0 finished"
          ;;
      stop)
          echo "Stopped $0 finished"
          ;;
      status)
          echo "The status of $0"
          ;;
      restart)
          echo "Restart $0"
          ;;
      *)
          echo "Wrong option" && exit 1
          ;;
      esac
  • 5、写一个脚本,判断给定的用户是否登录了当前系统;

  • (1) 如果登录了,则显示用户登录,脚本终止;

  • (2) 每3秒钟,查看一次用户是否登录; #!/bin/bash

#!/bin/bash
read -p "Please enter a user:" user
while true; do
    if who | grep "^$user" &> /dev/null; then
        break
    fi
    sleep 3 && echo "$user not log."
done
echo "$user logged."

6、写一个脚本,显示用户选定要查看的信息; cpu) display cpu info mem) display memory info disk) display disk info quit) quit 非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;

#!/bin/bash
        #
        cat << EOF
        cpu) show cpu information;
        mem) show memory information;
        disk) show disk information;
        quit) quit
        ============================
        EOF

        read -p "Enter a option: " option
        while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do
            read -p "Wrong option, Enter again: " option
        done

        if [ "$option" == 'cpu' ]; then
            lscpu
        elif [ "$option" == 'mem' ]; then
            cat /proc/meminfo
        elif [ "$option" == 'disk' ]; then
            fdisk -l
        else
            echo "Quit"
            exit 0
        fi
  • 7、写一个脚本

  • (1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;

  • (2) 提示用户输入一个用户名或输入“quit”退出; 当输入的是用户名,则调用函数显示用户信息;

  • 当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:

#!/bin/bash
userinfo() {
    uid=`id -u $user`
    shell=`finger root -l | grep -o 'Shell.*' | cut -d' ' -f2`
    id $user &> /dev/null
    if [ $? -ne 0 ]; then
     echo "No such user!" && exit 1
    else 
    echo "$user UID :$uid"
    echo "$user SHELL:$shell"
    fi
}
cat << EOF
You could enter a user or string of "quit":
a user:show the uid and shell;
quit:quit the script.
===========================================
EOF
while true; do
read -p "Please enter something:" option
    if [[ $option == "quit" ]]; then 
        echo "Quit!" && exit 0
    else
        user=$option
    fi
    userinfo $user
done
  • 8、写一个脚本,完成如下功能(使用函数)

  • (1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;

  • (2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中; -(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;

#!/bin/bash
options() {
    for i in $*; do
        dirname=`dirname $i`
    [ -d /mnt/sysroot$dirname ] || mkdir -p /mnt/sysroot$dirname
    [ -f /mnt/sysroot$i ] || cp $i /mnt/sysroot$dirname/
    done
}
while true; do
    read -p "Enter a command:" pidname
    [[ "$pidname" == "quit" ]] && echo "Quit" && exit 0
    bash=`which --skip-alias $pidname`
    if [[ -x $bash ]]; then
        options `/usr/bin/ldd $bash | grep -o "/.*[[:space:]]\{1,\}"`
    options $bash
    else
    echo "No such command!"
    fi
done

原创文章,作者:N21_ Dominic,如若转载,请注明出处:http://www.178linux.com/45236

(0)
上一篇 2016-09-15 22:21
下一篇 2016-09-15 22:22

相关推荐

  • Linux之网络管理

    Linux之网络管理     在学习linux的过程中,Linux网络的管理和配置中是很重要的,几乎学习的后期都离不开网络的概念和配置,如集群中的使用,学习好Linux网络至关重要。     Linux网络IP地址有两种配置方式:静态指定和动态分配 动态分配就是利用DHCP服务器,动态的给linux主机分配IP地址。静…

    Linux干货 2016-09-05
  • 第五天03条件判断与循环

           选择执行     选择执行:注意:if语句可嵌套                           单分支       &n…

    Linux干货 2016-08-18
  • 基于nginx实现7层http的负载均衡

    一、实验环境实验环境为三台服务器:1. nginx负载均衡器1. 内网ip:192.168.11.1002. 外网ip:172.16.251.892. 提供网页服务的RS-1服务器:192.168.11.2013. 提供网页服务的RS-2服务器:192.168.11.2024. 拓扑如下:二、实验配置后台服务器配置:1. 后台提供网页服务的两台服务器配置:y…

    Linux干货 2017-06-29
  • bash的基础特性[更新中]

    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    2018-03-17
  • 马哥第一天

    来这儿的第一天

    2018-03-26
  • 文本三剑客—sed 基础

    文本三剑客—sed 基础        sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式的插入、删除或者替换数据中的文本。流编辑器则会自爱编辑器处理数据之前基于预习提供的一组…

    Linux干货 2017-05-15