1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
POST –> BootSequence(BIOS) –>Bootloader(MBR) –>Kernel(ramdisk)–>rootfs(readonly)–>switchroot–>/sbin/init(設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務–>設置登陸終端[啟動圖形界面])
1)加電自檢(POST),BIOS啟動引導階段;
在該過程中實現硬件的初始化以及查找啟動介質;
從MBR中裝載啟動引導管理器(GRUB)并運行該啟動引導管理;
MBR才512bytes,所以現在很多都用UEFI,GPT方式咯
2)GRUB(Grand Uniform Bootloader)啟動引導階段;
功能:提供一個菜單,允許用戶要選擇啟動的不同系統或內核版本,把其內核加載到RAM中的特定空間,解壓、展開,讓后控制權移交給kernel
裝載stage1
裝載stage1.5
裝載stage2(因為MBR很小,所以這里沒有限制哦)
讀取/boot/grub.conf文件并顯示啟動菜單;
裝載所選的kernel和initrd文件到內存中
PS:LILO:支持柱面1024,現在基本都用在android手機,不用再PC機了
3)內核階段:
探測可識別到所有硬件設備
加載各種硬件驅動程序;(有可能會借助于randisk加載驅動)
以只讀方式掛載根文件系統
運行用戶空間的第一個應用程序:/sbin/init
ps: ramdisk:Linux 內核特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問:
ramdisk –> ramfs
initramfs — dracut,mkinitrd (CenetOS6,7
4)init用戶空間初始化階段:
啟動/sbin/init程序;
運行rc.sysinit腳本,設置系統環境,啟動swap分區,檢查和掛載文件系統;
讀取/etc/inittab文件,運行在/et/rc.d/rc<#>.d中定義的不同運行級別的服務初始化腳本;
打開字符終端1-6號控制臺/打開圖形顯示管理,設置登錄
init程序:
CentOS 5 : /ect/inittab
CentOS 6 :Upstart
/etc/inittab:這個文件已廢
/etc/init/*.conf,
CentOS 7 : systemd
配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;并為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
功能:在其他系統上制作一個完整的grub引導系統,并且能跑起來??!
在虛擬機中另外添加磁盤,fdisk /dev/sdb # 創建三個分區,boot,/,swap
~]#partx -a /dev/sdb
~]#mke2fs -t ext4 /dev/sdb1
~]#mke2fs -t ext4 /dev/sdb3
~]#mkswap /dev/sdb2
注意:這個在centos7沒有做成功,centos6可以的
注意:安裝grub引導時,必須要指定boot的,不能用當前系統
~]#mkdir /mnt/boot
~]#mount /dev/sdb1 /mnt/boot/
安裝grub
~]#grub-install –root-directory=/mnt /dev/sdb ;指定根在什么地方,不能寫到/mnt/boot
~]#cd /mnt/boot ;有了第一階段和第二階段的文件,還差,配置文件、內核和rootfs
~]#cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
~]#cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
~]#vim /mnt/boot/grub/grub.conf ; 注意,下列信息 是配置后單獨分系統使用的,所以,sda,不是sdb
default=0
timeout=5
title CentOS (smile)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash
initrd /initramfs.img
mkdir /mnt/sysroot
mount /dev/sdb3 /mnt/sysroot
cd /mnt/sysroot
mkdir -pv etc bin sbin lib lib64 usr home tmp mnt var proc root
cp /bin/bash /mnt/sysroot/bin
ldd /bin/bash | grep "/lib[^[:space:]]*" ;獲取這個命令依賴的庫文件
注意:這里調用我寫的一個腳本,復制命令以及相關的依賴庫文件
#!/bin/bash
#
#Athor:smile
#Date:2017-1-22
#Filename: copy_Command_Lib.sh
#Pragram:
#
# Copy enter "command" and "libraries" file
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export PATH
#指定的根路徑
dir_path=/mnt/sysroot/
# 傳遞給函數可執行命令,復制命令程序和依賴庫文件到指定目錄 ,并且取掉絕對路徑
f_copy_com_lib() {
command_path=$(which –skip-alias "$1" ) #獲命令取絕對路徑
temp_dir=${command_path#*/} # 取掉絕對路徑“/”
temp_dir=${temp_dir%/*} # 取掉后面的文件文件名
mkdir -p $dir_path$temp_dir # 創建/mnt/sysroot下對應的的目錄
cp -rf $command_path $dir_path$temp_dir
#獲取命令路徑要注意兩個問題:第一個要避開which查出結果有alias別名問題, which COM | grep -v "alias" 除去別名
#第一步,查出命令路徑,第二步,去掉alias,第三步,查出命令所以來的庫,第四步,獲取庫的準確路徑
for lib_file in $( ldd $(which –skip-alias "$1" ) | grep -o "/lib[^[:space:]]*") ; do
temp_dir=${lib_file#*/} #取掉絕對路徑 ${string#*word}
temp_dir=${temp_dir%/*} #去掉基名
mkdir -p $dir_path$temp_dir #創建一個庫文件的路徑
cp -rf $lib_file $dir_path$temp_dir #復制庫文件到指定的目錄中
#echo "${a_library[$i]}" #let i++
echo "$lib_file"
echo
done
}
while true ; do
cat << EOF
+++++++++++++++++++++++++++++++++++++++++++++++++
command)Please enter the system existing command
quit) quit script
+++++++++++++++++++++++++++++++++++++++++++++++++
EOF
read -p "Please enter existing command:" v_command
if [ $v_command == "quit" ] ; then
break
fi
#如果輸入的不存在的命令,處理
if ! ( which $v_command &>/dev/null ) ; then
echo "ERROR:command not found!"
continue # 進行下一次循環
fi
f_copy_com_lib $v_command
done
cp ….
chroot /mnt/sysroot ;切換根命令 ,進行測試
exit
sync ;同步到磁盤
第二步:
創建新的虛擬機,加載配置好的分區
如果需要啊添加虛擬機的話,就能就在grub中添加引導記錄
mount /dev/sdb1 /mnt/boot
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
制作kickstart文件,我目前我喜歡去安裝一個文件系統,等系統安裝好了,在/root/anaconda-ks.cfg下獲取,再來針對改一改(自己能力弱吧,也可以在網上獲取的,CentOS6和CentOS7產生的kickstart文件還是有點不一樣,不過CentOS應該可以兼容的)
kickstart文件的模板
命令段
指定各種安裝前配置選項,如鍵盤類型
必備命令
可選命令
程序段
指明要安裝程序包,以及包組,也包括不安裝的包
%packages ;程序包開始了
@group_name
package
-package ;指定不要的程序包
程序包
%end
腳本段
%pre:安裝前腳本
運行環境:運行安裝介質微型linux系統環境
…
%end
%post:安裝后腳本
運行環境:安裝后的運行環境
…
%end
有多種方式自動話實現安裝,引導光盤中,http和ftp網絡上,
用光盤下的最小引導系統單獨做成關盤鏡像:
~]# cp -rf /media/isolinux /mnt/myiso
~]# cp myks.cfg /mnt/myiso
mnt]# mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6.5 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/
#創建時,把制作好的myks.cfg文件 放在myiso目錄下,并且和isolinux目錄同一個
怎加載ks.cfg文件
boot:linux ip=192.168.10.19 netmask=255.255.255.0 ks=http://192.168.10.100/ks.cfg ;前面的ip地址是配置當前主機的地址
boot: linux ks=cdrom:/path/to/ks_file
kickstart文件中各個字段的解讀:
authconfig:認證方式配置
authconfig –enableshadow –passalgo=sha512
bootloader:定義bootloader的安裝位置及相關配置
bootloader –location=mbr –driveorder=sda –append="crashkernel=auto rhgb quiet"
keyboard us
lang:語言類型
part:分區
part /boot –fstype=ext4 –size=500
part pv.008002 –size=51200
clearpart:清除分區
clearpart –none –drives=sda;清空磁盤分區
volgroup:創建卷組
volgroup myvg –pesize=4096 pv.008002
logvol:創建邏輯卷
logvol /home –fstype=ext4 –name=lv_home –vgname=myvg –size=4122
rootpw:管理員密碼
rootpw –iscrypted $llll
生成密碼的方式:
~]#openssl passwd -1 -salt `openssl rand -hex4`
timezone:時區
timezone Asia/Shanghai
可選命令
install OR upgrade:安裝或升級
text:安裝界面類型,text為tui,默認是gui
network:配置網絡接口
network –noboot yes –device eth0 –bootproto dhcp –noipv6
防火墻:firewall –server=ssh
firewall –disabled
selinux :SELinux(內核安全機制
selinux disabled
halt,poweroff 或者reboot,安裝后的行為
repo:指明安裝時使用的repository
repo –name="CentOS" –baseurl=cdrom:sr0 –cost=100 ;cost是開銷,默認是1000,這里比較優先
url:指明安裝時使用的 repository ,但為url格式
url –url=http://192.168.10.102/cobbler/ks_mirror/CentOS-7.0-x86_64/
4、寫一個腳本
(1) 能接受四個參數:start, stop, restart, status
start: 輸出“starting 腳本名 finished.”
…
(2) 其它任意參數,均報錯退出;
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
7、寫一個腳本
(1) 用函數實現返回一個用戶的和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
原創文章,作者:不忘初衷,如若轉載,請注明出處:http://www.www58058.com/67426
非常非常詳細,很棒。