一、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
A.POST加電自檢
主板在接通電源后,系統首先由POST程序來對內部各個設備進行檢查,自檢中如發現有錯誤,將按兩種情況處理:對于嚴重故障(致命性故障)則停機,此時由于各種初始化操作還沒完成,不能給出任何提示或信號;對于非嚴重故障則給出提示或聲音報警信號,等待用戶處理。
B.BIOS Sequence啟動引導階段
自檢通過之后,按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備。一般電腦是按”F2″或”Del”鍵等等進入BIOS,在里面我們可以調整硬盤的啟動順序。找到第一個有引導程序的設備后,BIOS會找到設備中的MBR,讀取其中的Bootloader。
C.GRUP引導階段
這時候就可以看到我們的Centos系統了,但是一般都不需要操作,會自動啟動系統。其實我們也可以自己手動啟動系統的。
1).手動在grub命令行接口啟動系統:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
2).grub的命令行接口:
e: 編輯模式,用于編輯菜單;
c: 命令模式,交互式接口;
help: 獲取幫助列表
help KEYWORD: 詳細幫助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#) 設定grup的根設備
kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;
boot: 引導啟動選定的內核;
3).配置文件:/boot/grub/grub.conf
配置項:
default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始;
timeout=#:指定菜單項等待選項選擇的時長;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
hiddenmenu:隱藏菜單;
password [–md5] STRING: 菜單編輯認證;
title TITLE:定義菜單項“標題”, 可出現多次;用來引導多個內核或者操作系統
root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
password [–md5] STRING: 啟動選定的內核或操作系統時進行認證
D.kernel加載內核階段內核會自身初始化
探測可識別到的所有硬件設備;加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)以只讀方式掛載根文件系統;運行用戶空間的第一個應用程序:/sbin/init5.init初始化階段內核加載完畢,會運行init程序,init進程起來后,系統啟動的控制權移交給init進程/sbin/init進程是所有進程的父進程,當init起來之后,它首先會讀取配置文件/etc/inittab,進行以下工作:
1).執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此系統基本算運行起來了,后面需要進行運行級別的確定及相應服務的啟動;
2).確定啟動后進入的運行級別;
3).執行/etc/rc.d/rc,該文件定義了服務啟動的順序是先K后S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rcn.d(n=0~6)目錄下,所有的文件均鏈接至/etc/init.d下的相應文件。
4).有關key sequence的設置
5).有關UPS的腳本定義
6).啟動虛擬終端/sbin/mingetty
7).在運行級別5上運行X配置文件:/etc/inittab每行定義一種action以及與之對應的processid:runlevels:action:processid:一個任務的標識符;runlevels:在哪些級別啟動此任務;#,###,可以為空,表示所有級別;action:在什么條件下啟動此任務;process:任務;(腳本或程序)action:wait:等待切換至此任務所在的級別時執行一次;respawn:一旦此任務終止,就自動重新啟動之;initdefault:設定默認運行級別;此時,process省略;sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動;chkconfig命令:管控/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態;查看:chkconfig –list [name]添加:chkconfig –add name刪除:chkconfig –del name修改指定的鏈接類型:chkconfig [–level LEVELS] name–level LEVELS:指定要控制的級別;默認為2345;
init命令:
級別切換:init #
級別查看:who -r
注:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc.local (/etc/rc.local)腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可。
二、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;?
(1) 為硬盤新建兩個主分區;并為其安裝grub;?
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
?(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;?
(4) 為grub提供配置文件;?
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
~]# cat /proc/partitions
major minor? #blocks? name
8? ? ? 16? 83886080 sdb
8? ? ? 17? 10485760 sdb1
8? ? ? 18? ? ? ? ? 1 sdb2
8? ? ? 21? ? 5242880 sdb5
8? ? ? 22? ? 5242880 sdb6
8? ? ? 23? ? 5242880 sdb7
8? ? ? 24? ? 5242880 sdb8
8? ? ? 25? ? 5242880 sdb9
8? ? ? ? 0? 125829120 sda
8? ? ? ? 1? ? 1048576 sda1
8? ? ? ? 2? 124779520 sda2
8? ? ? 32? ? 5242880 sdc
8? ? ? 33? ? 2097152 sdc1
8? ? ? 34? ? 2097152 sdc2
8? ? ? 48? ? 5242880 sdd
8? ? ? 49? ? 5241856 sdd1
8? ? ? 64? ? 5242880 sde
8? ? ? 65? ? 5241856 sde1
11? ? ? ? 0? ? 8086528 sr0
253? ? ? ? 0? 52428800 dm-0
253? ? ? ? 1? ? 2097152 dm-1
253? ? ? ? 2? 70246400 dm-2
[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc1
[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc2
###準備boot目錄###
[root@ronny1 ~]# mkdir /mydata/boot
[root@ronny1 ~]# mount /dev/sdc1 /mydata/boot
[root@ronny1 ~]# ls /mydata/boot
lost+found
###安裝grub###
[root@ronny1 ~]# grub-install –root-directory=/mnt /dev/sdc
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
[root@ronny1 ~]# ls /mydata/boot
grub? lost+found
###復制內核文件和initramfs###
[root@ronny1 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mydata/boot/vmlinuz
[root@ronny1 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mydata/boot/initramfs.img
###添加grub配置文件###
[root@ronny1 ~]# vim /mydata/boot/grub/grub.conf
default=0
timeout=5
title CentOS-HAN
root(hd0,0)
kernel /vmlinuz ro root=/dev/sdc2
initrd /initramfs.img
###此處: root配置rootfs根分區###
###準備根目錄結構和程序###
[root@ronny1 ~]# mkdir /mydata/sysroot
[root@ronny1 ~]# mount /dev/sdc2 /mydata/sysroot
[root@ronny1~]# cd /mydata/sysroot
[root@ronny1 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
mkdir: created directory `etc’
mkdir: created directory `bin’
mkdir: created directory `sbin’
mkdir: created directory `lib’
mkdir: created directory `lib64′
mkdir: created directory `dev’
mkdir: created directory `proc’
mkdir: created directory `sys’
mkdir: created directory `tmp’
mkdir: created directory `var’
mkdir: created directory `usr’
mkdir: created directory `home’
mkdir: created directory `root’
mkdir: created directory `mnt’
mkdir: created directory `media’
[root@ronny1 sysroot]# cp /bin/bash /mydata/sysroot/bin/
[root@ronny1 sysroot]# ldd /bin/bash
linux-vdso.so.1 =>? (0x00007ffdb9371000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003787200000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000377f600000)
libc.so.6 => /lib64/libc.so.6 (0x000000377fa00000)
/lib64/ld-linux-x86-64.so.2 (0x000000377f200000)
[root@ronny1 sysroot]# cp /lib64/libtinfo.so.5 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libdl.so.2 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libc.so.6 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /bin/ls /mydata/sysroot/bin/
[root@ronny1 ~]# ls /mydata/sysroot/bin
bash ?ls
[root@ronny1 sysroot]# cp /lib64/libselinux.so.1 /mydata/sysroot/lib64/? [root@ronny1 sysroot]# cp /lib64/libacl.so.1 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libattr.so.1 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libpcre.so.1 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libpthread.so.0 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# ls /mydata/sysroot/lib64
ld-linux-x86-64.so.2? libc.so.6? ? libpthread.so.0
libacl.so.1? ? ? ? ? libdl.so.2? ? libselinux.so.1
libattr.so.1? ? ? ? ? libpcre.so.1? libtinfo.so.5
###測試命令###
[root@ronny1 sysroot]# chroot /mydata/sysroot
bash-4.1# ls
bin? etc? lib? ? lost+found? mnt? root? sys? usr
dev? home? lib64? media? ? ? proc? sbin? tmp? var
bash-4.1# exit
exit
[root@ronny1 sysroot]# sync
[root@ronny1 sysroot]# sync
[root@ronny1 sysroot]# sync
###修改init程序,指定init程序(bash)###
default=0
timeout=5
title CentOS-HAN
root(hd0,0)
kernel /vmlinuz ro root=/dev/sdc2 selinux=0 init=/bin/bash
initrd /initramfs.img
[root@ronny1 sysroot]# sync
三、制作一個kickstart文件以及一個引導鏡像。描述其過程
1. 準備系統iso鏡像目錄(centos7.2)
[root@ronny1 ~]# mkdir /mnt/cdrom
[root@ronny1 ~]# mount /dev/sr0 /mnt/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@ronny1 ~]# mkdir /mnt/iso
[root@ronny1 ~]# cd /mnt/cdrom
[root@ronny1 cdrom]# cp -frav * /mnt/iso
[root@ronny1 cdrom]# cp .discinfo /mnt/iso
2. 定制kickstart
[root@ronny1 ~]# yum -y install system-config-kickstart
[root@ronny1 ~]# system-config-kickstart













[root@ronny1 ~]# ksvalidator ks.cfg
3. 整合鏡像文件和ks文件,并修改相關配置
[root@ronny1 ~]# cd /mnt/iso
[root@ronny1 iso]# vim isolinux/isolinux.cfg
定制啟動標簽 ,指定ks位置
label custom
menu label ^Install CentOS 7
menu default
kernel vmlinuz
append initrd=initrd.img inst.ks=cdrom:/isolinux/ks.cfg inst.stage2=hd:LABEL=CENTOS7 quiet
其中,需要把其它啟動項中的menu default去掉,加在上面的自定義啟動項中,這樣當你從光盤啟動時,才會默認選擇該項,并且有倒計時,由于默認的光盤倒計時時間太久了,為600秒,我們把timeout 600改成timeout 100,這樣默認就是10秒倒計時了。
拷貝ks文件到光盤根目錄
[root@ronny1 iso]# cp /root/ks.cfg isolinux/
[root@ronny1 iso]# ls isolinux/
boot.cat? grub.conf? isolinux.bin? ks.cfg? splash.png? upgrade.img? vmlinuz
boot.msg? initrd.img? isolinux.cfg? memtest? TRANS.TBL? vesamenu.c32
4. 重新打包ISO
[root@ronny1 iso]mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V “CentOS 7 x86_64 boot” -c isolinux/boot.cat -b isolinux/isolinux.bin -o? /root/boot.iso ?iso/
5. 加載新生成的鏡像,并啟動
使用Xshell 將生成的boot.iso ?copy到windows系統下,就可以用虛擬機引導啟動了。
四、寫一個腳本
(1) 能接受四個參數:start, stop, restart, status start: 輸出“starting 腳本名 finished.” …
(2) 其它任意參數,均報錯退出;
#!/bin/bash
#description:
case $1 in
start)
echo “staring $0 finished”
;;
stop)
echo “stop $0 finished”
;;
restart)
echo “restart $0 finished”
;;
status)
echo “status? $0 finished”
;;
*)
echo “error”
exit 1
;;
esac
五、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash
#description:
while true; do
if who |grep $1 &> /dev/null;then
echo “$1 is login”
exit 0
fi
sleep 3
done
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash
#description:display cpu,memory,disk info
cat << EOF
cpu)display cpu info
mem)display memory info
disk)display disk info
quit)quit
EOF
read -p “please input your choice ” choice
while true;do
case $choice in
cpu)
lscpu
exit 0
;;
mem)
free -m
exit 0
;;
disk)
fdisk -l
exit 0
;;
quit)
echo “quit”
exit 0
;;
*)
echo “Error please input cpu,mem,disk,quit”
read -p “please input your choice ” choice
;;
esac
done
7、寫一個腳本
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;
進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
userinfo() {
if id “$username” &> /dev/null; then
grep “^$username\>” /etc/passwd | cut -d: -f3,7
else
echo “No such user.”
fi
}
read -p “please input one username or quit: ” username
while true;do
if [ $username == “quit” ];then
exit
else
userinfo
read -p “please input one username or quit: ” username
fi
done
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87723