1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
(1) POST阶段
加电自检,确保每个设备能正常工作
(2) BIOS
按次序查找跟引导设备,第一个有引导程序的设备即为本次启动要用到的设备
(3) Bootloader:引导加载器
GRUB:提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选择的系统或内核版本装载到内存特定的空间中解压、展开,完成后将控制权交给内核
(4) Kernel:
自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动设备。
注意:如果不能识别设备,需要临时生成ramdisk来动态识别设备的驱动,并加载硬件设备
(5) roofts:
只读的方式挂载跟文件系统
(6) /sbin/init:开始启动用户空间程序
设置默认运行级别
运行系统初始化脚本:脚本存放位置:/etc/rc.d/rc.sysinit
设置主机名
设置欢迎信息
激活udev和SELinux
挂载/etc/fstab文件中定义的所有文件系统
检测跟文件系统,如果一切正常,以读写方式重新挂载根文件系统
设置系统时钟
根据/etc/sysctl.conf文件的设置,设置内核参数
激活lvm及raid设备
激活swap设备
加载额外的设备的驱动程序
清理操作
关闭对应级别需要停止的服务,启动对应级别需要开启的服务
设置登录终端
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
创建分区:
安装grub
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
内核和ramdisk文件
第二个分区上的rootfs
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
grub.conf配置文件放置于/tmp/boot/grub
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
新建目标主机:Test Installation of Grub
启动正常
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
(1) 制作kickstart文件
安装制作kickstart文件程序
yum -y install system-config-kickstart
启动制作kickstart文件程序
ksystem-config-kickstart
(2) 制作引导镜像
在根用户家目录下创建myboot目录
挂载光盘镜像至/media/cdrom
复制/media/cdrom/isolinux目录至/root/myboot
复制制作完成的ks.cfg至/root/myboot目录下
创建光盘镜像:mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot/
在VMWare中选择boot.iso作为引导镜像
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
…
(2) 其它任意参数,均报错退出;
#!/bin/bash # cat << EOF start) start the service stop) stop the service restart) restart the service status) check the status of the service ***************************************** ***************************************** EOF read -p "Please input your selection: " selection case $selection in start) echo "starting $0 finished" ;; stop) echo "stopping $0 finished" ;; restart) echo "restarting $0 finished" ;; status) echo "checking the status of $0 finished" ;; *) echo "please input valid selection" ;; esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash # while true; do if who | grep "^meng\>" >& /dev/null; then break fi sleep 3 done echo "$(date +"%F %T") meng login" >> /tmp/userinfo.log
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash # cat << EOF Display information as following shown selection cpu) display cpu info mem) display memory info disk) display disk info quit) quit ************************************************ EOF while true; do read -p "Please input your selection: " selection case $selection in cpu) lscpu ;; mem) free -m ;; disk) fdisk -l /dev/vd[a-z] ;; quit) echo "Bye Bye" exit 0 ;; *) echo "Please input valid selection" ;; esac done
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash # userInfo() { local userLine=$(grep $1 /etc/passwd) local userSHELL=${userLine##*:} local userID=$(echo $userLine | cut -f3 -d:) echo "$userSHELL and $userID" } quit() { if [ "$1" == "quit" ]; then echo "Bye Bye" exit 2 fi } while true; do read -p "Please input your username or input 'quit': " choice if [ "$choice" == "quit" ]; then quit $choice break fi if id $choice >& /dev/null; then userInfo $choice fi done
8、写一个脚本,完成如下功能(使用函数)
(1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
(2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;
read -p "Please input a command: " cmd cmdPath=$(which $cmd | grep bin) cpCmd() { cp $cmdPath /mnt/sysroot$cmdpath echo "Copy $cmdPath to path /mnt/sysroot/" } cpFile() { libFile=$(ldd $cmdPath | grep -o "/[^[:space:]]\{1,\}") for i in $libFile; do cp $lib /mnt/sysroot$cmdPath echo "Copy $libFile to path/mnt/sysroot/$cmdPath" done } cpCmd cpFile
原创文章,作者:mxb93,如若转载,请注明出处:http://www.178linux.com/52532