馬哥教育網絡班21期-第十周課程練習?

1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
流程順序:
POST(加電自檢) –> BootSequence (BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只讀方式) –> switchroot –> /sbin/init –> (/etc/inittab,/etc/init/*.conf)(PS:用戶空間,根據配置文件進行加載)
–> 設定運行級別 –> 系統初始腳本 –> 關閉或啟動對應級別下的服務 –> 啟動終端
各階段說明:
(1)POST:加點自檢,檢查硬件設備是否存在
(2)BootSequence
(3)kernel自身初始化,實現功能
   a 探測可識別到的所有硬件設備;
   b 加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)
   c 以只讀方式掛載根文件系統;
   d 運行用戶空間的第一個應用程序:/sbin/init
(4)/sbin/init管理用戶空間服務進程
(5)啟動運行級別初始化控制:/etc/rc.d/rc#.d
(6)系統初始化腳本:/etc/rc.d/rc.sysinit
(7)啟動終端
啟動開機流程總結:
內核級別:
1. POST做開機啟動時候的硬件檢測功能
2. BootSequence(BIOS)啟動加載主引導分區MBR中的引導加載器程序BootLoader
     在Linux現行的BootLoader是三段劃分(打破446字節限制)的GRUB程序,
stage1:MBR(Master Boot Record);
stage1.5:MBR之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
stage2:磁盤分區(/boot/grub/)
3.Kernel識別硬件、加載驅動、只讀掛載根文件系統、同時交付給用戶空間第一個程序/sbin/init
    (PS:此處特別要注意,系統發行商為了適應多種硬件接口驅動調用,會在第一次安裝系統時候,自動識別硬件接口, 并調用唯一驅動程序來生成ramdisk文件,以內存當磁盤做虛根,驅動接口后會切換到真實的根文件系統上)
CentOS 5系列是initrd,當磁盤映像文件會造成二次緩存緩沖
CentOS 6/7系列改進為initramfs,以文件系統形式可以不二次占用緩存和緩沖
從內核空間切換到用戶空間
用戶空間級別
4./sbin/init接管后,根據其配置文件來初始化;
5.根據/sbin/init中的配置會設置默認運行級別,以及一些在/etc/init.d/設置的開機服務;
6./etc/rc.d/rc.sysinit運行系統初始化腳本,完成系統初始化;
7.關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務;
8.設置登錄終端

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

新增一塊硬盤,識別為/dev/sdc,
#fdisk /dev/sdc
(n;p;+5G;w)
新建兩個主分區/dev/sdb1 /dev/sdb2

(1)
在/mnt 下新建目錄boot rootfs,執行如下命令

#mkdir /mnt/boot  /mnt/rootfs
#mount /dev/sdc1 /mnt/boot 
#/mount /dev/sdc2 /mnt/rootfs
#grub-install --root-directory=/mnt  /dev/sdc
#cd /mnt/boot/grub
#ls

(2)

#cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz-2.6.32-431.el6.x86_64
#cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/vmlinuz-2.6.32-431.el6.x86_64
#cd /mnt/rootfs
#mkdir bin boot dev etc home lib lib64 media misc mnt opt proc root sbin srv sys users usr var

(3)

#cp /bin/bash /mnt/roofs/bin
#cp /bin/ls /mnt/roofs/bin
#cp /bin/cat /mnt/rootfs/bin
#for i in `ldd /bin/bash | grep -o "[^[:space:]]*/lib[^[:space:]]*"`; do cp $i /mnt/rootfs/lib64/ ; done
#for i in `ldd /bin/ls| grep -o "[^[:space:]]*/lib[^[:space:]]*"`; do cp $i /mnt/rootfs/lib64/ ; done
#for i in `ldd /bin/cat | grep -o "[^[:space:]]*/lib[^[:space:]]*"`; do cp $i /mnt/rootfs/lib64/ ; done

(4)

#vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS-hyc
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/sdc1 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-431.el6.x86_64.img

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

安裝system-config-kickstart
#yum install -y system-config-kickstart
#system-config-kickstart

1.png

打開一個ks文件

2.png

根據需要配置好相關的內容,將文件另存為myks.cfg

(2)創建引導鏡像

在/tmp 目錄下創建目錄myiso ,在myiso 目錄下創建isolinux 目錄;

#mkdir -p /tmp/myiso/isolinux

將光盤上的isolinux 下的文件都拷貝到新建的目錄下;

#cp /media/isolinux/* /tmp/myiso/isolinux/ 
將myks.cfg文件復制到/tmp/myiso 目錄下;

3.png

創建ISO文件系統
# mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6.8 x86_64 boot" -b /tmp/myiso/isolinux/isolinux.bin -c /tmp/myiso/isolinux/boot.cat -o /root/boot.iso myiso

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

#!/bin/bash 
#
case "$1" in
  start)
    echo "starting $0 finished"
    ;;
  stop)
    echo "$0 is stopped"
    ;;
  restart)
    echo "$0 is restarted"
    ;;
  status)
    echo "$0 status"
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}" || true
    exit 1
