馬哥教育網絡班21期+第10周課程練習
1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> Kernel+ramdisk(initrd) --> rootfs --> /sbin/init --> (/etc/inittab,/etc/init/*.conf) (1)加電自檢:POST 通電后主板CMOS中的BIOS進行硬件自檢; (2)BIOS,引導加載次序:Boot Squence 按照BIOS中的設備啟動順序,找到第一個有引導程序的設備作為啟動的設備; (3)bootloader 引導加載器,引導并提供菜單,讓用戶選擇要啟動的系統把選定的內核裝載到 內存中的特定空間中,解壓、展開,并把系統控制權限移交給內核; (4)kernel初始化操作 探測可識別的所有硬件設備;加載硬件驅動;以只讀方式掛在根文件系統; 運行用戶空間的第一個應用程序:/sbin/init (5)init階段 根據對應的運行級別運行對應的運行級別定義的腳本 (6)運行初始化腳本 系統初始化腳本對應文件:/etc/rc.d/rc.sysinit,設置主機名等信息,檢測 根文件系統,激活swap等; (7)啟動系統服務 根據/etc/rc.d/init.d目錄下的腳本啟動相應的系統服務;
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
-
(1) 為硬盤新建兩個主分區;并為其安裝grub;
-
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
-
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
-
(4) 為grub提供配置文件;
-
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
[root@localhost ~]# lsblk /dev/sdb NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 60G 0 disk ├─sdb1 8:17 0 10G 0 part └─sdb2 8:18 0 10G 0 part [root@localhost ~]# mkfs.ext4 /dev/sdb1 [root@localhost ~]# mkfs.ext4 /dev/sdb2 [root@localhost ~]# mkdir /mnt/{boot,sysroot} [root@localhost ~]# mount /dev/sdb1 /mnt/boot/ [root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/ [root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb [root@localhost ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img [root@localhost ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz [root@localhost ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS 6 root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img [root@localhost ~]# bash cpcommand.sh #第八題的腳本 將ls,bash,cat命令及所依賴的庫文件復制到/mnt/sysroot/中, 并將新加的磁盤掛載到新虛擬機中啟動測試
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
創建kickstart文件的方式: (1) 直接手動編輯; 依據某模板修改; (2) 可使用創建工具:system-config-kickstart (CentOS 6) 依據某模板修改并生成新配置; [root@localhost ~]# yum install system-config-kickstart -y [root@localhost ~]# system-config-kickstart #使用kickstart圖形另存為一個kickstart文件 kickstart文件的格式: 命令段:指明各種安裝前配置,如鍵盤類型等; 程序包段:指明要安裝的程序包組或程序包,不安裝的程序包等; %packages @group_name package -package %end 腳本段: %pre: 安裝前腳本 運行環境:運行于安裝介質上的微型Linux環境 %post: 安裝后腳本 運行環境:安裝完成的系統; 命令段中的命令: 必備命令 authconfig: 認證方式配置 authconfig --useshadow --passalgo=sha512 bootloader:bootloader的安裝位置及相關配置 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto crashkernel=auto rhgb rhgb quiet quiet" keyboard: 設定鍵盤類型 lang: 語言類型 part: 創建分區 rootpw: 指明root的密碼 timezone: 時區 可選命令 install OR upgrade text: 文本安裝界面 network firewall selinux halt poweroff reboot repo user:安裝完成后為系統創建新用戶 url: 指明安裝源 創建引導光盤: 1)復制系統安裝光盤/Packages /repodata外的所有文件到目錄/myiso/ 2)創建引導光盤鏡像 # 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) 其它任意參數,均報錯退出;
[root@localhost ~]# cat status.sh #!/bin/bash # [ -d /var/log/subsys ] || mkdir -p /var/log/subsys lockfile=/var/log/subsys/$0 Usage(){ echo "Usage:$0 (start|stop|restart|status)" } Start(){ [ -e $lockfile ] && echo "$0 already Started." || touch $lockfile && echo "Starting $0 finished." } Stop(){ [ -e $lockfile ] && rm -f $lockfile && echo "Stoping $0 finished." || echo "$0 no Running." } Status(){ [ -e $lockfile ] && echo "$0 is Running." || echo "$0 is Stopped." } [ $# -ne 1 ] && Usage && exit 1 case $1 in start) Start;; stop) Stop;; restart) Stop&&Start;; status) Status;; *) Usage exit 2 ;; esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
-
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
-
(2) 每3秒鐘,查看一次用戶是否登錄;
[root@localhost ~]# cat userlogin.sh #!/bin/bash # [ $# -ne 1 ] && echo "Usage:$0 username" && exit 1 while true;do who | grep "^\<$1\>" &>/dev/null && echo "$1 Login." && exit 0 || sleep 3 done
6、寫一個腳本,顯示用戶選定要查看的信息;
-
cpu) display cpu info
-
mem) display memory info
-
disk) display disk info
-
quit) quit
-
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
[root@localhost ~]# cat display.sh #!/bin/bash # cat << EOF cpu) display cpu info mem) display memory info disk) display disk info quit) quit ======================== EOF Chose(){ read -p "Choose a option:(cpu|mem|disk|quit)" option } Chose until [ $option == "quit" ];do case $option in cpu) lscpu && Chose;; mem) free -m && Chose;; disk) lsblk && Chose;; *) echo "Error,chose again!" && Chose;; esac done
7、寫一個腳本
-
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
-
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
-
當輸入的是用戶名,則調用函數顯示用戶信息;
-
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
[root@localhost ~]# cat uidshell.sh #!/bin/bash Show(){ uid=`id -u $1` usershell=`grep "^\<$1\>" /etc/passwd | cut -d: -f7` echo "UID:$uid Shell:$usershell" && chose } chose(){ read -p "Enter a Username or quit:" username } chose until [ $username == "quit" ];do ! id $username &>/dev/null && echo "No such User." && chose || Show $username done
8、寫一個腳本,完成如下功能(使用函數)
-
(1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
-
(2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
-
(3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;
[root@localhost ~]# cat cpcommand.sh #!/bin/bash # dir=/mnt/sysroot cpbin(){ bincmddir=`echo $cmd | grep -o -E "^/.*/"` [ -d $dir$bincmddir ] || mkdir -p $dir$bincmddir [ -z $dir$cmd ] || cp $cmd $dir$bincmddir } cplib(){ liblist=`/usr/bin/ldd $cmd | grep -o "[^[:space:]]*/lib[^[:space:]]*"` for lib in $liblist;do cmddir=`echo $lib | grep -o -E "^/.*/"` [ -d $dir/$cmddir ] || mkdir -p $dir$cmddir [ -z $dir/$lib ] || cp $lib $dir$cmddir done } while true;do read -p "Enter a Command:(Commamd|quit)" command [ $command == "quit" ] && echo "quit..." && exit 0 which $command &>/dev/null && cmd=`which --skip-alias $command` || echo "No correct Command." [[ -x $cmd ]] && cpbin $command && cplib $command || echo "No correct Command." done
原創文章,作者:N21_孤狼,如若轉載,請注明出處:http://www.www58058.com/60676