1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本 --> 關閉或啟動對應級別下的服務 --> 啟動終端 POST: 加電自檢; ROM:CMOS BIOS:Basic Input and Output System :基本輸入輸出系統 主機先激活CPU ROM+RAM 檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常Boot Sequence(BIOS) 按次序查找各引導設備,第一個有引導程序的設備即為本次啟動用到設備;bootloader: 引導加載器,程序Boot Loader (MBR)446: bootloader64: fat2: 55AAGRUB: stage1:stage1的代碼直接存在于MBR,是后續引導的入口,無識別文件系統的能力。 stage1.5: MBR之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統,具有識別文件系統的能力。 stage2:加載磁盤分區(/boot/grub/) kernel: 自身初始化: 探測可識別到的所有硬件設備; 加載硬件驅動程序;(有可能會借助于ramdisk加載驅動) 以只讀方式掛載根文件系統; 運行用戶空間的第一個應用程序:/sbin/init init程序的類型: SysV: init, CentOS 5 配置文件:/etc/inittab Upstart: init, CentOS 6 配置文件:/etc/inittab, /etc/init/*.conf Systemd:systemd, CentOS 7 自己能加載服務 配置文件:/usr/lib/systemd/system, /etc/systemd/systemramdisk --> ramfs CentOS 5: initrd, 工具程序:mkinitrd CentOS 6: initramfs, 工具程序:mkinitrd, dracutsh 設置運行級別 運行級別:為了系統的運行或維護等應用目的而設定; 0-6:7個級別 0:關機 1:單用戶模式(root, 無須登錄), single, 維護模式; 2: 多用戶模式,會啟動網絡功能,但不會啟動NFS;維護模式; 3:多用戶模式,正常模式;文本界面; 4:預留級別;可同3級別; 5:多用戶模式,正常模式;圖形界面; 6:重啟 /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) 清理操作;
-
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文件以及一個引導鏡像。描述其過程。
創建kickstart文件的方式: (1) 直接手動編輯; 依據某模板修改; (2) 可使用創建工具:system-config-kickstart (CentOS 6) 依據某模板修改并生成新配置; 檢查ks文件的語法錯誤:ksvalidator # ksvalidator /PATH/TO/KICKSTART_FILE 創建引導光盤: # 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) 每3秒鐘,查看一次用戶是否登錄; #!/bin/bash
#!/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 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 "Enter a option: " option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option, Enter again: " option done if [ "$option" == 'cpu' ]; then lscpu elif [ "$option" == 'mem' ]; then cat /proc/meminfo elif [ "$option" == 'disk' ]; then fdisk -l else echo "Quit" exit 0 fi
-
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
原創文章,作者:N21_ Dominic,如若轉載,請注明出處:http://www.www58058.com/45236