1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
POST(Power On Self Test):
检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。
加载BIOS(Basic Input and Output System):
根据在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器(硬盘、光盘、U盘等)。在平时的启动过程中,大多为硬盘启动,基于此,BIOS会读取硬盘的第0磁道的第1扇区(MBR)的内容来引导启动。
BOOT Sequence:
按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备
MBR(Master Boot Record):
三部分组成,分别是主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition Table)和magic number。
Bootloader:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核。
在Linux中常用的主引导程序有LILO(LInux LOader)和GRUB(GRand Uniform Bootloader),此处以GRUB引导为例。
启动引导程序GRUB:
stage1:stage1的代码直接存在于MBR,是后续引导的入口,无识别文件系统的能力。
stage1.5: MBR之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统,具有识别文件系统的能力。
stage2:加载磁盘分区(/boot/grub/)
启动内核:
当stage2被载入内存执行时,首先会解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。而内核会立即作自身初始化。
-
探测可识别的所有硬件设备
-
加载硬件驱动程序(可能会借助于ramdisk加载驱动)
-
以只读方式挂载rootfs
-
运行用户空间的第一个应用程序:/sbin/init
运行init程序
-
CentOS 5:SysV
-
CentOS 6:Upstart
-
CentOS 7:Systemd
设置默认运行级别
-
CentOS 5:/etc/inittab
-
CentOS 6:/etc/inittab,/etc/init/*.conf
-
CentOS 7:default.target–>/usr/lib/systemd/system/*.target
运行系统初始脚本,完成系统初始化
/etc/rc.d/rc.sysinit
启动内核模块
/etc/modules.conf
/etc/modules.d/*
关闭对应级别下应关闭的服务,启动需要启动的服务
/etc/rc.d/rc#.d/*
执行自定义引导程序
/etc/rc.d/rc.local
设置登陆终端
/sbin/mingetty
2、为运行于虚拟机上的CentOS 6添加一块新硬盘,提供两个主分区;
(1)为硬盘新建两个主分区,并为其安装grub;
(2)为硬盘的第一个主分区提供内核和ramdisk文件,为第二个主分区提供rootfs;
(3)为rootfs提供bash、ls、cat程序及依赖的库文件;
(4)为grub提供配置文件;
(5)将新的硬盘设置为第一启动项并能够正常启动目标主机;
# mkfs -t ext4 /dev/sdb1 && mkfs -t ext4 /dev/sdb2 # mount /dev/sdb1 /media/boot # grub-install --root-directory=/media /dev/sdb # cp /boot/vmlinuz-2.6.32-358.el6.i686 /media/boot/vmlinuz # cp /boot/initramfs-2.6.32-358.el6.i686.img /media/boot/initrmfs.img # vim /media/boot/grub/grub.conf default=0 timeout=5 title centos (express) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 initrd /initrmfs.img # mount /dev/sdb2 /mnt/sysroot # sh cpcom.sh Enter a command:bash Enter a command:ls Enter a command:cat Enter a command:quit Quit 新建虚拟机,以新建虚拟磁盘为引导,可以正常启动!
3、制作一个kickstart文件以及一个引导镜像,描述其过程;
可使用system-config-kickstart图形化工具可视化操作完成生成ks文件 制作镜像:# 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 myiso/
4、写一个脚本
(1)能接受四个参数:start、stop、restart、status
start:输出“starting 脚本名 finished”
(2)其他任意参数,均报错退出;
#!/bin/bash read -p "Please enter start,stop,restart or status:" option case $option in start) echo "Starting $0 finished" ;; stop) echo "Stopped $0 finished" ;; status) echo "The status of $0" ;; restart) echo "Restart $0" ;; *) echo "Wrong option" && exit 1 ;; esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1)如果登录了,则显示用户登录,脚本终止;
(2)每三秒钟,查看一次用户是否登录
#!/bin/bash read -p "Please enter a user:" user while true; do if who | grep "^$user" &> /dev/null; then break fi sleep 3 && echo "$user not log." done echo "$user logged."
6、写一个脚本,显示用户选定要查看的信息;
cpu) display CPU info
men) dispaly memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并请求用户重新选择,直到其给出正确的选择为止;
#!/bin/bash cat << EOF cpu) show cpu info; mem) show memory info; disk) show disk info; quit) Quit ======================= EOF read -p "Please enter an option:" option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option,enter again:" option done case "$option" in cpu) lscpu ;; mem) cat /proc/meminfo ;; disk) fdiskc -l ;; quit) echo "Quit!" && exit 0 ;; esac
7、写一个脚本
(1)用函数实现返回一个用户的UID和SHELL,用户名通过参数传递而来;
(2)提示用户输入一个用户名或者输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步的,显示键入的用户的相关信息后,再次提醒输出用户名或quit
#!/bin/bash userinfo() { uid=`id -u $user` shell=`finger root -l | grep -o 'Shell.*' | cut -d' ' -f2` id $user &> /dev/null if [ $? -ne 0 ]; then echo "No such user!" && exit 1 else echo "$user UID :$uid" echo "$user SHELL:$shell" fi } cat << EOF You could enter a user or string of "quit": a user:show the uid and shell; quit:quit the script. =========================================== EOF while true; do read -p "Please enter something:" option if [[ $option == "quit" ]]; then echo "Quit!" && exit 0 else user=$option fi userinfo $user done
8、写一个脚本,完成下列功能(使用函数)
(1)提示用户输入一个可执行命令的名字,获取此命令依赖的所有库文件;
(2)复制命令文件至/mnt/sysroot目录下的对应rootfs的路径上,例如,如果复制的文件路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
(3)复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs路径上;规则同上面命令相关的要求;
#!/bin/bash options() { for i in $*; do dirname=`dirname $i` [ -d /mnt/sysroot$dirname ] || mkdir -p /mnt/sysroot$dirname [ -f /mnt/sysroot$i ] || cp $i /mnt/sysroot$dirname/ done } while true; do read -p "Enter a command:" pidname [[ "$pidname" == "quit" ]] && echo "Quit" && exit 0 bash=`which --skip-alias $pidname` if [[ -x $bash ]]; then options `/usr/bin/ldd $bash | grep -o "/.*[[:space:]]\{1,\}"` options $bash else echo "No such command!" fi done
原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/44521