1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
1.开启电源后,POST自检:检查硬件设备,通过后交给BIOS 2.BIOS加载可选择的启动设备,寻找可引导的启动设备的记录:MBR 3.MBR:硬盘的主引导记录,存在于0磁道0扇区,共512字节.其中Bootloader占用446字节,分区表占用64字节,magic num占用2字节,MBR加载Bootloader去开始后面的工作 4.常用的内核加载器是grub。 1)1st stage:位于MBR中,为了引导2nd stage 2) 1.5 stage:位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展 3) 2nd stage:位于boot基本磁盘分区中,GRUB的引导程序 5.通过grub加载内核后,内核开始自我解压并工作,通过虚拟根文件系统initrfs调用init工作 6./sbin/init程序被内核第一个调用,PID为1。init调用期配置文件和启动脚本,从而启动各个子进程
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
1) [root@localhost ~]# fdisk /dev/sdb (n;p;+10G;w) [root@localhost ~]# partx -a /dev/sdb [root@localhost ~]# mkfs.ext4 /dev/sdb1 [root@localhost ~]# mkfs.ext4 /dev/sdb2 [root@localhost ~]# mkdir /mnt/{boot,rootfs} [root@localhost ~]# mount /dev/sdb1 /mnt/boot/ [root@localhost ~]# mount /dev/sdb2 /mnt/rootfs/ [root@localhost ~]# grub-install --root-directory=/mnt/ /dev/sdb 2) [root@localhost ~]# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/vmlinuz [root@localhost ~]# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/initramfs.img 3) [root@localhost ~]# mkdir -p /mnt/rootfs/{bin,lib64} [root@localhost ~]# cp -r /bin/{bash,ls,cat} /mnt/rootfs/bin/ [root@localhost ~]# cp $(ldd /bin/bash | awk '$3~/^\/lib64/{print $3}') /mnt/rootfs/lib64/ [root@localhost ~]# cp $(ldd /bin/ls | awk '$3~/^\/lib64/{print $3}') /mnt/rootfs/lib64/ [root@localhost ~]# cp $(ldd /bin/cat | awk '$3~/^\/lib64/{print $3}') /mnt/rootfs/lib64/ 4) [root@localhost ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS 6.6 (Test) root (hd0,0) kernel /vmlinuz ro root=/dev/sdb2 selinux=0 init=/bin/bash initrd /initramfs.img 5) 在BIOS中选择sdb作为启动盘
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
(1)制作一个kickstart文件 安装system-config-kickstart #yum install -y system-config-kickstart #system-config-kickstart 打开一个ks文件 根据需要配置好相关的内容,将文件另存为myks.cfg (2)创建引导镜像 在/tmp 目录下创建目录myiso ,在myiso 目录下创建isolinux 目录; #mkdir -p /tmp/myiso/isolinux 将光盘上的isolinux 下的文件都拷贝到新建的目录下; #cp /media/isolinux/* /tmp/myiso/isolinux/ 将myks.cfg文件复制到/tmp/myiso 目录下; 创建ISO文件系统 # mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6.8 x86_64 boot" -b /tmp/myiso/isolinux/isolinux.bin -c /tmp/myiso/isolinux/boot.cat -o /root/boot.iso myiso
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
…
(2) 其它任意参数,均报错退出;
#!/bin/bash if [ $# -ne 1 ];then echo "only one argument" exit 1 else case $1 in start) echo "starting $0 finished." ;; stop) echo "stoping $0 finished." ;; restart) echo "restart $0 finished." ;; *) echo "error,exit!" exit 1 ;; esac fi
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash if [ $# -ne 1 ];then echo "only one argument" exit 1 fi if `id $1 &> /dev/null`;then while true;do if `w | grep "^$1" &> /dev/null`;then echo "$1 is login." exit 0 else echo "$1 is not loging,waiting..." sleep 3 fi done else echo "argument is not username" fi
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash while true;do echo "please input a option:" echo "input 'cpu' display cpu info" echo "input 'mem' display memory info" echo "input 'disk' display disk info" echo "input 'quit' exit this script" read test case $test in cpu) echo "`cat /proc/cpuinfo`" ;; mem) echo "`cat /proc/meminfo`" ;; disk) fdisk -l ;; quit) exit 0 ;; *) echo "input error options" continue ;; esac done
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash function user { if `id $username &> /dev/null`;then echo "userid : `id -u $username`" echo "shell : `grep "^$username\>" /etc/passwd | cut -d: -f 7`" else echo "username is wrong" fi } while true;do read -p "Please input a username or quit:" username if [ $username == "quit" ];then exit 0 else user $username fi done
8、写一个脚本,完成如下功能(使用函数)
(1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
(2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;
#!/bin/bash function lib_cp { lib_path=`whereis $1 | cut -d' ' -f2` for i in $(ldd $lib_path | grep -o "/[^[:space:]]*");do libdir=$(dirname $i) [ -d $path$libdir ] || mkdir $path$libdir [ -f $path$i ] || cp $i $path$libdir done } function cmd_cp { cmd_path=$(which $1 | grep -v "^alias" | grep -o "/.*/") [ -d $path$cmd_path ] || mkdir -p $path$cmd_path [ -f $path/$1 ] || cp $cmd_path/$1 $path$cmd_path } path=/mnt/sysroot [ -d $path ] || mkdir -p $path read -p "input any command :" cmd lib_cp $cmd cmd_cp $cmd
原创文章,作者:N21_smile,如若转载,请注明出处:http://www.178linux.com/52280
评论列表(1条)
启动流程可以更详细一些,具体都做了那些工作。