第十周
1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
POST–>BootSequence(BOIS)–>BootLoader(MBR)–>Kernel(ramfs或者ramdisk)–>rootfs–>rootfsswitch–>/sbin/init–>/etc/inittab,/etc/init/*.conf–>設定默認運行的級別–>系統初始化腳本–>關閉和開啟對應級別下的服務–>啟動終端
POST:檢測硬件設備,包括硬盤內存等等
BootSequence:主要是設定BIOS的啟動順序。
BootLoader:根據BIOS設定的啟動順序去加載啟動文件,位于磁盤中的MBR部分
Kernel:把ram空間當成磁盤空間使用,形成一個小的rootfs,然后去加載內核文件
rootfs:加載真正的根文件系統
rootswitch:完成兩個根的轉換。
/sbin/init:執行第一個用戶空間程序,這個程序會引導以后的用戶空間的初始化過程
/etc/inittab,/etc/init/*.conf:加載init級別加載/etc/init/*.conf 這些配置文件。
設定默認運行的級別:根據加載的inittab文件設定的init級別去定義init級別
系統初始化腳本:
關閉和開啟對應級別下的服務:開啟和關閉當前init級別下的服務信息
啟動終端:啟動終端
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;并為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
# fdisk /dev/sdb
# partx -a /dev/sdb
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
# grub-install –root-directory=/mnt/sysroot /dev/sdb
# cp /boot/vmlinuz-2.6.32-504.el6.x86_64 /mnt/boot/vmlinuz
# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/initramfs.img
# cp /boot/grub/grub.conf /mnt/boot/grub/grub.conf
# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title CentOS 6 (test new)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda1 selinux=0 init=/bin/bash
initrd /initramfs.img
# mkdir -pv /mnt/sysroot/{bin,sbin,lib,lib64,etc,home,root,media,mnt,dev,tmp}
# cp /bin/{bash,ls,cat} /mnt/bin
# cp `ldd /bin/{bash,ls,cat}|grep -eo "/lib.*[[:space:]]"| sort -u` /mnt/lib
# sync
# init 6
創建一個新的虛擬機掛載掛載新的硬盤然后啟動。
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
4、寫一個腳本
(1) 能接受四個參數:start, stop, restart, status
start: 輸出“starting 腳本名 finished.”
…
(2) 其它任意參數,均報錯退出;
#!/bin/bash
#
case $1 in
start)
echo "starting $0 finished."
;;
stop)
echo "stoping $0 finished."
;;
restart)
echo "restarting $0 finished."
;;
status)
echo "show $0 status."
;;
*)
echo "The para error"
exit
esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash
#
while [ 0 -eq 0 ];do
if who|grep "magedu" &>/dev/null;then
echo "The user magedu login already"
exit 44
fi
sleep 3
echo "wait user magedu login"
done
或者
#!/bin/bash
#
until [ 1 -eq 2 ];do
if who|grep "magedu" &> /dev/null;then
exit 22
fi
sleep 3
done
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash
#
echo -e "cpu) display cpu info\nmem) display memory info\ndisk) display disk info\nquit) quit\n"
while [ 0 -eq 0 ];do
read -p "please input you choice: " i
case $i in
"cpu")
lscpu
break
;;
"mem")
free -m
break
;;
"disk")
df -lh
break
;;
"quit")
echo "quit"
break
;;
*)
echo "Eror choice,please input again"
;;
esac
done
7、寫一個腳本
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash
#
function User {
echo "UID=`id -u $yonghu`"
SHELL=`grep $yonghu /etc/passwd|awk -F: '{printf $7}'`
echo "SHELL=$SHELL"
}
while [ 0 -eq 0 ];do
read -p "please input a para(A user or quit): " yonghu
if id $yonghu&>/dev/null;then
User
elif [ $yonghu == "quit" ];then
break
else
echo -e "no such this user\n"
fi
done
echo "End"
8、寫一個腳本,完成如下功能(使用函數)
(1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
(2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
(3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;
#!/bin/bash
#
sys=/mnt/sysroot
read -p "Input a command: " comd
path=`whereis $comd|awk '{print $2}'`
if [ -d `dirname ${sys}${path}` ];then
cp $path ${sys}${path}
else
mkdir -p ${sys}${path}
cp $path ${sys}${path}
fi
for i in $(ldd $path|grep -o "/.*lib.*\.so.*\.[^[:space:]]");do
if [ -d `dirname ${sys}$i` ];then
cp -r $i `dirname ${sys}$i`
else
mkdir -p ${sys}`dirname ${sys}$i`
cp -r $i `dirname ${sys}$i`
fi
done
原創文章,作者:N22-北京-喜歡就好,如若轉載,請注明出處:http://www.www58058.com/56922
寫的還是比較詳細的,有個地方 需要注意下 while [ 0 -eq 0 ] 其實就是 while true 做循環. 還有那個until 的用法也需要看下。加油~