1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)
CentOS主機按以下順序啟動 1、POST加電自檢 2、BIOS讀取CMOS中的BIOS設置的參數來識別基礎硬件,尋找到啟動設備 3、MBR 1)讀取啟動設備MBR中前446字節的bootloader 2)讀取MBR后的扇區用來識別grub以及內核kernel所在的區域 3)啟動grub 4、GRUB顯示菜單界面,選擇運行內核kernel;配置文件是/boot/grub/grub.conf 1)提供菜單、并提供交互式接口 2)加載用戶選擇的內核或操作系統 3)為菜單提供了保護機制 5、KERNEL自身初始化 1)探測可識別到的所有硬件設備 2)加載硬件驅動程序(有可能會借助于ramdisk加載驅動) 3)以只讀方式掛載根文件系統 4)運行用戶空間的第一個應用程序:/sbin/init 6、INIT 運行/sbin/init程序,配置文件/etc/inittab和/etc/init/*.conf 設置默認運行級別如id:3:initdefault 運行系統初始化腳本/etc/rc.d/rc.sysinit 1)設置主機名; 2)設置歡迎信息; 3)激活udev和selinux 4)掛載/etc/fstab文件中定義的文件系統; 5)檢測根文件系統,并以讀寫方式重新掛載根文件系統; 6)設置系統時鐘; 7)激活swap設備; 8)根據/etc/sysctl.conf文件設置內核參數; 9)激活lvm及software raid設備 10)加載額外設備的驅動程序 11)清理操作 關閉對應的腳本中需要關閉的服務,啟動需要啟動服務(實際服務命令位于/etc/rc.d/init.d) 設置登錄終端
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;并為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
為硬盤新建兩個主分區;并為其安裝grub; 添加一塊硬盤 [root@localhost ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x495813a2. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-10443, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-10443, default 10443): +1G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (133-10443, default 133): Using default value 133 Last cylinder, +cylinders or +size{K,M,G} (133-10443, default 10443): +2G Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@localhost ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2 [root@localhost ~]# mke2fs -t ext4 /dev/sdb1 [root@localhost ~]# mke2fs -t ext4 /dev/sdb2 [root@localhost ~]# mkdir /mnt/{boot,sysroot} [root@localhost ~]# mount /dev/sdb1 /mnt/boot/ [root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/ [root@localhost ~]# grub-install --root-directory=/mnt/ /dev/sdb 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs; [root@localhost ~]# cp -r /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/vmlinuz [root@localhost ~]# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/initramfs.img [root@localhost ~]# ls /mnt/boot/ grub initramfs.img lost+found vmlinuz 為rootfs提供bash、ls、cat程序及所依賴的庫文件 [root@localhost ~]# mkdir -p /mnt/sysroot/{bin,lib64} [root@localhost ~]# cp -r /bin/{bash,ls,cat} /mnt/sysroot/bin/ [root@localhost ~]# cp $(ldd /bin/bash | awk '$3~/^\/lib64/{print $3}') /mnt/sysroot/lib64/ [root@localhost ~]# cp $(ldd /bin/ls | awk '$3~/^\/lib64/{print $3}') /mnt/sysroot/lib64/ [root@localhost ~]# cp $(ldd /bin/cat | awk '$3~/^\/lib64/{print $3}') /mnt/sysroot/lib64/ 為grub提供配置文件 [root@localhost ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS 6.6 (Test) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img 在BIOS中選擇sdb作為啟動盤
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
可以直接手動編輯或使用工具在桌面模式下用system-config-kickstart(centos6.x)來創建ks.cfg #命令段 firewall --disabled//禁用防火墻 install//執行新安裝 cdrom//用光盤安裝 lang en_US.UTF-8//默認安裝語言 keyboard us//選擇鍵盤 rootpw --iscrypted $6$AF1u4TWzFxa/SzHI$yJvJdbhyw/2rG8dtr.PY6c15sZ.qNc6US/z7PMQ4lADdlIis/qIMO738b9czXK/rX1YDiL7Uv/C6Bi99ig8ov0//管理員加密密碼 authconfig --enableshadow --passalgo=sha512 selinux --enforcing//激活selinux logging --level=info//信息等級 timezone --utc Asia/Shanghai//系統時區 bootloader --location=mbr --driveorder=sdb --append="crashkernel=auto rhgb quiet" clearpart --all//刪除所有現在分區 part /boot --fstype=ext4 --size=200//分區掛載 part / --fstype=ext4 --size=40960 part swap --size=4096 #腳本段 %pre//安裝前腳本 echo "start install" %end %post//安裝后腳本 echo "install end" #程序包段 %packages @chinese-support//中文支持 @development//開發工具 @graphical-desktop-clients//圖形化工具 @remote-desktop-clients//遠程桌面客戶端 %end 簡單引導鏡像光盤制作: 1)復制系統安裝光盤除Packages和repodata外的所有目錄下的所有文件到一自定義目錄(/centos6.6) mount -r /dev/sr0 /mnt/ mkdir /centos6.6 cp -r /mnt/{CentOS_BuildTag,isolinux,R*,E*,GPL,T*,images} /centos6.6/ cd /centos6.6/ 2)創建引導光盤:把/centos6.6目錄創建為光盤鏡像boot.iso mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.6 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /centos6.6/ 簡單自動安裝系統光盤制作 1)復制安裝系統光盤的所有目錄下的所有文件和ks.cfg文件到一自制目錄(/centos6.6) cd /centos6.6/ cp -r /mnt/* . cp /root/ks.cfg . 2)在/centos6.6/isolinux/isolinux.cfg文件中append initrd=initrd.img條目中添加ks文件讀取路徑 ks=cdrom:/ks.cfg 3)創建引導光盤:把centos6.6目錄創建為光盤鏡像centos.iso mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.6 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /centos6.6/
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 "restart $0 finished." ;; *) echo "error,exit!" exit 1 ;; esac
5、寫一個腳本,判斷給定的用戶是否登錄了當前系統;
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;
#!/bin/bash while [ 0 ];do if `w | grep "^$1\>" &> /dev/null`;then echo "$1 is login." exit 0 else sleep 3 fi done
6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;
#!/bin/bash # while [ 0 ];do echo "please input a option:" echo "cpu) display cpu info" echo "mem) display memory info" echo "disk) display disk info" echo "quit) quit" read test case $test in cpu) lscpu ;; mem) cat /proc/meminfo ;; disk) fdisk -l ;; quit) exit 0 ;; *) echo "you have wrong choose." continue ;; esac done
7、寫一個腳本
(1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當輸入的是用戶名,則調用函數顯示用戶信息;
當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit:
#!/bin/bash # function userinfo { if id $username &> /dev/null;then id -u $username grep "^$username\>" /etc/passwd | cut -d: -f7 else echo "wrong user!" fi echo $username } while true;do read -p "Please input a username or quit:" username if [ $username == "quit" ];then exit 0 else userinfo $username fi done
8、寫一個腳本,完成如下功能(使用函數)
(1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件;
(2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中;
(3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;
#!/bin/bash # libcp(){ for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*");do libdir=$(dirname $lib) [ -d $target$libdir ] || mkdir $target$libdir [ -f $target$lib ] || cp $lib $target$lib done } target=/mnt/sysroot [ -d $target ] || mkdir $target read -p "Input a command:" command while [ "$command" != 'quit' ];do if ! which $command &> /dev/null;then read -p "No such command,enter again:" command continue fi command=$(which --skip-alias $command) cmnddir=$(dirname $command) [ -d $target$cmnddir ] || mkdir -p $target$cmnddir [ -f $target$command ] || cp $command $target$command libcp $command read -p "Another command(quit):" command done
原創文章,作者:N21-天天,如若轉載,請注明出處:http://www.www58058.com/47840
寫的很好,最后一個腳本可以優化一下,