1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
POST(Power On Self Test):
檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。
加載BIOS(Basic Input and Output System):
根據在BIOS中設置的系統啟動順序來搜索用于啟動系統的驅動器(硬盤、光盤、U盤等)。在平時的啟動過程中,大多為硬盤啟動,基于此,BIOS會讀取硬盤的第0磁道的第1扇區(MBR)的內容來引導啟動。
BOOT Sequence:
按次序查找各引導設備,第一個有引導程序的設備即為本次啟動用到設備
MBR(Master Boot Record):
三部分組成,分別是主引導程序(Bootloader)、硬盤分區表DPT(Disk Partition Table)和magic number。
Bootloader:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核。
在Linux中常用的主引導程序有LILO(LInux LOader)和GRUB(GRand Uniform Bootloader),此處以GRUB引導為例。
啟動引導程序GRUB:
stage1:stage1的代碼直接存在于MBR,是后續引導的入口,無識別文件系統的能力。
stage1.5: MBR之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統,具有識別文件系統的能力。
stage2:加載磁盤分區(/boot/grub/)
啟動內核:
當stage2被載入內存執行時,首先會解析grub的配置文件/boot/grub/grub.conf,然后加載內核鏡像到內存中,并將控制權轉交給內核。而內核會立即作自身初始化。
-
探測可識別的所有硬件設備
-
加載硬件驅動程序(可能會借助于ramdisk加載驅動)
-
以只讀方式掛載rootfs
-
運行用戶空間的第一個應用程序:/sbin/init
運行init程序
-
CentOS 5:SysV
-
CentOS 6:Upstart
-
CentOS 7:Systemd
設置默認運行級別
-
CentOS 5:/etc/inittab
-
CentOS 6:/etc/inittab,/etc/init/*.conf
-
CentOS 7:default.target–>/usr/lib/systemd/system/*.target
運行系統初始腳本,完成系統初始化
/etc/rc.d/rc.sysinit
啟動內核模塊
/etc/modules.conf
/etc/modules.d/*
關閉對應級別下應關閉的服務,啟動需要啟動的服務
/etc/rc.d/rc#.d/*
執行自定義引導程序
/etc/rc.d/rc.local
設置登陸終端
/sbin/mingetty
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文件以及一個引導鏡像,描述其過程;
可使用system-config-kickstart圖形化工具可視化操作完成生成ks文件 制作鏡像:# 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)每三秒鐘,查看一次用戶是否登錄
#!/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
men) dispaly memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并請求用戶重新選擇,直到其給出正確的選擇為止;
#!/bin/bash cat << EOF cpu) show cpu info; mem) show memory info; disk) show disk info; quit) Quit ======================= EOF read -p "Please enter an option:" option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option,enter again:" option done case "$option" in cpu) lscpu ;; mem) cat /proc/meminfo ;; disk) fdiskc -l ;; quit) echo "Quit!" && exit 0 ;; esac
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
原創文章,作者:Jeason,如若轉載,請注明出處:http://www.www58058.com/44521