1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
Centos系統啟動過程分內核空間啟動和用戶空間啟動:
內核空間啟動流程:
- POST: post加點自檢,檢測計算機基本5大件是否完好,計算機可被正常點亮。
- BootSequence: 位于ROM上的BIOS的BootSequence來選擇啟動順序
- Bootloader: 決定啟動順序后,在啟動設備上的MBR的前446bytes加載bootloader
- Ramdisk: bootloader需要引導內核的加載,在這過程需要加載ramdisk來驅動真正的內核加載
- rootfs: 內核加載后將根文件系統以只讀的方式掛載
- /sbin/init: 啟動1號進程,/sbin/init,接下來的系統的管理都交給了1號進程
用戶空間啟動流程:
- 設置默認的運行級別
- 運行系統初始化腳本(/etc/rc.d/rc.sysinit),完成系統初始化
- 關閉對應級別下需要關閉的服務
- 啟動對應級別下需要啟動的服務
- 設置登陸終端
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
- (1) 為硬盤新建兩個主分區;并為其安裝grub;
- (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
- (3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
- (4) 為grub提供配置文件;
- (5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
以下是我的分區: /dev/sdb1 boot 200M /dev/sdb2 / 2G /dev/sdb3 swap 1G 在/mnt下創建/boot /sysroot目錄 掛載/dev/sdb1到/mnt/boot,/dev/sdb2到/mnt/sysroot 創建grub # grub-install --root-directory=/mnt /dev/sdb 復制linux內核與ramdisk # cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz # cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img 創建grub.conf # cd /mnt/boot/grub # vim grub.conf default 0 timeout 5 title Centos (zgx) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img 創建根文件系統目錄 # cd /mnt/sysroot # mkdir bin sbin dev etc home lib lib64 media mnt proc root sbin sys tmp usr var 拷貝幾個程序 # cp /bin/bash /mnt/sysroot/bin # ldd /bin/bash linux-vdso.so.1 => (0x00007ffcdc8d5000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f973fc3a000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f973fa36000) libc.so.6 => /lib64/libc.so.6 (0x00007f973f6a1000) /lib64/ld-linux-x86-64.so.2 (0x00007f973fe64000) # cp /lib64/libtinfo.so.5 lib64/ # cp /lib64/libdl.so.2 lib64/ # cp /lib64/libc.so.6 lib64/ # cp /lib64/ld-linux-x86-64.so.2 lib64/ # sync 將這塊硬盤作為虛擬機的啟動盤,可以正常的啟動小linux
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
在圖形界面界面制作安裝system-config-kickstart 在圖形界面制作個kickstart #修改引導鏡像的內核參數 #mount /dev/cdrom /mnt/cdrom #mkdir /myboot #cp /mnt/cdrom/ioslinux /myboot #cp ks.cfg /myboot #cd /mnt/cdrom/ioslinux #vim isolinux.cfg ... label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img ks=cdrom:/ks.cfg ... #cd / #重新封裝引導鏡像 #mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "Centos 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot 將引導鏡像進行安裝可以進行自動安裝
4、寫一個腳本
-
(1) 能接受四個參數:start, stop, restart, status
start: 輸出“starting 腳本名 finished.”
… - (2) 其它任意參數,均報錯退出;
#!/bin/bash pidfile=/var/run/myservice.pid start() { if [ -e $pidfile ];then echo "myservice aleardy start." else pid=$$ echo "${pid}" > $pidfile echo "starting myservice finished" fi } stop() { if [ -e $pidfile ];then rm -f $pidfile echo "stopping myservice finished" else echo "myservice is not running" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) if [ -e $pidfile ];then echo "myservice is running" else echo "myservice is not running" fi ;; *) echo "Usage: $0 [start|stop|restart|status]" esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
- (1) 如果登錄了,則顯示用戶登錄,腳本終止;
- (2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash while true;do if who | grep ansible &> /dev/null;then echo "ansible aleardy login." break else sleep 3 continue fi 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 choose:" choose case ${choose} in cpu) lscpu ;; mem) free -m ;; disk) df -HT ;; quit) exit ;; *) continue esac done
7、寫一個腳本
- (1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
-
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash user() { grep "^$1\>" /etc/passwd |awk -F':' '{print "user",$1,"uid",$3}' } while true;do read -p "enter a user:" username if [ $username == 'quit' ];then break else user $username echo "enter quit to exit" fi done
8、寫一個腳本,完成如下功能(使用函數)
- (1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
- (2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
- (3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;
規則同上面命令相關的要求;
#!/bin/bash target=/mnt/sysroot cmd() { if which $cmd $> /dev/null;then cmdpath=`which --skip-alias $cmd` else echo "no such command" return 6 fi } cmdcopy() { cmddir=`dirname $1` [ -d ${target}${cmddir} ] || mkdir -p ${target}${cmddir} [ -f ${target}${1} ] || cp $1 ${target}${cmddir} } libcopy(){ for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do libdir=`dirname $lib` [ -d ${target}${libdir} ] || mkdir -p ${target}${libdir} [ -f ${target}${lib} ] || cp $lib ${target}${libdir} done } while true;do read -p "enter a command:" cmd if [ "$cmd" == 'quit' ];then echo quit exit 0 fi cmd $cmd [ $? -eq 5 ] && continue cmdcopy $cmdpath libcopy $cmdpath done
原創文章,作者:N25_隨心,如若轉載,請注明出處:http://www.www58058.com/71032
作業品質保持的很好,繼續加油。