第10周作业
1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)。
CentOS系统启动详细的过程如下(以CentOS7为例):
-
加电自检(POST)
按下电源开关,BIOS系统随即开始加电自检,检查CPU、内存、主板及各接口、硬盘、键盘、光驱等,检测它们的好坏。 -
读取启动顺序
检查完成后,BIOS会根据预先设定好的启动顺序去挨个寻找可引导设备,它找到的第一个有引导程序的设备成为本次启动的引导设备。 -
主引导记录(MBR)
BIOS程序会自动去读取可引导设备中具有引导作用的代码部分,即通常所说的主引导记录(MBR),共512字节大小,由446字节的bootloader,64字节的分区表,2字节的结束标志组成。 -
GRUB
现主流的GRUB版本为grub 1.x,即grub2。它的代码不能完全装于MBR扇区中,所以将它分为两段,一起来完成系统的引导工作。工作过程分以以下几个阶段: -
stage1
这一阶段的代码位于MBR中,BIOS读取MBR中的boogloader代码,这段代码不包含文件系统的驱动,但它可以识别到stage2位于哪个分区中,但因为不包含文件系统的驱动所以stage1无法直接访问stage2所在的分区,因此就有了stage1_5,以构建stage1和stage2通信的桥梁。 -
stage1_5
这个阶段的代码位于MBR后的63个扇区之中,它的作用是提供各种文件系统的驱动文件,以便stage1中的程度可以和stage2所在的分区通信进而找到stage2所存储的内核文件和rootfs的文件系统驱动。 -
stage2
因为此时GRUB已可识别stage2所在的文件系统,所以这个阶段它会找到grub的配置文件(/boot/grub2/grub.cfg),并根据其中的设定给用户提供一个可选择的菜单,用于选择想要启动的系统或内核版本。同时stage2即/boot/目录下还提供了Linux系统内核文件(vmlinuz文件)和虚拟文件系统文件(initramfs)等其它核心文件。
待用户选择了相应的系统或等待超时后,系统启动进入下一个阶段。 -
Bootloader
提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM(内存)中的特定空间中,解压,展开,而后把系统控制权移交给内核。现在Linux中流行的bootloader程序是grub,它的工作过程是这样的: -
系统内核加载
在用户选择了要启动的系统后,这时bootloader程序会将/boot下的内核文件、虚拟文件系统文件加载至内存中解压并运行,至此bootloader的工作已圆满完成。接下来的工作将由Linux内核来完成。
内核首先探测所有可识别的硬件设备,然后加载驱动,有的设备驱动可能需要借助虚拟根文件系统来装载。
由于现在很多硬件驱动都是以模块的形式存在的,如usb,raid,lvm,scsi,sata。此时的内核还不具备驱动这些设备的能力。(正如我们经常看到各Linux发行版它们的/boot分区文件系统不会是lvm或raid,大多为单独的一个分区)这时就需要用到initramfs这个虚拟的根文件系统,这样就可以借助这个虚拟的根文件系统来加载各模块驱动,进而可以挂载各设备,包括磁盘上真实的根文件系统。此阶段使用的是只读挂载。 -
启动systemd
在系统核心将硬件识别及驱动加载完成后主机硬件已经准备就绪。此时内核会主动启动系统第一个程序:systemd。systemd的主要功能是完成以下任务: -
挂载/etc/fstab里所有的文件系统(local-fs.target+swap.target)
-
侦测硬件,加载所需要的核心模块(sysinit.target)
-
加载主要的外围硬件设备驱动程序和防火墙相关任务(basic.target)
-
加载multi-user.target相关的服务,如tty登录界面等
-
加载图形界面相关的服务
当登录终端tty或者图形界面加载完成以后,至此,整个系统的启动工作即已完成。
2、为运行于虚拟机上的CentOS 6添加一块新硬盘,提供两个主分区。
(1) 为硬盘新建两个主分区;并为其安装grub。
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs。
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件。
(4) 为grub提供配置文件。
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机。
这题纠结了很久,浪费了大量的时间,做了几十遍,但总是会碰到提示according mtab /dev/sda2 已经挂载的错误提示,导致系统不能正常启动,找了很多同学做的作业,以及搜索错误提示信息,但都没个准确的说法和解决办法。但唯一做成的一次其步骤如下,和马哥视频中的也只是个别步骤的顺序不同。(总结一点:当理论还不足以撑起随便折腾的欲望时,请使用前人的方法,完全照抄然后加以熟练。)
新增硬盘为系统中识别为sdb,相关步骤如下:
fdisk /dev/sdb #然后创建两个主分区(sdb1,sdb2,sdb3),并且创建一个swap分区,因为宿主机有swap分区,强烈建议和宿主环境保持一致 mke2fs -t ext4 /dev/sdb1 #给新分区创建ext4文件系统 mke2fs -t ext4 /dev/sdb3 #给新分区创建ext4文件系统 mkswap /dev/sdb2 #启用swap分区 mkdir /mnt/boot #给新分区创建挂载点 mkdir /mnt/sysroot #给新分区创建挂载点 mount /dev/sdb1 /mnt/boot #将新分区挂载至/mnt/boot,作用类似于/boot分区 mount /dev/sdb2 /mnt/sysroot # 将新分区挂载至/mnt/sysroot,用于后面构建新系统的rootfs grub-install --root-directory=/mnt /dev/sdb #root-directory指定根所在的位置,不要指定/mnt/boot,gurb会自动去找指定路径下的boot目录的,/dev/sdb 用于指定想将grub安装到哪个设备上。 cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/ #为新硬盘第一分区提供内核文件 cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/ #为新硬盘第一分区提供ramdisk文件 mkdir -pv /mnt/sysroot/{bin,sbin,lib,lib64,etc,home,root,media,mnt,dev,tmp} #为第二分区提供rootfs cp /bin/{bash,ls,cat} /mnt/sysroot/bin #将/bin目录下的bash,ls,cat程序复制到/mnt/sysroot/bin目录中 cp `ldd /bin/{bash,ls,cat} | grep -o "/lib64/.*[[:space:]]" | sort -u` /mnt/sysroot/lib64 #将bash,ls,cat所依赖的库文件一同复制到新rootfs中的lib64目录中 cp /boot/grub/splash.xpm.gz /mnt/boot/grub/ #提供开机画面背景图片(此处使用原系统中的图片) cp /etc/grub.conf /mnt/boot/grub/ #给新的grub提供配置文件 vim /mnt/boot/grub/grub.conf #编辑新硬盘中的grub配置文件 ,修改kernel处的root=/dev/sda2,硬盘编号为BIOS识别的顺序,第一个识别到的编号为a,这里这块硬盘在此系统中实际为sdb,但把它拿到一台没有硬盘的机器上去,它就成了sda。数字2表示为硬盘上的第2个分区,然后保存退出,关机,将硬盘卸载,然后以此硬盘新建虚拟机,以验证配置结果。以下为grub.conf文件需要发动的配置的说明: title CentOS 6 (2.6.32-642.el6.x86_64) Test_OS #在此处添加了"Test_OS" root (hd0,0) #只有一块硬盘的情况下,其编号即为0,这里的root实际是指grub的根,是指grub stage2和kernel文件所在的分区,我们将grub stage2和kernel文件放置在了新增硬盘的第一分区,在grub中编号从0开始。 kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda3 selinux=0 init =/bin/bash #此处指定文件系统的根所在的位置,在Linux系统中分区编号是从开始的,我们把根文件系统建立在这块硬盘上的第3个分区上了,并同时关闭了selinux,将指定init程序为/bin/bash initrd /initramfs-2.6.32-642.el6.x86_64.img #此处指定虚拟文件系统文件的位置。 最后新建虚拟机并指定使用这块新增的虚拟磁盘,然后启动虚拟机,即可进入系统,并以bash程序初始化系统,只有ls和cat指令以及bash内置指令可以使用
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
可以使用系统安装过程中生成的文件(/root/anaconda-ks.cfg)加以修改或者使用图形化的kickstart工具来完成kickstart文件的制作。图形化kickstart工具需要先安装system-config-kickstart软件包。以下是使用图形化工具生成的一份文件,全部选项配置完成以后,将文件保存为ks.cfg了,详细内容如下:
[root@localhost ~]# more ks.cfg #platform=x86, AMD64, or Intel EM64T #version=DEVEL # Firewall configuration firewall --disabled #关闭防火墙 # Install OS instead of upgrade install #指定安装类型为全新安装 # Use CDROM installation media cdrom #安装方式配置为从光驱安装 # Root password rootpw --iscrypted $1$2xS8GSnM$IHzs2YYbCRGvcJmNxQ51W0 #加密后的root账号密码,配置时输入明文密码,并启用加密选项 # System authorization information auth --useshadow --passalgo=sha512 #指定root密码加密方式 # Use graphical install graphical #使用图形化方式进行安装 firstboot --disable #第一次启动的时候禁用代理 # System keyboard keyboard us #设定键盘为美式键盘 # System language lang en_US #设定系统语言为美式英语 # SELinux configuration selinux --disabled #关闭selinux # Installation logging level logging --level=info #设定anaconda日志级别 # Reboot after installation reboot #设定安装完成后系统自动重启 # System timezone timezone Asia/Shanghai #设定系统时区为上海 # Network information network --bootproto=dhcp --device=eth0 --onboot=on #设定网卡开机自启,并使用dhcp获取ip # System bootloader configuration bootloader --location=mbr #设定bootloader的安装位置,安装到mbr中 # Partition clearing information clearpart --all #设定清理磁盘上所有分区信息 # Disk partitioning information part / --fstype="ext4" --size=20000 #按需要自定义分区 part /boot --fstype="ext4" --size=500 part swap --fstype="swap" --size=2000 %packages #选择要安装的软件包 @chinese-support @desktop-platform-devel @development @eclipse @emacs @hardware-monitoring @internet-browser @kde-desktop @network-tools @perl-runtime @ruby-runtime @x11 %end
bash 56
制作引导镜像:
先将光盘镜像文件挂载至光驱,然后将除Packages和repodata之外的目录全部copy至某目录下,如/tmp/myiso;
然后使用如下指令生成名为boot.iso的引导镜像,放置于/boot目录下。
mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.6 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.catlog -o /root/boot.iso /tmp/myiso/
原创文章,作者:N24_lantian,如若转载,请注明出处:http://www.178linux.com/65727
评论列表(1条)
对于开机启动流程其实是一个非常重要的知识,尤其是在面试过程中经常会被问到,所以这部分希望能通过自己的理解图解出来。