1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
POST加電自檢—— 根據bios設定,順序查找引導設備—— 讀取引導設備MBR(共512字節,前446為bootloader,后64表示分區信息,后2表示bootloader有效性),加載bootloader程序—— 以grub為例,grub1.0階段將零磁道一扇區加載到內存,grub1.5階段加載文件系統驅動,grub2.0讀取/boot/grub/grub.conf,根據配置文件加載內核—— 加載內核(通過ramdisk加載硬件驅動,并以只讀方式掛載根文件系統)——運行/sbin/init——準備系統初始化(讀取/etc/inittab,使用文件中配置啟動相應級別)—— 系統初始化,運行/etc/rc.d/rc.sysinit—— 以讀寫方式重新掛載根文件系統,設置主機名,啟動udev/selinux,掛載/etc/fstab文件中文件系統,激活swap設備,設置系統時鐘,根據/etc/sysctl.conf文件設置內核參數,激活lvm和raid,加載額外的設備驅動,清理操作,將系統啟動log寫入/etc/log/dmesg—— 根據運行級別運行/etc/rc.d/rc.#—— 運行/etc/rc.d/rc.local腳本—— 啟動終端,打印登錄提示符
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 root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 initrd /initrmfs.img defaut=0 timeout=5 title CenOS root (hd0,0) kernel /vmlinuz-2.6.32-l42.el6.i686 ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs-2.6.32-642.el6.i686.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) 依據某模板修改并生成新配置; http://172.16.0.1/centos6.x86_64.cfg 檢查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 input one order:" ordername case $ordername in start) echo "starting $0 finished" exit 0 ;; stop) echo "stopping $0 finished" exit 0 ;; restart) echo "restarting $0 finished" exit 0 ;; status) echo "statusing $0 finished" exit 0 ;; *) echo "Wrong" exit 1 ;; esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash # # read -p "Enter a user name: " username until who | grep "^$username" &> /dev/null; do sleep 3 done echo "$username logged on." exit 0
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash # # read -p "Enter a choice: " 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) fdisk -l ;; *) echo "Quit..." exit 0 ;; esac
7、寫一個腳本
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash # # func1() { useruid=$(grep "^$1" /etc/passwd|cut -d: -f3) usershell=$(grep "^$1" /etc/passwd|cut -d: -f7) echo -e -n "user $1 UID is :$useruid\n SHELL is :$usershell\n" } read -p "please input a user name or \"quit\" :" option while [ $option != "quit" ];do id $option &> /dev/null && result=0 || result=1 case $result in 0) func1 $option ;; 1) read -p "please input a username or \"quit\":" option continue ;; esac read -p "please input a user name or \"quit\" again:" option done echo "quit..."
8、寫一個腳本,完成如下功能(使用函數)
(1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
(2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
(3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;
#!/bin/bash # # target=/mnt/sysroot [ -d $target ] || mkdir /mnt/sysroot read -p "please input a command which you want to cp to /mnt/sysroot,and \"quit\" is over:" cmdname libcp() { for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do libdir=$(dirname $lib) [ -d $target$libdir ] || mkdir -p $target$libdir [ -f $target$lib ] || cp $lib $target$lib done } while [ "$cmdname" != 'quit' ]; do if ! which $cmdname &> /dev/null; then read -p "No such command, enter again: " cmdname continue fi cmdname=$(which --skip-alias $cmdname) cmnddir=$(dirname $cmdname) [ -d $target$cmnddir ] || mkdir -p $target$cmnddir [ -f $target$cmdname ] || cp $cmdname $target$cmdname libcp $cmdname read -p "Another command(quit): " cmdname done
原創文章,作者:N21-孟然,如若轉載,請注明出處:http://www.www58058.com/47526
每一個問題的解答過程,要寫關鍵步驟