一、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
A.POST加电自检
主板在接通电源后,系统首先由POST程序来对内部各个设备进行检查,自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。
B.BIOS Sequence启动引导阶段
自检通过之后,按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备。一般电脑是按”F2″或”Del”键等等进入BIOS,在里面我们可以调整硬盘的启动顺序。找到第一个有引导程序的设备后,BIOS会找到设备中的MBR,读取其中的Bootloader。
C.GRUP引导阶段
这时候就可以看到我们的Centos系统了,但是一般都不需要操作,会自动启动系统。其实我们也可以自己手动启动系统的。
1).手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
2).grub的命令行接口:
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#) 设定grup的根设备
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
boot: 引导启动选定的内核;
3).配置文件:/boot/grub/grub.conf
配置项:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [–md5] STRING: 菜单编辑认证;
title TITLE:定义菜单项“标题”, 可出现多次;用来引导多个内核或者操作系统
root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [–md5] STRING: 启动选定的内核或操作系统时进行认证
D.kernel加载内核阶段内核会自身初始化
探测可识别到的所有硬件设备;加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init5.init初始化阶段内核加载完毕,会运行init程序,init进程起来后,系统启动的控制权移交给init进程/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:
1).执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;
2).确定启动后进入的运行级别;
3).执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。
4).有关key sequence的设置
5).有关UPS的脚本定义
6).启动虚拟终端/sbin/mingetty
7).在运行级别5上运行X配置文件:/etc/inittab每行定义一种action以及与之对应的processid:runlevels:action:processid:一个任务的标识符;runlevels:在哪些级别启动此任务;#,###,可以为空,表示所有级别;action:在什么条件下启动此任务;process:任务;(脚本或程序)action:wait:等待切换至此任务所在的级别时执行一次;respawn:一旦此任务终止,就自动重新启动之;initdefault:设定默认运行级别;此时,process省略;sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态;查看:chkconfig –list [name]添加:chkconfig –add name删除:chkconfig –del name修改指定的链接类型:chkconfig [–level LEVELS] name–level LEVELS:指定要控制的级别;默认为2345;
init命令:
级别切换:init #
级别查看:who -r
注:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
二、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
~]# cat /proc/partitions
major minor #blocks name
8 16 83886080 sdb
8 17 10485760 sdb1
8 18 1 sdb2
8 21 5242880 sdb5
8 22 5242880 sdb6
8 23 5242880 sdb7
8 24 5242880 sdb8
8 25 5242880 sdb9
8 0 125829120 sda
8 1 1048576 sda1
8 2 124779520 sda2
8 32 5242880 sdc
8 33 2097152 sdc1
8 34 2097152 sdc2
8 48 5242880 sdd
8 49 5241856 sdd1
8 64 5242880 sde
8 65 5241856 sde1
11 0 8086528 sr0
253 0 52428800 dm-0
253 1 2097152 dm-1
253 2 70246400 dm-2
[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc1
[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc2
###准备boot目录###
[root@ronny1 ~]# mkdir /mydata/boot
[root@ronny1 ~]# mount /dev/sdc1 /mydata/boot
[root@ronny1 ~]# ls /mydata/boot
lost+found
###安装grub###
[root@ronny1 ~]# grub-install –root-directory=/mnt /dev/sdc
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
[root@ronny1 ~]# ls /mydata/boot
grub lost+found
###复制内核文件和initramfs###
[root@ronny1 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mydata/boot/vmlinuz
[root@ronny1 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mydata/boot/initramfs.img
###添加grub配置文件###
[root@ronny1 ~]# vim /mydata/boot/grub/grub.conf
default=0
timeout=5
title CentOS-HAN
root(hd0,0)
kernel /vmlinuz ro root=/dev/sdc2
initrd /initramfs.img
###此处: root配置rootfs根分区###
###准备根目录结构和程序###
[root@ronny1 ~]# mkdir /mydata/sysroot
[root@ronny1 ~]# mount /dev/sdc2 /mydata/sysroot
[root@ronny1~]# cd /mydata/sysroot
[root@ronny1 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
mkdir: created directory `etc’
mkdir: created directory `bin’
mkdir: created directory `sbin’
mkdir: created directory `lib’
mkdir: created directory `lib64′
mkdir: created directory `dev’
mkdir: created directory `proc’
mkdir: created directory `sys’
mkdir: created directory `tmp’
mkdir: created directory `var’
mkdir: created directory `usr’
mkdir: created directory `home’
mkdir: created directory `root’
mkdir: created directory `mnt’
mkdir: created directory `media’
[root@ronny1 sysroot]# cp /bin/bash /mydata/sysroot/bin/
[root@ronny1 sysroot]# ldd /bin/bash
linux-vdso.so.1 => (0x00007ffdb9371000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003787200000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000377f600000)
libc.so.6 => /lib64/libc.so.6 (0x000000377fa00000)
/lib64/ld-linux-x86-64.so.2 (0x000000377f200000)
[root@ronny1 sysroot]# cp /lib64/libtinfo.so.5 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libdl.so.2 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libc.so.6 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /bin/ls /mydata/sysroot/bin/
[root@ronny1 ~]# ls /mydata/sysroot/bin
bash ls
[root@ronny1 sysroot]# cp /lib64/libselinux.so.1 /mydata/sysroot/lib64/ [root@ronny1 sysroot]# cp /lib64/libacl.so.1 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libattr.so.1 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libpcre.so.1 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# cp /lib64/libpthread.so.0 /mydata/sysroot/lib64/
[root@ronny1 sysroot]# ls /mydata/sysroot/lib64
ld-linux-x86-64.so.2 libc.so.6 libpthread.so.0
libacl.so.1 libdl.so.2 libselinux.so.1
libattr.so.1 libpcre.so.1 libtinfo.so.5
###测试命令###
[root@ronny1 sysroot]# chroot /mydata/sysroot
bash-4.1# ls
bin etc lib lost+found mnt root sys usr
dev home lib64 media proc sbin tmp var
bash-4.1# exit
exit
[root@ronny1 sysroot]# sync
[root@ronny1 sysroot]# sync
[root@ronny1 sysroot]# sync
###修改init程序,指定init程序(bash)###
default=0
timeout=5
title CentOS-HAN
root(hd0,0)
kernel /vmlinuz ro root=/dev/sdc2 selinux=0 init=/bin/bash
initrd /initramfs.img
[root@ronny1 sysroot]# sync
三、制作一个kickstart文件以及一个引导镜像。描述其过程
1. 准备系统iso镜像目录(centos7.2)
[root@ronny1 ~]# mkdir /mnt/cdrom
[root@ronny1 ~]# mount /dev/sr0 /mnt/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@ronny1 ~]# mkdir /mnt/iso
[root@ronny1 ~]# cd /mnt/cdrom
[root@ronny1 cdrom]# cp -frav * /mnt/iso
[root@ronny1 cdrom]# cp .discinfo /mnt/iso
2. 定制kickstart
[root@ronny1 ~]# yum -y install system-config-kickstart
[root@ronny1 ~]# system-config-kickstart
[root@ronny1 ~]# ksvalidator ks.cfg
3. 整合镜像文件和ks文件,并修改相关配置
[root@ronny1 ~]# cd /mnt/iso
[root@ronny1 iso]# vim isolinux/isolinux.cfg
定制启动标签 ,指定ks位置
label custom
menu label ^Install CentOS 7
menu default
kernel vmlinuz
append initrd=initrd.img inst.ks=cdrom:/isolinux/ks.cfg inst.stage2=hd:LABEL=CENTOS7 quiet
其中,需要把其它启动项中的menu default去掉,加在上面的自定义启动项中,这样当你从光盘启动时,才会默认选择该项,并且有倒计时,由于默认的光盘倒计时时间太久了,为600秒,我们把timeout 600改成timeout 100,这样默认就是10秒倒计时了。
拷贝ks文件到光盘根目录
[root@ronny1 iso]# cp /root/ks.cfg isolinux/
[root@ronny1 iso]# ls isolinux/
boot.cat grub.conf isolinux.bin ks.cfg splash.png upgrade.img vmlinuz
boot.msg initrd.img isolinux.cfg memtest TRANS.TBL vesamenu.c32
4. 重新打包ISO
[root@ronny1 iso]mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V “CentOS 7 x86_64 boot” -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso iso/
5. 加载新生成的镜像,并启动
使用Xshell 将生成的boot.iso copy到windows系统下,就可以用虚拟机引导启动了。
四、写一个脚本
(1) 能接受四个参数:start, stop, restart, status start: 输出“starting 脚本名 finished.” …
(2) 其它任意参数,均报错退出;
#!/bin/bash
#description:
case $1 in
start)
echo “staring $0 finished”
;;
stop)
echo “stop $0 finished”
;;
restart)
echo “restart $0 finished”
;;
status)
echo “status $0 finished”
;;
*)
echo “error”
exit 1
;;
esac
五、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash
#description:
while true; do
if who |grep $1 &> /dev/null;then
echo “$1 is login”
exit 0
fi
sleep 3
done
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash
#description:display cpu,memory,disk info
cat << EOF
cpu)display cpu info
mem)display memory info
disk)display disk info
quit)quit
EOF
read -p “please input your choice ” choice
while true;do
case $choice in
cpu)
lscpu
exit 0
;;
mem)
free -m
exit 0
;;
disk)
fdisk -l
exit 0
;;
quit)
echo “quit”
exit 0
;;
*)
echo “Error please input cpu,mem,disk,quit”
read -p “please input your choice ” choice
;;
esac
done
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;
进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
userinfo() {
if id “$username” &> /dev/null; then
grep “^$username\>” /etc/passwd | cut -d: -f3,7
else
echo “No such user.”
fi
}
read -p “please input one username or quit: ” username
while true;do
if [ $username == “quit” ];then
exit
else
userinfo
read -p “please input one username or quit: ” username
fi
done
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87723