馬哥教育網絡班23期 第10周課堂練習
Linux 系統啟動流程及bash 腳本編程練習
1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1)為硬盤新建兩個主分區;并為其安裝grub;
(2)為硬盤的第一個主分區提供內核和ramdisk文件;為第二個分區提供rootfs;
(3)為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4)為grub提供配置文件;
(5)將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
步驟:
-
首先對這個硬盤進行分區:
boot 所在分區分5G /分區分10G
2.對所在分區進行格式化
3.格式化之后,對其進行掛載
然后在第一個分區上安裝grub 也就是/dev/sdb1 上安裝
驗證一下是否安裝成功:
4.為硬盤的第一個主分區提供內核和ramdisk文件;為第二個分區提供rootfs
也就是copy 內核文件 和 initrd 文件到/myroot/boot 下
5.為grub提供配置文件
[root@localhost grub]# cp /boot/grub/grub.conf ./
6.為rootfs提供bash、ls、cat程序及所依賴的庫文件;
首先,在/myroot/root 下創建類似bin sbin usr dev …這些目錄
然后寫一個腳本,我這里準備了一個腳本,可以復制二進制主文件和庫文件
#!/bin/bash prog=/mnt/sysroot/root usage(){ echo "usage:`basename $0` options is a type shell" exit 1 } quit(){ echo "this programe is exitting..." exit 0 } compare(){ local _shell=`which $1` [ $? -ne 0 ] && usage cp -r $_shell ${prog}$_shell declare -a shellarray=`ldd $_shell | egrep -o \/\.+[[:space:]]` for i in ${shellarray[@]} do #cp -r {prog}${i} # path_lib64=`ls -l ${i} | awk '{if($NF ~/^\//){print $NF}else {print "/lib/"$NF}}'` # if [ ${path_lib64%/*} == "/lib" ];then cp $i $prog/lib # else # cp ${path_lib64} $prog/lib # fi done } if [ $# -eq 0 ];then usage fi case $i in quit) quit ;; *) compare $1 ;; esac
7.最后,把這塊硬盤掛載到新的虛擬機上運行測試結果。
4、寫一個腳本
(1)能接受四個參數:start, stop, restart, status,start: 輸出“starting 腳本名 finished.”
(2)其它任意參數,均報錯退出;
#!/bin/bash # chkconfig: 2345 50 60 # description: this service is testing prog=/tmp/service.file command=`basename $0` start(){ [ -f $prog ] && echo "$command is running.." || touch $prog } stop(){ [ -f $prog ] && rm -rf $prog || echo "$command is stopped.." } restart(){ stop start } status(){ [ -e $prog ] && echo "$command is running.." || echo "$command is stopped.." } Usage(){ echo "Usage: $command {start|stop|restart|status}.." exit 2 } case $1 in start) start ;; stop) stop ;; restart) restart ;; status) status ;; quit) echo "$command is quit.." exit 0 ;; *) Usage ;; esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1)如果登錄了,則顯示用戶登錄,腳本終止;
(2)每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash username=login_user login(){ if who | grep $username;then echo "$username is login.." return 0 else echo "$username is not login.." return 2 fi } while true do login result=$? [ $result -eq 0 ] && break || sleep 3 done
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash cpu(){ cat /proc/cpuinfo } mem(){ free -m } disk(){ fdisk -l } quit(){ echo "`basename $0` is quitting.." return 0 } Usage(){ echo "Usage: `basename $0` {cpu|mem|disk|quit}" return 2 } echo -e " cpu) display cpu info \n mem) display memory info \n disk) display disk info \n quit) quit" while true read -p "please choose above option: " option do case $option in cpu) cpu break ;; mem) mem break ;; disk) disk break ;; quit) quit break ;; *) Usage ;; esac done
7、寫一個腳本
(1)用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2)提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash user(){ id -u $1 &> /dev/null && uid=`id -u $1` || usage echo "$1 uid is $uid" _shell=`grep "^$1" /etc/passwd | awk -F: '{print $NF}'` echo "$1 shell is $_shell" exit 0 } usage(){ echo "your choose option is not a exits user.." return 2 } echo "This programe is display UID and SHELL .." while true do read -p "please enter your choose or quit {USER|quit}: " options case $options in quit) echo "this programe is exitting.." exit 0 ;; *) user $options ;; esac done
8、寫一個腳本,完成如下功能(使用函數)
(1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
(2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
(3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;
此題的答案是第二題的第6個步驟,參照上面的答案即可。
原創文章,作者:luobo3692003,如若轉載,請注明出處:http://www.www58058.com/67089
寫的很好,畫圖可以更好的理解問題,最好不要截屏上來,注意一下上半部分的排版,加油