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
打開一個ks文件
根據需要配置好相關的內容,將文件另存為myks.cfg
(2)創建引導鏡像
在/tmp 目錄下創建目錄myiso ,在myiso 目錄下創建isolinux 目錄;
#mkdir -p /tmp/myiso/isolinux
將光盤上的isolinux 下的文件都拷貝到新建的目錄下;
#cp /media/isolinux/* /tmp/myiso/isolinux/
將myks.cfg文件復制到/tmp/myiso 目錄下;
創建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
寫的很好,如果腳本在添加一些判斷條件的會更好一些