1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
Centos系统启动过程分内核空间启动和用户空间启动:
内核空间启动流程:
- POST: post加点自检,检测计算机基本5大件是否完好,计算机可被正常点亮。
- BootSequence: 位于ROM上的BIOS的BootSequence来选择启动顺序
- Bootloader: 决定启动顺序后,在启动设备上的MBR的前446bytes加载bootloader
- Ramdisk: bootloader需要引导内核的加载,在这过程需要加载ramdisk来驱动真正的内核加载
- rootfs: 内核加载后将根文件系统以只读的方式挂载
- /sbin/init: 启动1号进程,/sbin/init,接下来的系统的管理都交给了1号进程
用户空间启动流程:
- 设置默认的运行级别
- 运行系统初始化脚本(/etc/rc.d/rc.sysinit),完成系统初始化
- 关闭对应级别下需要关闭的服务
- 启动对应级别下需要启动的服务
- 设置登陆终端
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
- (1) 为硬盘新建两个主分区;并为其安装grub;
- (2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
- (3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
- (4) 为grub提供配置文件;
- (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
以下是我的分区: /dev/sdb1 boot 200M /dev/sdb2 / 2G /dev/sdb3 swap 1G 在/mnt下创建/boot /sysroot目录 挂载/dev/sdb1到/mnt/boot,/dev/sdb2到/mnt/sysroot 创建grub # grub-install --root-directory=/mnt /dev/sdb 复制linux内核与ramdisk # cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz # cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img 创建grub.conf # cd /mnt/boot/grub # vim grub.conf default 0 timeout 5 title Centos (zgx) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img 创建根文件系统目录 # cd /mnt/sysroot # mkdir bin sbin dev etc home lib lib64 media mnt proc root sbin sys tmp usr var 拷贝几个程序 # cp /bin/bash /mnt/sysroot/bin # ldd /bin/bash linux-vdso.so.1 => (0x00007ffcdc8d5000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f973fc3a000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f973fa36000) libc.so.6 => /lib64/libc.so.6 (0x00007f973f6a1000) /lib64/ld-linux-x86-64.so.2 (0x00007f973fe64000) # cp /lib64/libtinfo.so.5 lib64/ # cp /lib64/libdl.so.2 lib64/ # cp /lib64/libc.so.6 lib64/ # cp /lib64/ld-linux-x86-64.so.2 lib64/ # sync 将这块硬盘作为虚拟机的启动盘,可以正常的启动小linux
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
在图形界面界面制作安装system-config-kickstart 在图形界面制作个kickstart #修改引导镜像的内核参数 #mount /dev/cdrom /mnt/cdrom #mkdir /myboot #cp /mnt/cdrom/ioslinux /myboot #cp ks.cfg /myboot #cd /mnt/cdrom/ioslinux #vim isolinux.cfg ... label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img ks=cdrom:/ks.cfg ... #cd / #重新封装引导镜像 #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 将引导镜像进行安装可以进行自动安装
4、写一个脚本
-
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
… - (2) 其它任意参数,均报错退出;
#!/bin/bash pidfile=/var/run/myservice.pid start() { if [ -e $pidfile ];then echo "myservice aleardy start." else pid=$$ echo "${pid}" > $pidfile echo "starting myservice finished" fi } stop() { if [ -e $pidfile ];then rm -f $pidfile echo "stopping myservice finished" else echo "myservice is not running" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) if [ -e $pidfile ];then echo "myservice is running" else echo "myservice is not running" fi ;; *) echo "Usage: $0 [start|stop|restart|status]" esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
- (1) 如果登录了,则显示用户登录,脚本终止;
- (2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash while true;do if who | grep ansible &> /dev/null;then echo "ansible aleardy login." break else sleep 3 continue fi 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 choose:" choose case ${choose} in cpu) lscpu ;; mem) free -m ;; disk) df -HT ;; quit) exit ;; *) continue esac done
7、写一个脚本
- (1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
-
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash user() { grep "^$1\>" /etc/passwd |awk -F':' '{print "user",$1,"uid",$3}' } while true;do read -p "enter a user:" username if [ $username == 'quit' ];then break else user $username echo "enter quit to exit" fi done
8、写一个脚本,完成如下功能(使用函数)
- (1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
- (2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
- (3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;
规则同上面命令相关的要求;
#!/bin/bash target=/mnt/sysroot cmd() { if which $cmd $> /dev/null;then cmdpath=`which --skip-alias $cmd` else echo "no such command" return 6 fi } cmdcopy() { cmddir=`dirname $1` [ -d ${target}${cmddir} ] || mkdir -p ${target}${cmddir} [ -f ${target}${1} ] || cp $1 ${target}${cmddir} } libcopy(){ for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do libdir=`dirname $lib` [ -d ${target}${libdir} ] || mkdir -p ${target}${libdir} [ -f ${target}${lib} ] || cp $lib ${target}${libdir} done } while true;do read -p "enter a command:" cmd if [ "$cmd" == 'quit' ];then echo quit exit 0 fi cmd $cmd [ $? -eq 5 ] && continue cmdcopy $cmdpath libcopy $cmdpath done
原创文章,作者:N25_随心,如若转载,请注明出处:http://www.178linux.com/71032
评论列表(1条)
作业品质保持的很好,继续加油。