马哥教育网络班19期+第十周课程练习

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

CentOS主机按以下顺序启动
(1)POST     加电自检        
(2)BIOS     读取CMOS中的BIOS设置的参数来识别基础硬件,寻找到启动设备        
(3)MBR          (1)读取启动设备MBR中前446字节的bootloader        
                (2)读取MBR后的扇区用来识别grub以及内核kernel所在的区域        
                (3)启动grub        
(4)GRUB     显示菜单界面,选择运行内核kernel;配置文件是/boot/grub/grub.conf        
                (1) 提供菜单、并提供交互式接口    
                (2) 加载用户选择的内核或操作系统    
                (3) 为菜单提供了保护机制    
(5)KERNEL   自身初始化        
                (1)探测可识别到的所有硬件设备;    
                (2)加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)    
                (3)以只读方式挂载根文件系统;    
                (4)运行用户空间的第一个应用程序:/sbin/init    
(6)INIT     运行/sbin/init程序,配置文件/etc/inittab和/etc/init/*.conf        
            设置默认运行级别    如:id:3:initdefault:
            运行系统初始脚本    如:si::sysinit:/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) 清理操作;    
            关闭对应的脚本中需要关闭的服务,启动需要启动服务(实际服务命令位于/etc/rc.d/init.d)        
                l0:0:wait:/etc/rc.d/rc 0    
                l1:1:wait:/etc/rc.d/rc 1    
                ...    
                l6:6:wait:/etc/rc.d/rc 6    
            设置登录终端         
                tty1:2345:respawn:/usr/sbin/mingetty tty1    
                tty2:2345:respawn:/usr/sbin/mingetty tty2    
                ...    
                tty6:2345:respawn:/usr/sbin/mingetty tty6

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

添加一块硬盘
~]# fdisk /dev/sdb                                               //将新硬盘sdb分为2个主区
~]# mke2fs -t ext4 /dev/sdb{1,2}                                //格式化分区
~]# mount /dev/sdb1 /mnt                                         //挂载分区1到/mnt目录
~]# grub-install --root-directory=/mnt /dev/sdb                  //安装grub到分区1上
~]# cp /boot/initramfs-2.6.32-504.el6.i686.img /mnt/initramfs    //复制内核文件
~]# cp /boot/vmlinuz-2.6.32-504.el6.i686 /mnt/vmlinuz            //复制ramdisk文件
~]# vim /mnt/boot/grub/grub.conf                                 //创建grub.conf文件
    default=0
    timeout=5
    title CentOS6(test)
    root (hd0,0)
    kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
    initrd /initramfs
~]# umount /dev/sdb1                                              //卸载分区1
~]# mount /dev/sdb2 /mnt                                          //挂载分区2
~]# mkdir -p /mnt/{bin,sbin,lib,lib64,etc,home,root,media,mnt,dev,tmp}
~]# mkdir -p /mnt/{usr/{bin,sbin,lib,lib64},var{lib,lib64,log,local,cache},proc,sys,selinux}
~]# cp /bin/{bash,ls,cat} /mnt/bin
~]# cp `ldd /bin/{bash,ls,cat}|grep -eo "/lib.*[[:space:]]"|
    sort -u` /mnt/lib                                             //复制lib文件
~]# sync                                                          //同步
~]# init 6                                                        //重启主机
重启后进入bios设置 调整硬盘启动顺序后保存退出。

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

可以直接手动编辑或使用创建工具在桌面模式下用system-config-kickstart (CentOS 6)来创建ks.cfg
#命令段
firewall --disabled                                    //禁用防火墙
install	                                               //执行新安装
cdrom	                                               //用光盘安装
rootpw --iscrypted $1$TxkJ7T6B$obLELgEGcn0uzgA3QTAPl/  //管理员加密密码
auth  --useshadow  --passalgo=sha512                   //屏蔽密码算法
graphical                                              //安装图形环境
firstboot --disable                                    //首次引导禁用代理
keyboard us                                            //安装键盘类型
lang en_US                                             //默认语言
selinux --enforcing                                    //激活selinux
logging --level=info                                   //信息等级
timezone  Asia/Hong_Kong                               //系统时区
bootloader --location=mbr                              //在MBR上安装引导程序
clearpart --all                                        //删除所有现存分区  
part /boot --fstype="ext4" --size=500                  //分区挂载
part / --fstype="ext4" --size=10000
#脚本段
%pre	                                               //安装前脚本
echo "start"
%end
%post	                                               //安装后脚本
echo "end"
%end
#程序包段
%packages
@chinese-support                                       //中文支持
@development                                           //开发工具
@graphical-admin-tools                                 //图形化工具
@remote-desktop-clients	                               //远程桌面客户端
git
-ibus-table-cangjie
-ibus-table-erbi
-ibus-table-wubi
%end

简单引导镜像光盘制作:

    (1)复制系统安装光盘/Packages /repodata外的所有目录下的所有文件到一自制目录中(/tmp/myiso/)
    (2)创建引导光盘:把myiso目录创建为光盘镜像boot.iso

    ~]# 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 /tmp/myiso/

简单自动安装系统光盘制作:

    (1)复制系统安装光盘的所有目录下的所有文件和ks.cfg文件到一自制目录中(/tmp/myiso/)
    (2)在/tmp/myiso/isolinux/isolinux.cfg文件中 append initrd=initrd.img 条目后
       添加ks文件读取路径 ks=cdrom:/ks.cfg
    (3)创建引导光盘:把myiso目录创建为光盘镜像boot.iso

    ~]# 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 /tmp/myiso/

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

#!/bin/bash
#
if [ $# -eq 1 ];then
    case $1 in
    start)
        echo "starting $0 finished."
        ;;
    stop)
        echo "stopping $0 finished."
        ;;
    restart)
        echo "restart $0 finished."
        ;;
    status)
        echo "status $0 finished."
        ;;
    *)
        echo "error 2"
        exit 1
        ;;
    esac
else
    echo "error 1"
fi

5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;

#!/bin/bash
#
if id $1 &>/dev/null && [ $# -eq 1 ] ;then    
    until  w |grep "^$1\>" &>/dev/null;do
        sleep 3
        echo "seaching..."    
    done
    echo "$1 is online."
else
    echo "UserId is error."
fi

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

#!/bin/bash
#
cat << EOF
cpu)    display cpu info
mem)    display memory info
disk)   display disk info
quit)   quit
==============================
EOF
read -p "Enter a option: " option
until [ "$option" == 'cpu' -o "$option" == "mem" -o "$option" == "disk" -o "$option" == "quit" ];do
    read -p "Wrong option, Enter again: " option
done

case "$option" in 
cpu)
    lscpu
    ;;
mem)
    cat /proc/meminfo
    ;;
disk)
    fdisk -l
    ;;
*)
    echo "Quit..."
    exit 0
    ;;
esac

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

#!/bin/bash
#
function userInfo {
uId=`grep "^$1\>" /etc/passwd | cut -d: -f3`
uShell=`grep "^$1\>" /etc/passwd | cut -d: -f7`
}
read -p "Input a user name or quit: " option
until [ "$option" == "quit" ];do
    if id $option &>/dev/null;then
        userInfo $option
        echo -e "User:\t$option\nUID:\t$uId\nSHELL:\t$uShell"
    else
        echo "Id is wrong."
    fi
    read -p "Input a user name or quit: " option
done

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

#!/bin/bash
#
declare dirName="/mnt/sysroot"
function load_lib {
    ldd $1 |grep -o "/.*[[:space:]]"
}
function cp_file {
    fDir=`dirname $1`
    mkdir -p "$dirName$fDir"
    cp -f $1 "$dirName$fDir"
}
function cp_lib {
    for file in `ldd $1 |grep -o "/.*[[:space:]]"`;do
        lDir=`dirname $file`
        mkdir -p "$dirName$lDir"
        cp -f $file "$dirName$lDir"
    done
}
read -p "Input a command with path: " command
mkdir -p $dirName
if [ -f $command -a -x $command ];then
    load_lib $command
    cp_file $command
    cp_lib $command
else
    echo "Input command is wrong."
fi

原创文章,作者:N23_夕立时雨,如若转载,请注明出处:http://www.178linux.com/22566

评论列表(1条)

  • 马哥教育
    马哥教育 2016-07-07 11:01

    写的很好,排版也很棒,有的需要用while true写,在检查一下加油