esac

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

#!/bin/bash
#
read -p "Please enter your user name:" username
while true ;do
    currentU=`who | cut -d" " -f1|sort |uniq | xargs`
    if echo $currentU | grep -w ${username};then
      echo "$username is longin"
      exit
    fi
    sleep 3
done

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 "Please slect one option above:" option
case "$option" in
cpu)
  lscpu
   ;;
mem)
  cat /proc/meminfo
  ;;
disk)
  fdisk -l
  ;;
quit)
 echo "Quit..."
 exit 0
  ;;
*)
 echo "wrong args,select option 1) cpu 2) mem 3) disk 4) quit"
 /bin/bash $0
esac

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

#!/bin/bash
#
info() {
    id $username &> /dev/null
    if [ $? -ne 0 ];then
            echo "the user is not exist!"
    else
            grep "^$username" /etc/passwd |awk -F: '{printf "USER ID:%u\nUSER SHELL:%s\n" ,$3,$NF}'
    fi
}
while true;do
    read -p "please input an username or quit:" username
    if [ $username == "quit" ];then
        exit 0
    else
        info
    fi
done

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

#!/bin/bash
#
DEST_PATH=/mnt/sysroot
read -p "please input one executable command:" CMD
path=`which ${CMD}`
pri_lib() {
  echo "the shared library dependencies:"
  ldd ${path}
}
cmd_lib() {
  CPATH=`echo $1 | grep -v "^alias" | grep -o "/.*/"`
  [ ! -d $DEST_PATH$CPATH ] && mkdir -p $DEST_PATH$CPATH
  [ ! -e $DEST_PATH$1 ] && cp $1 $DEST_PATH$CPATH
}
lib_cp() {
    for i in `ldd $1 | grep -o "/[^[:space:]]*"`;
    do
      cmd_lib $i 
    done
    echo "lib copy complete"
}
pri_lib
cmd_lib ${path}
lib_cp ${path}

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

(0)
ππ
上一篇 2016-09-26
下一篇 2016-09-26

相關推薦

  • sed編輯器使用

     簡述       sed編輯器被稱作流編輯器,和普通的交互式文本編輯器恰好相反。在交互式文本編輯器中(比如vim), 你可以用鍵盤命令來交互式地插入、刪除或替換數據中的文本。流編輯器則會在編輯器處理數據之前基于預先 提供的一組規則來編輯數據流。sed編輯器可以根據命令來處理數據流中的數據,這些命令…

    2017-06-19
  • 馬哥教育網絡班20期+第3周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who |cut -d " " -f1 |sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 [root@localhost ~]# who|tai…

    Linux干貨 2016-06-29
  • 邏輯卷LVM的實現

    LVM(Logical Volume Manager,邏輯卷管理)可以實現把多個實體硬盤分區整合在一起,當作一個硬盤來重新操作處理。最重要的是LVM不像傳統分區一旦確定分區大小就不能再調整,它允許我們彈性的調整分區及文件系統容量! 通過幾道練習題來說明LVM的實現 1、創建一個至少有兩個PV組成的大小為20G的名為testvg的VG;要求PE大小為16MB,…

    2017-06-25
  • Linux系統之用戶和組

    Linux系統之用戶和組 1、什么是用戶 用戶:資源獲取標識符,資源分配,安全權限模型的核心要素之一 2、沒有用戶,操作系統可否正常執行? 答案是肯定的 在Linux系統上,用戶管理是基于用戶名和密碼的方式進行資源的分配, Username/UID分為以下類別:     管理員:root, 0  &…

    Linux干貨 2016-08-04
  • N25期第六周作業

    請詳細總結vim編輯器的使用并完成以下練習題 1.復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加# sed -r 's/^[^[:space:]]+/#&/g' /tmp/rc.sysinit :%s/^[^[:space:]]\+/#&a…

    Linux干貨 2016-12-26
  • bash特性之命令行展開功能應用示例

                       bash特性之命令行展開功能應用示例 1.創建/tmp的目錄下:a_c,a_d,b_c,b_d 創建命令:mkdir -pv /tmp/{a,…

    Linux干貨 2017-07-09

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-27 09:31

    寫的很好,如果腳本在添加一些判斷條件的會更好一些

欧美性久久久久