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