馬哥教育網絡班22期+第十周課程練習

1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
    CentOS系統啟動流程為:POST –> BootSequence(BIOS) –> BootLoader(MBR) –> Kernel(ramdisk) –> rootfs(readonly) –> /sbin/init() –> 設置默認運行級別 –> 運行系統初始化腳本,完成系統初始化 –> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務 –> 設置登錄終端[–> 啟動圖形終端]
        1)POST:Power On Self Test,加電自檢;主要檢測系統關鍵硬件設備是否存在物理故障
        2)BootSequence(BIOS)
            BIOS:Basic Input and Output System,基本輸入與輸出系統,存儲于ROM中
            Boot Sequence:引導次序;根據BIOS中的設定,按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備
        3)BootLoader(MBR)
            MBR:Master Boot Record,主引導記錄;前446字節的扇區為bootloader(引導加載器)
            通過讀取設備的MBR啟動GRUB:提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核
        4)Kernel(ramdisk)
            內核初始化:
                探測可識別到的所有硬件設備
                加載硬件驅動程序(有可能會借助于ramdisk加載驅動)
                以只讀方式掛載根文件系統
                運行用戶空間的第一個應用程序:/sbin/init
        5)設置默認運行級別(/etc/inittab)
            例如:id:3:initdefault: 設定默認運行級別為3
        6)運行系統初始化腳本,完成系統初始化(/etc/rc.d/rc.sysinit)
            設置主機名
            設置歡迎信息
            激活udev和selinux
            掛載/etc/fastab文件中定義的所有文件系統
            檢測根文件系統,并以讀寫方式重新掛載根文件系統
            設置系統時鐘
            根據/etc/sysctl.conf文件來設置內核參數
            激活lvm及軟raid設備
            激活swap設備
            加載額外設備的驅動程序
            清理操作
        7)關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務(/etc/inittab)
            去啟動或關閉/etc/rc.d/rc#.d/目錄下的服務腳本所控制的服務:
                K*:要停止的服務;K##*,##表示優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的
                S*:要啟動的服務;S##*,##表示優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動
        8)設置登錄終端(/etc/inittab)
            tty1:2345:respawn:/usr/sbin/mingetty tty1
            ……
            tty6:2345:respawn:/usr/sbin/mingetty tty6

2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
  (1) 為硬盤新建兩個主分區;并為其安裝grub;
  (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
  (3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
  (4) 為grub提供配置文件;
  (5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;

在新硬盤sdb上面新增兩個分區sdb1,sdb2,并格式化文件系統
~]# fdisk /dev/sdb
~]# mke2fs -t ext4 /dev/sdb1
~]# mke2fs -t ext4 /dev/sdb2
~]# mount /dev/sdb1 /test/boot
~]# mount /dev/sdb2 /test/rootfs
~]# grub-install --root-directory=/test /dev/sdb 安裝grub
~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /boot/initramfs-2.6.32-642.el6.x86_64.img /test/boot
~]# vim /test/boot/grub/grub.conf
default=0
timeout=5
title CentOS 6 DIY
    root (hd0,0)
    kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sdb2 selinux=0 init=/bin/bash
    initrd /initramfs-2.6.32-642.el6.x86_64.img
注意:若把sdb設備作為其它機器的第一塊硬盤,root=/dev/sdb2應改為root=/dev/sda2
~]# mkdir -pv /test/rootfs/{bin,dev,etc,home,lib,lib64,media,mnt,proc,root,sbin,sys,tmp,usr,var}
~]# cp /bin/{bash,ls,cat} /test/bin
~]# cp `ldd /bin/{bash,ls,cat} | grep -Eo "/lib[^[:space:]]+"` /test/rootfs/lib64
重啟系統進入BIOS修改第一啟動項為此硬盤,然后保存重啟主機即可

3、制作一個kickstart文件以及一個引導鏡像。描述其過程。

安裝system-config-kickstart程序,使用圖形化界面生成kickstart文件
~]# ksvalidator ks.cfg 檢查kickstart文件語法錯誤
~]# mount /dev/cdrom /mnt
~]# cp -r /mnt/isolinux/ /root/myboot/
~]# cp /root/ks.cfg /root/myboot/
~]# vim /root/myboot/isolinux/isolinux.cfg
label linux
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=cdrom:/ks.cfg 指明ks文件的位置
~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS6" -c isolinux/boot.cat -b 
isolinux/isolinux.bin -o /root/myboot.iso myboot/ 制作簡易鏡像

4、寫一個腳本
  (1) 能接受四個參數:start, stop, restart, status
   start: 輸出“starting 腳本名 finished.”
   …
  (2) 其它任意參數,均報錯退出;

#!/bin/bash
name=$(basename $0)
case $1 in
start)
    echo "starting $name finished."
    ;;
stop)
    echo "stop $name finished."
    ;;
restart)
    echo "restart $name finished."
    ;;
status)
    echo "status $name finished."
    ;;
