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
贊~幾個腳本的例子總結的不錯~~~繼續加油~