1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 系統啟動流程: POST --> BootSequence(BIOS) --> BootLoader (MBR) --> Kernel (ramdisk) --> rootfs (readonly) --> /sbin/init () 1. POST: 加電自檢 2. BootSequence:按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用的設備 3. BootLoader:加載設備的引導程序 4. Kernel:探測可識別到的所有硬件設備,加載硬件驅動程序(有可能借助于ramdisk加載驅動) 5. rootfs:以只讀方式掛載根文件系統 6. init:運行用戶空間的第一個應用程序:/sbin/init 進行初始化操作 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區; (1) 為硬盤新建兩個主分區;并為其安裝grub; (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs; (3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件; (4) 為grub提供配置文件; (5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機; 為硬盤新建兩個主分區 [root@localhost ~]# fdisk /dev/sdg Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-3916, default 1): 1 Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): +200M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (27-3916, default 27): Using default value 27 Last cylinder, +cylinders or +size{K,M,G} (27-3916, default 3916): +10G [root@localhost ~]# partx -a /dev/sdg [root@localhost ~]# mke2fs -t ext4 /dev/sdg1 [root@localhost ~]# mke2fs -t ext4 /dev/sdg2 掛載第一個分區,并安裝grub [root@localhost mnt]# mkdir /mnt/boot [root@localhost mnt]# mount /dev/sdg1 /mnt/boot [root@localhost mnt]# grub-install --root-directory=/mnt /dev/sdg 復制內核和ramdisk文件到第一個分區 [root@localhost mnt]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz [root@localhost mnt]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img 配置grub.conf文件 [root@localhost mnt]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS (Express) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img 為第二個分區提供rootfs [root@localhost mnt]# mkdir /mnt/sysroot [root@localhost mnt]# mount /dev/sdg2 /mnt/sysroot [root@localhost sysroot]# mkdir -pv /mnt/sysroot/{etc,bin,sbin,lib,lib64,dev,proc,sys,tmp,var,usr,home,root,mnt,media} 復制命令及其庫文件 [root@localhost mnt]# vim /tmp/cpcmd2.sh #!/bin/bash dst="/mnt/sysroot" [ ! -d $dst ] && mkdir $dst copycmd(){ if `which $1 &>/dev/null`;then cmddir=`which --skip-alias $1` dir=`dirname $cmddir` mkdir -pv ${dst}${dir} cp $cmddir ${dst}${dir}/ else echo "command not found" return 0 fi } copylib(){ liblist=$(ldd `which --skip-alias $1`|grep -Eo "/[^[:space:]]+") for libfile in $liblist;do libdir=`dirname $libfile` [ ! -d ${dst}${libdir} ] && mkdir ${dst}${libdir} cp $libfile ${dst}${libdir} done } read -p "please input a command:" cmd while [ "$cmd" != "quit" ];do copycmd $cmd copylib $cmd echo "files copied" read -p "please input a command:" cmd done [root@localhost mnt]# bash /tmp/cpcmd2.sh [root@test tmp]# bash cpcmd.sh please input a command:bash files copied please input a command:ls files copied please input a command:cat files copied please input a command:quit 新建虛擬機,將新的硬盤設置為第一啟動項,啟動bash并測試ls,cat命令 3、制作一個kickstart文件以及一個引導鏡像。描述其過程。 安裝kickstart程序 [root@localhost ~]# yum install system-config-kickstart 制作ks.cfg文件 [root@localhost ~]# system-config-kickstart & #將ks.cfg保存在root 目錄下 [root@localhost ~]# cat ks.cfg #platform=x86, AMD64, or Intel EM64T #version=DEVEL # Firewall configuration firewall --enabled --service=ssh # Install OS instead of upgrade install # Use CDROM installation media cdrom # Root password rootpw --iscrypted $1$7e5bbhUU$5ikWQctYMuPQc3O9Wko9d/ # System authorization information auth --useshadow --passalgo=sha512 # Use graphical install graphical firstboot --disable # System keyboard keyboard us # System language lang en_US # SELinux configuration selinux --enforcing # Installation logging level logging --level=info # System timezone timezone Asia/Shanghai # System bootloader configuration bootloader --append="crashkernel=auto rhgb quiet" --location=mbr --driveorder="sda" # Partition clearing information clearpart --all --initlabel # Disk partitioning information part /boot --fstype="ext4" --size=200 part / --fstype="ext4" --size=10000 part swap --fstype="swap" --size=1024 掛載安裝光盤 [root@localhost ~]# mount /dev/cdrom /media/cdrom/ [root@localhost ~]# mkdir -p /root/auto_install [root@localhost ~]# cp -arf /media/cdrom /root/auto_install/ 定位ks.cfg文件 [root@localhost ~]# cp /root/ks.cfg /root/auto_install/cdrom/ks.cfg [root@localhost ~]# chmod +w /root/auto_install/cdrom/isolinux/isolinux.cfg [root@localhost ~]# vim /root/auto_install/cdrom/isolinux/isolinux.cfg label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img ks=cdrom:/ks.cfg # 在這里添加ks文件路徑參數 制作自動安裝光盤 [root@localhost ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 \ --boot-info-table -V "CentOS 6 Auto install" \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -o /root/centos6_auto_install.iso \ /root/auto_install/cdrom/ 4、寫一個腳本 (1) 能接受四個參數:start, stop, restart, status start: 輸出“starting 腳本名 finished.” ... (2) 其它任意參數,均報錯退出; [root@mail tmp]# vim start.sh #!/bin/bash case $1 in start) echo "starting $0 finished." ;; stop) echo "stop $0 finished" ;; restart) echo "restart $0 finished" ;; status) echo "$0 status" ;; *) echo "error,please input {start|stop|restart|status}" exit 1 esac [root@mail tmp]# bash /tmp/start.sh start 5、寫一個腳本,判斷給定的用戶是否登錄了當前系統; (1) 如果登錄了,則顯示用戶登錄,腳本終止; (2) 每3秒鐘,查看一次用戶是否登錄; [root@mail tmp]# vim login.sh #!/bin/bash read -p "Please input a user:" user id $user &> /dev/null if [ $? -eq 0 ];then while true;do if who |grep "^$user" &> /dev/null;then break fi sleep 3 done echo "$user is login" else echo "$user is not exist" fi [root@mail tmp]# bash login.sh 6、寫一個腳本,顯示用戶選定要查看的信息; cpu) display cpu info mem) display memory info disk) display disk info quit) quit 非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止; [root@mail tmp]# vim info.sh #!/bin/bash read -p "input cpu|mem|disk|quit :" option while [ "$option" != "cpu" -a "$option" != "mem" -a "$option" != "disk" -a "$option" != "quit" ];do read -p "input cpu|mem|disk|quit :" option done if [ "$option" == "cpu" ];then lscpu elif [ "$option" == "mem" ];then free -m elif [ "$option" == "disk" ];then fdisk -l /dev/[hs]d[a-z] else echo "quit" exit 0 fi [root@mail tmp]# bash info.sh 7、寫一個腳本 (1) 用函數實現返回一個用戶的UID和SHELL;用戶名通過參數傳遞而來; (2) 提示用戶輸入一個用戶名或輸入“quit”退出; 當輸入的是用戶名,則調用函數顯示用戶信息; 當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息后,再次提醒輸出用戶名或quit: [root@test tmp]# vim userinfo.sh #!/bin/bash userinfor(){ uid=`id -u $username` ushell=`grep "^$username\>" /etc/passwd |cut -d: -f7` echo "USERNAME:$username UID:$uid SHELL:$ushell" } read -p "Please input a username|quit :" username while [ "$username" != "quit" ];do id $username &>/dev/null if [ $? -eq 0 ] ;then userinfor $username read -p "Please input a username|quit :" username else echo "user not exist" read -p "Please input a username|quit :" username fi done [root@test tmp]# bash userinfo.sh 8、寫一個腳本,完成如下功能(使用函數) (1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的所有庫文件; (2) 復制命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,如果復制的文件原路徑是/usr/bin/useradd,則復制到/mnt/sysroot/usr/bin/目錄中; (3) 復制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求; [root@localhost mnt]# vim /tmp/cpcmd2.sh #!/bin/bash dst="/mnt/sysroot" [ ! -d $dst ] && mkdir $dst copycmd(){ if `which $1 &>/dev/null`;then cmddir=`which --skip-alias $1` dir=`dirname $cmddir` mkdir -pv ${dst}${dir} cp $cmddir ${dst}${dir}/ else echo "command not found" return 0 fi } copylib(){ liblist=$(ldd `which --skip-alias $1`|grep -Eo "/[^[:space:]]+") for libfile in $liblist;do libdir=`dirname $libfile` [ ! -d ${dst}${libdir} ] && mkdir ${dst}${libdir} cp $libfile ${dst}${libdir} done } read -p "please input a command:" cmd while [ "$cmd" != "quit" ];do copycmd $cmd copylib $cmd echo "files copied" read -p "please input a command:" cmd done [root@localhost mnt]# bash /tmp/cpcmd2.sh
原創文章,作者:N22_上海_長清,如若轉載,請注明出處:http://www.www58058.com/54836