1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
一、內核空間詳細過程如下: POST –> BootSequence(BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只讀) –> /sbin/init(systemd) 1.POST:(power on system test)加電自檢 負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。 ROM: BIOS(Basic Input and Output System) ,即基本輸入輸出系統,它是裝載ZA在一個硬件芯片 CMOS 之上,加電過程就是給CMOS通電,然后啟動其上的BIOS程序,BIOS程序會根據CMOS上面的一些配置信息去讀取其他硬件設備信息并檢測其是否存在并能正常運行,之后進行硬件設備的初始化。 2.Boot Sequnence 按次序查找引導設備,第一個有引導程序的設備為本次啟動設備,即:bootloader ; 1)bootloader: 引導加載器,引導程序 Linux: LILO:LInux LOader GRUB: GRand Unified Bootloader GRUB 0.X: Grub Legacy, GRUB 1.X: Grub2 grub功能 :功能豐富,提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本; 把用戶選定的內核裝載到內存中的特定空間RAM中,解壓、展開,并把系統控制權移交給內核 ; 2)bootloader裝在MBR中:Master Boot Record(主引導記錄) 512bytes : 446bytes: bootloader, 64bytes: 分區表 2bytes: 55AA(有效標識) 3)GRUB(2各階段) bootloader : 1st stage Partitioon :1.5 stage filesystem driver Partitioon :2nd stage 分區文件在/boot/grub上 3.Kernel:加載系統內核,執行系統初始化信息 1) 自身初始化 : · 探測可識別到的所有硬件設備 · 加載硬件驅動程序(可能借助于ramdisk加載驅動 ) · 以只讀方式掛載根文件系統 · 運行用戶空間的第一個應用程序:/sbin/init 2)ramdisk : 內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問 ·ramdisk–> ramfs 提高速度(完成對真正根文件系統的驅動加載) CentOS 5: initrd, 工具程序:mkinitrd CentOS 6;7: initramfs,工具程序:mkinitrd,dracut 一旦啟動了init,內核就不管了,所有的后續操作都是由init去加載運行用戶空間的應用程序來完成各種各樣的工作,只有當這些應用程序完成系統調用或者系統發生中斷時需要特權操作時,內核才會參與;剩余的其他過程都不在參與,而是由用戶空間的程序來完成。 啟動用戶空間的第一個執行程序/sbin/init, 完成系統初始化 在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶空間中的第一個執行程序/sbin/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統各式等其他服務的啟動管理。而這些所有的操作都是通過init的配置文件來定義。 二、用戶空間啟動流程 設置默認運行級別-->運行系統初始化腳本,完成系統初始化-->關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務-->設置登錄終端-->[啟動圖形終端] 1.運行級別:為了系統的運行或維護等目的而設定的機制 0-6:7個級別 0:關機,shutdown 1:單用戶模式(single user),root用戶 無需認證 維護模式 2:多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS 維護模式 3:多用戶模式(multi user),完全功能,文本界面(only) 4:預留模式;目前無特別使用目的,同三級別功能使用 5:多用戶模式(multi user),完全功能,圖形界面 6:重啟,reboot 默認級別:3或者5 級別切換: init # 2.系統初始化的腳本文件:/etc/rc.d/rc.sysinit 1.設置主機名; 2.設置歡迎信息; 3.激活udev和selinux 4.掛載/etc/fstab文件中定義的所有文件系統 5.檢測根文件系統,并以讀寫方式重新掛載根文件系統 6.設置系統時鐘 7.根據/etc/sysctl.conf文件的設置,來設置內核參數 8.激活lvm及軟raid設備 9.激活swap設備 10.加載額外設備的驅動程序; 11.清理操作 3. 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務 根據運行級別的不同,系統會運行rc0.d到rc6.d中的響應的腳本程序,來完成相應的初始化工作和啟動相應的服務。 執行/etc/rc.d/rc.local 4. 啟動終端
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;并為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
添加硬盤創建分區: [root@dodo ~]# cat /proc/partitions major minor #blocks name 8 16 20971520 sdb 8 17 10490413 sdb1 8 18 10474380 sdb2 8 0 20971520 sda 8 1 512000 sda1 8 2 20458496 sda2 253 0 18423808 dm-0 253 1 2031616 dm-1 [root@dodo /]# mkfs.ext4 /dev/sdb1 [root@dodo /]# mkfs.ext4 /dev/sdb2 [root@dodo /]# mkdir /mnt/boot [root@dodo /]# mount /dev/sdb1 /mnt [root@dodo /]# mkdir /mnt/sysroot/{bin,proc,lib64,mnt,sbin,usr,tmp,etc,home,var,dev.media} [root@dodo /]# mount /dev/sdb1 /mnt/sysroot 安裝grub: [root@dodo /]# grub-install --root-directory=/mnt /dev/sdb Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb 復制內核文件和initramfs: [root@dodo /]# cp /boot/vmlinuz-2.6.32-504.el6.x86_64 /mnt/boot/vmlinuz [root@dodo /]# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/initramfs.img 編輯grub配置文件: [root@dodo /]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS-dodo root(hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img 為rootfs提供bash、ls、cat程序及所依賴的庫文件: [root@dodo mnt]# cp /bin/{bash,ls,cat} /mnt/sysroot/bin [root@dodo sysroot]# ldd /bin/{ls,cat,bash} /bin/ls: linux-vdso.so.1 => (0x00007fff74dff000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9994022000) librt.so.1 => /lib64/librt.so.1 (0x00007f9993e1a000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f9993c15000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f9993a0d000) libc.so.6 => /lib64/libc.so.6 (0x00007f9993679000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f9993474000) /lib64/ld-linux-x86-64.so.2 (0x00007f999424f000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9993257000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f9993052000) /bin/cat: linux-vdso.so.1 => (0x00007fff64fb1000) libc.so.6 => /lib64/libc.so.6 (0x00007f58726f8000) /lib64/ld-linux-x86-64.so.2 (0x00007f5872a9a000) /bin/bash: linux-vdso.so.1 => (0x00007fffe1d44000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f715b19a000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f715af96000) libc.so.6 => /lib64/libc.so.6 (0x00007f715ac01000) /lib64/ld-linux-x86-64.so.2 (0x00007f715b3c9000) [root@dodo mnt]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/librt.so.1 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/libc.so.6 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64 [root@dodo mnt]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64 [root@dodo sysroot]# sync
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
通過編輯/root/anaconda-ks.cfg為模板的文件 #version=DEVEL # System authorization information 認證方式 auth --enableshadow --passalgo=sha512 # Use CDROM installation media 光盤 cdrom # Use graphical install 圖形化安裝 graphical # Run the Setup Agent on first boot 第一次啟動時設置系統的向導 firstboot --enable ignoredisk --only-use=sda # Keyboard layouts 鍵盤 keyboard --vckeymap=us --xlayouts='us' # System language 系統語言 lang en_US.UTF-8 # Network information 網絡服務 network --bootproto=dhcp --device=ens33 --ipv6=auto --activate network --hostname=localhost.localdomain # Root password 管理員密碼 rootpw --iscrypted $6$tvsSxwFwiO2Ekcq1$8jRMyxa3cXqXwEN/HKzfcNG9vEi7XBWCr..rI3Id.mMzHq8uL4F15K9YgqN3N1sLoUI3nEtnaF5YGjZPsgs/E0 # System services 同步時間服務 services --enabled="chronyd" # System timezone 時區 timezone Asia/Shanghai --isUtc # X Window System configuration information 窗口配置化信息 xconfig --startxonboot # System bootloader configuration 定義BootLoader的安裝位置設置級相關配置 bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda autopart --type=lvm # Partition clearing information 清空磁盤分區 clearpart --none --initlabel %packages 程序包 @^gnome-desktop-environment @base @core @desktop-debugging @dial-up @directory-client @fonts @gnome-desktop @guest-agents @guest-desktop-agents @input-methods @internet-browser @java-platform @multimedia @network-file-system-client @networkmanager-submodules @print-client @x11 chrony kexec-tools #結束自動化部署 %end %addon com_redhat_kdump --enable --reserve-mb='auto' %end %anaconda pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty %end 或安裝system-config-kickstart,圖形自動生成ks文件 1.復制安裝系統光盤引導文件和配置好的ksdodo.cfg文件到/dodoroot/isolinux目錄 cp -rf /mnt/isolinux /dodoroot/isolinux cp /boot/ksdodo.cfg /dodoroot/isolinux/ 2.在isolinux.cfg中指明kickstart文件位置,可以實現完全自動化安裝。也可以在“boot:”提示符下手動指定 append initrd=initrd.img ks=cdrom:/isolinux/ksdodo.cfg 3.創建ISO啟動鏡像 mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 7 dodo" -c isolinux/boot.cat -b isolinux/isolinux.bin -o isolinux/boot.iso dodoroot/
4、寫一個腳本
(1) 能接受四個參數:start, stop, restart, status
start: 輸出“starting 腳本名 finished.”
…
(2) 其它任意參數,均報錯退出;
#!/bin/bash #判斷 #author:dodo case $1 in start) echo "start $0 finished." ;; stop) echo "stop $0 finished." ;; restart) echo "restart $0 finished." ;; status) echo "status $0 ok." ;; *) echo "error" exit 1 ;; esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash #判斷用戶 #author:dodo [ "$#" -lt 1 ] && echo "Please inter a username" && exit 1 ! (id $1 &>/dev/null) && echo "Error: No user" && exit 2 while true;do if who | grep "^$1\>" &>/dev/null ; then echo "$1 is login" break else echo "Waiting 3sec,I will be check" sleep 3 fi done
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash #查詢硬件狀態 #author:dodo 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 ;; *) echo “Error!Please choose again!!” continue esac done
7、寫一個腳本
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash #查詢用戶及shell #author:dodo user_id () { if id $username &> /dev/null; then grep "^$username" /etc/passwd | awk -F: '{print "UID is:"$3, " Shell is:"$7}' else echo "none user" fi } while true;do read -p "please enter username or quit:" username if [ $username == "quit" ];then exit 0 else user_id $username fi done
原創文章,作者:lyj821202,如若轉載,請注明出處:http://www.www58058.com/69879