1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)

CentOS系统启动流程如下:

POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> GRUB --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init --> 


(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端


每个过程具体工作内容说明如下:

1.加电自检POST(Power On Self Test)

主机加电开机后,首先进行硬件自检。主机通电后,主板会自动读取ROM中的程序,并从CMOS中加载BIOS信息,检查各种硬件设备是否完整,如内存,硬盘、显卡及各种I/O设备等。如遇到硬件故障的话将按两种情况进行处理:对于严重故障(致命性故障)则直接停机,此时由于各种初始化操作未完成,不能给出任何提示或信号;对于非严重故障,则会给出相应的提示或声音报警信号,等待用户处理。如果没有遇到故障,则加电自检通过,将后续工作交接给BIOS处理。

       

2.启动顺序Boot Sequence

POST完成后,系统控制权转交到BIOS(Basic Input/Output System),BIOS通过预设的参数识别基础硬件设备,启动硬件初始化;同时按照系统启动顺序依次查找各引导设备,第一个有引导程序的设备即为本次启动用到设备(一般为本地硬盘)。BIOS完成相关工作后,将后续工作交接给MBR中的Bootloader处理。

       

3.启动加载BootLoader

硬盘上第0头0道第1扇区被称为MBR(Master Boot Record),即主引导记录。虽然MBR仅有512个字节,但却存放了前446个字节的启动加载器(Bootloader,其中装有GRUB)、中间64个字节的磁盘分区表(Disk Partition Table)以及最后2个字节的结束标识(Magic Number)。启动设备读取MBR中前个446字节的Bootloader寻找GRUB,接着读取MBR后的扇区来识别磁盘分区表DPT以及内核Kernel所在的区域,最后启动GRUB。        


4.引导加载器GRUB(GRand Uniform Bootloader)

第1阶段(stage 1)

读取磁盘设备上第0头0道第1扇区的MBR;用来加载第2阶段, 只存放了Bootloader的部分代码

第1.5阶段(stage 1.5)

读取MBR之后的扇区,让第1阶段中的Bootloader能够识别到第2阶段所在分区上的文件系统

第2阶段(stage 2)

找到grub的配置文件(/boot/grub/grub.conf <-- /etc/grub.conf或/boot/grub2/grub.cfg),并根据其中的预设内容给用户提供一个可选择的菜单,用于选择想要启动的系统或内核版本。同时stage2即/boot/目录下还提供了Linux系统内核文件(vmlinuz文件)和虚拟文件系统文件(initramfs)等其它核心文件。

最后,GRUB把用户选定的启动系统或内核装载到内存中的特定空间中解压、展开,并把系统控制权移交给内核Kernel。


5.加载Kernel

自身初始化        

探测可识别到的所有硬件设备;

加载硬件驱动程序(有可能会借助于ramdisk加载驱动);

以只读方式挂载根文件系统rootfs;

切换至根文件系统switchroot;

运行用户空间的第一个应用程序:/sbin/init

至此,内核初始化完成,后续任务交给用户空间程序,只在模式切换或系统发生中断时,内核才会参与。


6.初始化init

/sbin/init最主要的功能就是准备系统运行环境,包括系统的主机名称、网络配置、语系处理、文件系统格式及其他服务的启动等

init程序的类型:

CentOS 5:SysV init

配置文件:/etc/inittab


CentOS 6:Upstart init

配置文件:/etc/inittab, /etc/init/*.conf


CentOS 7:Systemd systemd

配置文件:/usr/lib/systemd/system, /etc/systemd/system


7.配置文件/etc/inittab,设置默认运行级别

运行级别:为了系统的运行或维护等应用目的而设定;

0-6:7个级别

0:关机

1:单用户模式(root, 无须登录), single, 维护模式;

2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;

3:多用户模式,正常模式;文本界面;

4:预留级别;可同3级别;

5:多用户模式,正常模式;图形界面;

6:重启


8.配置文件/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) 清理操作;

    

9.对应脚本程序,关闭需要关闭的服务,启动需要启动服务 

根据运行级别的不同,系统会运行/etc/rc.d/rc0.d到/etc/rc.d/rc6.d中的响应的脚本程序,来完成相应服务的关闭和启动,并执行用户自定义开机启动程序脚本/etc/rc.d/rc.local。


10.配置文件/sbin/mingetty,设置启动终端

mingetty会调用/etc/login程序,登入成功后,整个系统启动流程完成。  



2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

(1) 为硬盘新建两个主分区;并为其安装grub;

[root@localhost Desktop]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xac72d6fd
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb2             263         524     2104515   83  Linux
Command (m for help): q
[root@localhost Desktop]# mke2fs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost Desktop]# mke2fs -t ext4 /dev/sdb2
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526128 blocks
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost Desktop]# mkdir -p /mnt/myboot /mnt/myroot
[root@localhost Desktop]# mount /dev/sdb1 /mnt/myboot/
[root@localhost Desktop]# mount /dev/sdb2 /mnt/myroot/
[root@localhost Desktop]# ls /mnt/myboot/
lost+found
[root@localhost ~]# grub-install --root-directory=/mnt/myboot /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/myboot/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0)/dev/fd0
(hd0)/dev/sda
(hd1)/dev/sdb
[root@localhost ~]# ls /mnt/myboot/boot/
grub


(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

[root@localhost ~]# cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/myboot/boot/vmlinuz
[root@localhost ~]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/myboot/boot/initramfs.img
[root@localhost ~]# ls /mnt/myboot/boot/grub  initramfs.img  vmlinuz
[root@localhost ~]# mkdir -pv /mnt/myroot/{bin,dev,etc/{rc.d/init.d,sysconfig/network-
scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
mkdir: created directory `/mnt/myroot/bin'
mkdir: created directory `/mnt/myroot/dev'
mkdir: created directory `/mnt/myroot/etc'
mkdir: created directory `/mnt/myroot/etc/rc.d'
mkdir: created directory `/mnt/myroot/etc/rc.d/init.d'
mkdir: created directory `/mnt/myroot/etc/sysconfig'
mkdir: created directory `/mnt/myroot/etc/sysconfig/network-scripts'
mkdir: created directory `/mnt/myroot/lib'
mkdir: created directory `/mnt/myroot/lib/modules'
mkdir: created directory `/mnt/myroot/lib64'
mkdir: created directory `/mnt/myroot/proc'
mkdir: created directory `/mnt/myroot/sbin'
mkdir: created directory `/mnt/myroot/sys'
mkdir: created directory `/mnt/myroot/tmp'
mkdir: created directory `/mnt/myroot/usr'
mkdir: created directory `/mnt/myroot/usr/local'
mkdir: created directory `/mnt/myroot/usr/local/bin'
mkdir: created directory `/mnt/myroot/usr/local/sbin'
mkdir: created directory `/mnt/myroot/var'
mkdir: created directory `/mnt/myroot/var/lock'
mkdir: created directory `/mnt/myroot/var/log'
mkdir: created directory `/mnt/myroot/var/run'


(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

[root@localhost ~]# cp `ldd /bin/{bash,ls,cat} | grep -oe "/lib.*[[:space:]]" | sort -u` /mnt/myroot/lib64/
[root@localhost ~]# chroot /mnt/myroot/
bash-4.1# ls
bin  dev  etc  lib  lib64  lost+found  proc  sbin  systmp  usr  var
bash-4.1# exit
exit
[root@localhost ~]# sync


(4) 为grub提供配置文件;

[root@localhost ~]# vim /mnt/myboot/boot/grub/grub.conf
[root@localhost ~]# cat /mnt/myboot/boot/grub/grub.conf
default=0
timeout=5
title MyCentOS6
root hd(0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs.img


(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

[root@localhost ~]# init 6

重启后进入bios设置 调整硬盘启动顺序后保存退出。



3、制作一个kickstart文件以及一个引导镜像。描述其过程。

1.制作一个kickstart文件

一般通过system-config-kickstart工具(默认系统不自带,需要另行安装)或手动编辑(可参考/root/anaconda-ks.cfg)来创建ks.cfg的kickstart文件

关键字段说明如下:

#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
# 安装介质,可以是光驱或指定URL路径(http或ftp)
cdrom
# Run the Setup Agent on first boot
# 首次引导禁用代理
firstboot --disable
ignoredisk --only-use=sda
# Keyboard layouts
# 键盘样式
keyboard --vckeymap=us --xlayouts='us'
# System language
# 系统语言
lang en_US.UTF-8
# Network information
network  --bootproto=dhcp --device=eno16777728 --onboot=off --ipv6=auto
network  --hostname=localhost.localdomain
# Root password
# 加密后的root密码
rootpw --iscrypted $6$vrl5aUHW0KQkjl36$NKJRP/JGTiPV65ZAHKsa.T2jREHzBeQLUU1VHQHfLdAj2Zin4P74Mg6o96Ac3nKJnDDW2vvQ4KiSW7wT8X2tj.
# System timezone
# 系统时区
timezone Asia/Shanghai --isUtc
# X Window System configuration information
xconfig  --startxonboot
# System bootloader configuration
# 系统引导配置,在MBR安装引导程序
bootloader --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
# 清空所有磁盘内容并初始化
clearpart --all --initlabel
# Disk partitioning information
# 自定义分区
part /boot --fstype="ext4" --size=500
part swap --fstype="swap" --size=2000
part / --fstype="ext4" --grow --size=1
# Firewall configuration
# 防火墙设置为关闭
firewall --disabled
# SELinux configuration
# SElinux设置为禁用
selinux --disabled
# 程序包段
%packages
@base
@core
@desktop-debugging
@dial-up
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@input-methods
@internet-browser
@multimedia
@print-client
@x11
%end


2.准备系统ISO镜像(RHEL7),并复制到自己要创建的引导镜像

[root@localhost ~]# mount /dev/cdrom /media/cdrom/
[root@localhost ~]# cd /media/cdrom/
[root@localhost ~]# mkdir /mnt/iso
[root@localhost cdrom]# ls -al
total 819
dr-xr-xr-x. 10 root root   4096 May  7  2014 .
drwxr-xr-x.  3 root root     18 Aug  2  2016 ..
dr-xr-xr-x.  4 root root   2048 May  7  2014 addons
-r--r--r--.  1 root root     48 May  7  2014 .discinfo
dr-xr-xr-x.  3 root root   2048 May  7  2014 EFI
-r--r--r--.  1 root root   8266 Apr  4  2014 EULA
-r--r--r--.  1 root root  18092 Mar  6  2012 GPL
dr-xr-xr-x.  3 root root   2048 May  7  2014 p_w_picpaths
dr-xr-xr-x.  2 root root   2048 May  7  2014 isolinux
dr-xr-xr-x.  2 root root   2048 May  7  2014 LiveOS
-r--r--r--.  1 root root    108 May  7  2014 media.repo
dr-xr-xr-x.  2 root root 774144 May  7  2014 Packages
dr-xr-xr-x. 24 root root   6144 May  7  2014 release-notes
dr-xr-xr-x.  2 root root   4096 May  7  2014 repodata
-r--r--r--.  1 root root   3375 Apr  1  2014 RPM-GPG-KEY-redhat-beta
-r--r--r--.  1 root root   3211 Apr  1  2014 RPM-GPG-KEY-redhat-release
-r--r--r--.  1 root root   1568 May  7  2014 TRANS.TBL
-r--r--r--.  1 root root   2166 May  7  2014 .treeinfo
[root@localhost cdrom]# cp -a * /mnt/iso/
[root@localhost cdrom]# cp .discinfo /mnt/iso/


3.将制作完成的ks文件与镜像文件整合

[root@localhost cdrom]# cp /root/ks.cfg /mnt/iso/isolinux/
[root@localhost cdrom]# cd /mnt/iso/isolinux/
[root@localhost isolinux]# ll
total 72840
-r--r--r--. 1 root root     2048 May  7  2014 boot.cat
-r--r--r--. 1 root root       84 May  7  2014 boot.msg
-r--r--r--. 1 root root      321 May  7  2014 grub.conf
-r--r--r--. 1 root root 35544564 May  7  2014 initrd.img
-r--r--r--. 1 root root    24576 May  7  2014 isolinux.bin
-r--r--r--. 1 root root     3166 May  7  2014 isolinux.cfg
-rw-------. 1 root root     1044 Jun 21 00:48 ks.cfg
-r--r--r--. 1 root root   176500 Jan  2  2014 memtest
-r--r--r--. 1 root root      186 Mar  3  2014 splash.png
-r--r--r--. 1 root root     2438 May  7  2014 TRANS.TBL
-r--r--r--. 1 root root 33744152 May  7  2014 upgrade.img
-r--r--r--. 1 root root   155792 Feb 28  2014 vesamenu.c32
-r-xr-xr-x. 1 root root  4902000 May  5  2014 vmlinuz


修改isolinux.cfg配置文件,在append initrd=initrd.img添加ks文件读取路径inst.ks=cdrom:/isolinux/ks.cfg

[root@localhost isolinux]# vim isolinux.cfg 
[root@localhost isolinux]# cat isolinux.cfg | grep ks
  append initrd=initrd.img inst.ks=cdrom:/isolinux/ks.cfg inst.stage2=hd:LABEL=RHEL7 quiet


4.创建引导光盘

[root@localhost isolinux]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "RHEL 7.0 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/RHEL7.iso /mnt/iso/
[root@localhost isolinux]# ll /root/RHEL7.iso 
-rw-r--r--. 1 root root 3843938304 Jun 21 01:11 /root/RHEL7.iso