1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端 POST: 加电自检; ROM:CMOS BIOS:Basic Input and Output System :基本输入输出系统 主机先激活CPU ROM+RAM 检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常Boot Sequence(BIOS) 按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备;bootloader: 引导加载器,程序Boot Loader (MBR)446: bootloader64: fat2: 55AAGRUB: stage1:stage1的代码直接存在于MBR,是后续引导的入口,无识别文件系统的能力。 stage1.5: MBR之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统,具有识别文件系统的能力。 stage2:加载磁盘分区(/boot/grub/) kernel: 自身初始化: 探测可识别到的所有硬件设备; 加载硬件驱动程序;(有可能会借助于ramdisk加载驱动) 以只读方式挂载根文件系统; 运行用户空间的第一个应用程序:/sbin/init init程序的类型: SysV: init, CentOS 5 配置文件:/etc/inittab Upstart: init, CentOS 6 配置文件:/etc/inittab, /etc/init/*.conf Systemd:systemd, CentOS 7 自己能加载服务 配置文件:/usr/lib/systemd/system, /etc/systemd/systemramdisk --> ramfs CentOS 5: initrd, 工具程序:mkinitrd CentOS 6: initramfs, 工具程序:mkinitrd, dracutsh 设置运行级别 运行级别:为了系统的运行或维护等应用目的而设定; 0-6:7个级别 0:关机 1:单用户模式(root, 无须登录), single, 维护模式; 2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式; 3:多用户模式,正常模式;文本界面; 4:预留级别;可同3级别; 5:多用户模式,正常模式;图形界面; 6:重启 /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) 清理操作;
-
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文件以及一个引导镜像。描述其过程。
创建kickstart文件的方式: (1) 直接手动编辑; 依据某模板修改; (2) 可使用创建工具:system-config-kickstart (CentOS 6) 依据某模板修改并生成新配置; 检查ks文件的语法错误:ksvalidator # ksvalidator /PATH/TO/KICKSTART_FILE 创建引导光盘: # 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) 每3秒钟,查看一次用户是否登录; #!/bin/bash
#!/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 mem) display memory info disk) display disk info quit) quit 非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash # cat << EOF cpu) show cpu information; mem) show memory information; disk) show disk information; quit) quit ============================ EOF read -p "Enter a option: " option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option, Enter again: " option done if [ "$option" == 'cpu' ]; then lscpu elif [ "$option" == 'mem' ]; then cat /proc/meminfo elif [ "$option" == 'disk' ]; then fdisk -l else echo "Quit" exit 0 fi
-
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
原创文章,作者:N21_ Dominic,如若转载,请注明出处:http://www.178linux.com/45236