1. 请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)。 CentOS系统启动流程图: (1) post加电自检 当计算机的硬件加电后,会进行自检,这个过程通常称为POST(P
1. 请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)。
CentOS系统启动流程图:
(1) post加电自检
当计算机的硬件加电后,会进行自检,这个过程通常称为POST(Power On Self Test),加电的过程会检查计算机各部件是否存在以及是否能够正常工作。
(2) 加载bootloader
自检完成后,主板上的BIOS程序通常是转向第一块硬盘的第一个扇区即主引导记录(MBR)来装载bootloader。
主引导记录MBR(Master Boot Record)在磁盘的第一个扇区中,大小为512字节:前446字节是bootloader,中间64个字节为DPT即磁盘分区表,最后两个字节为MBR的有效标识,55AA表示MBR有效。
bootloader的作用是允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到RAM的特定空间中,解压、展开,而后把系统控制权移交给内核;但由于bootloader的大小只有446字节,意味着其能够实现的代码和任务有限,所以centos使用grub的机制来启动系统的引导过程。
grub将引导的过程分成了1,2两个阶段,第一个阶段加载bootloader,此时bootloader不加载内核,而是用来加载grub的第二阶段至内存中,其后可以在内存中不受MBR的限制可以实现很多复杂的功能以及加载用户选择的内核,并能够传递参数至内核。
(3) 内核的初始化
内核(kernel)的初始化分为四个步骤:
a. 探测可识别到的所有硬件设备;
b. 加载硬件驱动程序(有可能会借助于ramdisk加载驱动);由于内核不可能将所有硬件设备的驱动直接编译进内核中,所以当内核无法加载根文件系统所在设备的驱动程序时,便会由特定的工具程序来创建生成ramdisk文件,ramdisk是运行于内存中的一个简装版的根文件系统,其作用在于:ramdisk会在内存中加载一个虚拟根文件系统去识别真正的根文件系统所需的驱动程序并加载,加载完成后,内核便可识别真正的根文件系统并将其挂载,此时ramdisk再将根切换给真正的根文件系统,自己退出内存;
c. 以只读方式挂载根文件系统;防止内核有bug导致根文件系统上的数据丢失,在系统初始化时内核会以读写方式重新挂载根文件系统;
d. 最后将任务转交给init程序来加载运行用户空间的第一个应用程序:/sbin/init。
(4) 运行init程序,设定Linux的运行等级
对于CentOS 5来说,初始化程序init是sysVinit,其配置文件为:/etc/inittab;
对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab, /etc/init/*.conf,也就是upstart将配置文件拆分成多个,在/etc/init/目录下以conf结尾的都是upstart风格的配置文件,而/etc/inittab仅用于设置默认运行级别;
对于CentOS 7来说,初始化程序init是systemd,其配置文件为:/usr/lib/system/systemd/*, /etc/systemd/system/*;
根据init配置文件设置默认运行级别,是为了系统的运行或维护等目的而设定的机制。默认运行的是3、5级别。
运行级别是为了系统的运行和维护等目的而设定的一种机制,对于CentOS 5/6来讲,一共有7种运行级别,即0-6,它们的意义如下:
0:关机模式,shutdown;
1:单用户模式(single user):不需要通过认证,登录进去之后为root用户身份,是维护模式;
2:多用户模式(multi user):会启动网络功能,但不会启动NFS,是维护模式;
3:多用户模式(multi user):为完全功能模式,提供文本界面;
4:预留级别,目前无特别使用目的,但习惯上以同3级别功能来使用;
5:多用户模式(multi user):为完全功能模式,提供图形界面;
6:重启模式,reboot。
如:id:5:initdefault:
(5) init进程执行rc.sysinit
设定了运行等级后,Linux系统执行/etc/rc.d/rc.sysinit系统初始化脚本程序。初始化包括:设置主机名、设置欢迎信息、激活Udex和seliux、挂载/etc/fstab文件中定义的所有文件系统、检测根文件系统、设置系统时钟、根据/etc/sysctl.conf文件来设置内核参数、激活LVM及软RAID设备、激活swap设备、加载额外设备的驱动程序、执行清理操作。
(6) 启动内核模块
具体是依据/etc/sysconfig/modules文件目录下的文件来装载内核模块。
(7) 执行run-level的各个服务启动(script方式)
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
(8) 执行/etc/rc.d/rc.local
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
(9) 执行/bin/login程序,进入登录状态
Linux 就会启动终端机或者是 X Window 来等待使用者登录。
2. 为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区:
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机。
分区后创建文件系统:
mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
挂载分区sdb1到/mnt/boot下:
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot
安装grub:
grub-install --root-directory=/mnt /dev/sdb
复制内核及ramdisk文件到sdb1上:
cp /boot/initramfs-3.10.0-514.el7.x86_64.img /mnt/boot/initramfs.img
cp /boot/vmlinuz-3.10.0-514.el7.x86_64 /mnt/boot/vmlinuz
在/mnt/boot/grub目录下编辑新建grub.conf文件:
vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS-HAN
root(hd0,0)
kernel /vmlinuz ro root=/dev/sdb2
initrd /initramfs.img
挂载分区sdb2到/mnt/sysroot下:
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
建立FHS:
mkdir -pv /mnt/sysroot/{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}}
拷贝bash、ls、cat程序及其依赖库:
cp /bin/{bash,ls,cat} /mnt/sysroot/bin
cp `ldd /bin/{bash,ls,cat} |grep -oe "/lib.*[[:space:]]"|sort -u` /mnt/sysroot/lib64/
chroot /mnt/sysroot 测试一下是否正常即可
将新加的磁盘挂载到新虚拟机中,关闭原虚拟机,启动新虚拟机
3. 制作一个kickstart文件以及一个引导镜像,并描述其过程。
制作kickstart文件:
(1)通过手动编辑,可以依据某个模板来进行修改;
(2)使用kickstart文件创建工具:system-config-kickstart进行配置,同样可以导入某个模板并修改。
比如:通过使用kickstart文件创建工具
首先确认system-config-kickstart已经安装,如果没有安装可以使用yum安装;
其次运行system-config-kickstart命令可启动窗口界面。在窗口界面可以直接进行配置(不使用模板),首先完成基本配置,可设置语言类型、键盘类型、时区、管理员密码(加密)以及安装的平台类型等选项:
选择安装方式,可以通过网易镜像网站(mirrors.163.com)安装程序包;
选择安装类型、MBR的安装位置以及向内核传递的参数等;
设置分区信息;
网卡配置,可以静态指定也可以使用dhcp动态获取网络属性配置;
认证方式配置;
设定是否开启防火墙和selinux功能;
设定是否安装图形界面;
选定要安装的程序包;
设定安装前要执行的脚本;
设定安装后要执行的脚本;
最后保存,可以用ksvalidator命令检查kickstart文件语法错误(ksvalidator ks.cfg执行后没有任何信息显示则说明语法无错误)
制作引导镜像:
(1)创建myboot目录;
(2)查看光盘是否已挂载;
(3)将光盘中的isolinux目录复制到刚才创建的myboot目录,同时也把刚才制作的kickstart文件复制进myboot目录;
(4)如果原有光盘镜像是只读挂载的,那么复制过来的文件均只有只读权限,需要先将其修改为可写权限;
(5)修改myboot/isolinux/isolinux.cfg配置文件,向默认启动的label所定义的内核传递参数,执行kickstart文件的存放位置;
(6)退出myboot目录,并为myboot目录及其目录中的所有文件制作成光盘引导镜像,而myboot目录作为光盘镜像中的根目录;
比如:mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-tabl
e -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso
./myboot/
mkisofs 选项参数说明
"CentOS 6 x86_64 boot" //光盘卷标;
isolinux/boot.cat //MBR中的bootloader;
isolinux/isolinux.bin //bootloader的第二阶段;
/root/boot.iso //指定存放在哪里,并命名之;
./myboot/ //指定某个目录为“根”创建光盘镜像;