1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
CentOS系统启动流程为:POST –> BootSequence(BIOS) –> BootLoader(MBR) –> Kernel(ramdisk) –> rootfs(readonly) –> /sbin/init() –> 设置默认运行级别 –> 运行系统初始化脚本,完成系统初始化 –> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 –> 设置登录终端[–> 启动图形终端]
1)POST:Power On Self Test,加电自检;主要检测系统关键硬件设备是否存在物理故障
2)BootSequence(BIOS)
BIOS:Basic Input and Output System,基本输入与输出系统,存储于ROM中
Boot Sequence:引导次序;根据BIOS中的设定,按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备
3)BootLoader(MBR)
MBR:Master Boot Record,主引导记录;前446字节的扇区为bootloader(引导加载器)
通过读取设备的MBR启动GRUB:提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核
4)Kernel(ramdisk)
内核初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
5)设置默认运行级别(/etc/inittab)
例如:id:3:initdefault: 设定默认运行级别为3
6)运行系统初始化脚本,完成系统初始化(/etc/rc.d/rc.sysinit)
设置主机名
设置欢迎信息
激活udev和selinux
挂载/etc/fastab文件中定义的所有文件系统
检测根文件系统,并以读写方式重新挂载根文件系统
设置系统时钟
根据/etc/sysctl.conf文件来设置内核参数
激活lvm及软raid设备
激活swap设备
加载额外设备的驱动程序
清理操作
7)关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务(/etc/inittab)
去启动或关闭/etc/rc.d/rc#.d/目录下的服务脚本所控制的服务:
K*:要停止的服务;K##*,##表示优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的
S*:要启动的服务;S##*,##表示优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动
8)设置登录终端(/etc/inittab)
tty1:2345:respawn:/usr/sbin/mingetty tty1
……
tty6:2345:respawn:/usr/sbin/mingetty tty6
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
在新硬盘sdb上面新增两个分区sdb1,sdb2,并格式化文件系统 ~]# fdisk /dev/sdb ~]# mke2fs -t ext4 /dev/sdb1 ~]# mke2fs -t ext4 /dev/sdb2 ~]# mount /dev/sdb1 /test/boot ~]# mount /dev/sdb2 /test/rootfs ~]# grub-install --root-directory=/test /dev/sdb 安装grub ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /boot/initramfs-2.6.32-642.el6.x86_64.img /test/boot ~]# vim /test/boot/grub/grub.conf default=0 timeout=5 title CentOS 6 DIY root (hd0,0) kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sdb2 selinux=0 init=/bin/bash initrd /initramfs-2.6.32-642.el6.x86_64.img 注意:若把sdb设备作为其它机器的第一块硬盘,root=/dev/sdb2应改为root=/dev/sda2 ~]# mkdir -pv /test/rootfs/{bin,dev,etc,home,lib,lib64,media,mnt,proc,root,sbin,sys,tmp,usr,var} ~]# cp /bin/{bash,ls,cat} /test/bin ~]# cp `ldd /bin/{bash,ls,cat} | grep -Eo "/lib[^[:space:]]+"` /test/rootfs/lib64 重启系统进入BIOS修改第一启动项为此硬盘,然后保存重启主机即可
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
安装system-config-kickstart程序,使用图形化界面生成kickstart文件 ~]# ksvalidator ks.cfg 检查kickstart文件语法错误 ~]# mount /dev/cdrom /mnt ~]# cp -r /mnt/isolinux/ /root/myboot/ ~]# cp /root/ks.cfg /root/myboot/ ~]# vim /root/myboot/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文件的位置 ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS6" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/myboot.iso myboot/ 制作简易镜像
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
…
(2) 其它任意参数,均报错退出;
#!/bin/bash name=$(basename $0) case $1 in start) echo "starting $name finished." ;; stop) echo "stop $name finished." ;; restart) echo "restart $name finished." ;; status) echo "status $name finished." ;; *) echo "wrong, exit!" exit 1 ;; esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash while true;do if who | grep $1 &> /dev/null;then echo "user $1 login!" break fi sleep 3 done
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash cat << EOF cpu) display cpu info mem) display memory info disk) display disk info quit) quit EOF while true;do read -p "please enter one option: " option if [[ $option == "cpu" ]];then lscpu break elif [[ $option == "mem" ]];then free -m break elif [[ $option == "disk" ]];then fdisk -l /dev/[sh]d[a-z] break elif [[ $option == "quit" ]];then echo "quit" exit 1 else continue fi done
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash fun_user() { grep "^$1" /etc/passwd | awk -F: '{printf "UID: %-5s SHELL: %s\n",$3,$7}' } while true;do read -p "enter one usrname or 'quit': " option if [ -z $option ];then continue elif [[ $option == "quit" ]];then echo "quit" break elif id $option &> /dev/null;then fun_user $option continue else echo "this user is not existed!" continue fi done
8、写一个脚本,完成如下功能(使用函数)
(1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
(2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;
#!/bin/bash copy_fun() { while true;do read -p "please input an executable command or 'quit' to exit: " option if [ -z "$option" ];then continue elif [ "$option" == "quit" ];then echo "bye!" break else which $option &> /dev/null order_state=$? if [ $order_state -eq 0 ];then order_path=$(which $option) echo echo "the binary file is: $order_path" cp --parents $order_path /mnt/sysroot echo "the binary file is copy finished!" echo ldd $order_path &> /dev/null ldd_state=$? if [ $ldd_state -eq 0 ];then echo "shared library dependencies:" declare -a lib_files lib_files=(`ldd $order_path | grep -E -o "/[^[:space:]]+"`) for i in ${!lib_files[*]};do echo ${lib_files[$i]} cp --parents ${lib_files[$i]} /mnt/sysroot done echo "shared library dependencies are copy finished!" else echo "no shared library dependencies!" fi echo continue else echo "no this command!" continue fi fi done } copy_fun
原创文章,作者:萝卜,如若转载,请注明出处:http://www.178linux.com/61238
评论列表(1条)
赞~几个脚本的例子总结的不错~~~继续加油~