*)
    echo "wrong, exit!"
    exit 1
    ;;
esac

5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
  (1) 如果登錄了,則顯示用戶登錄,腳本終止;
  (2) 每3秒鐘,查看一次用戶是否登錄;

#!/bin/bash
while true;do
    if who | grep $1 &> /dev/null;then
        echo "user $1 login!"
        break
    fi
    sleep 3
done

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

while true;do
    read -p "please enter one option: " option
    if [[ $option == "cpu" ]];then
        lscpu
        break
    elif [[ $option == "mem" ]];then
        free -m
        break
    elif [[ $option == "disk" ]];then
        fdisk -l /dev/[sh]d[a-z]
        break
    elif [[ $option == "quit" ]];then
        echo "quit"
        exit 1
    else
        continue
    fi
done

7、寫一個腳本
  (1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
  (2) 提示用戶輸入一個用戶名或輸入“quit”退出;
    當輸入的是用戶名,則調用函數顯示用戶信息;
    當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:

#!/bin/bash
fun_user() {
    grep "^$1" /etc/passwd | awk -F: '{printf "UID: %-5s SHELL: %s\n",$3,$7}'
}

while true;do
    read -p "enter one usrname or 'quit': " option
    if [ -z $option ];then
        continue
    elif [[ $option == "quit" ]];then
        echo "quit"
        break
    elif id $option &> /dev/null;then
        fun_user $option
        continue
    else
        echo "this user is not existed!"
        continue
    fi
done

8、寫一個腳本,完成如下功能(使用函數)
   (1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
   (2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
   (3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;

#!/bin/bash
copy_fun() {
    while true;do
        read -p "please input an executable command or 'quit' to exit: " option

        if [ -z "$option" ];then
            continue
        elif [ "$option" == "quit" ];then
            echo "bye!"
            break
        else
            which $option &> /dev/null
            order_state=$?                       
            if [ $order_state -eq 0 ];then
                order_path=$(which $option)
                echo
                echo "the binary file is: $order_path"
                cp --parents $order_path /mnt/sysroot
                echo "the binary file is copy finished!"
                echo
        
                ldd $order_path &> /dev/null
                ldd_state=$?
                if [ $ldd_state -eq 0 ];then
                    echo "shared library dependencies:"
                    declare -a lib_files
                    lib_files=(`ldd $order_path | grep -E -o "/[^[:space:]]+"`)
                    for i in ${!lib_files[*]};do
                        echo ${lib_files[$i]}
                        cp --parents ${lib_files[$i]} /mnt/sysroot
                    done
                    echo "shared library dependencies are copy finished!"
                else
                    echo "no shared library dependencies!"
                fi
                
                echo
                continue
            else
                echo "no this command!"
                continue
            fi
        fi
    done
}

copy_fun

原創文章,作者:蘿卜,如若轉載,請注明出處:http://www.www58058.com/61238

(0)
蘿卜蘿卜
上一篇 2016-12-13
下一篇 2016-12-13

相關推薦

  • 網絡管理(三)之路由設置、網絡組

    網絡管理(三)之路由設置、網絡組 一、網卡名稱: 1、網絡接口的識別命名udev配置文件:#vim /etc/udev/rules.d/70-persistent-net.rules 2、網卡查看:#dmesg | grep -i eth 或者#ethtool -i eth0            …

    Linux干貨 2016-09-08
  • Centos啟動過程

    啟動第一步--加載BIOS 當你打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以至于計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關信息、設備啟動順序信息、硬盤信息、內存信息、時鐘信息、PnP特性等等。在此之后,計算機心里就有譜了,知道應該去讀取哪個硬件設備了。 啟動第二步--讀取MBR 眾所周知,硬盤上第0磁道第一…

    Linux干貨 2017-03-30
  • 馬哥教育網絡班21期+第二周課程練習

    Linux上的文件管理類命令都有哪些?其常用的方法及其相關示例。     cp:將源文件或者目錄復制到目標文件或者目錄中。     mv:將文件或目錄重新命名,或者將源文件從源目錄移到目標目錄中。     rm:刪除指定的一個文件或者多個文件或者目錄。       &n…

    Linux干貨 2016-07-16
  • 最簡單的Linux系統——更加深入了解Linux啟動過程

    自制一個最簡單的Linux: 1、有一個新的磁盤,并創建分區 2、掛載分區,創建目錄 3、拷貝內核文件 4、創建MBR和grub.conf文件 5、創建/etc/fstab文件,設置開機自動掛載 6、拷貝一個bash程序 7、卸載分區,以新磁盤重啟系統

    Linux干貨 2016-09-11
  • 企業實時同步方案—-Rsync+Sersync

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1433623     在博文企業實時同步方案—-Sersync介紹中我們詳細介紹了Sersync的原理,設計架構以及…

    Linux干貨 2015-03-30

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-12-23 00:37

    贊~幾個腳本的例子總結的不錯~~~繼續加油~

欧美性久久久久