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
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87434