建设工作站服务器
整个deepin操作系统的启动过程是什么样的?
我以前被同事问过类似的问题。 遇到这样宏伟而漫无边际的问题,我的回答是:“你还太软了。 现在我告诉你我还是会忘记的,只要做到两年前,我不说也知道”。 我一边敲键盘,一边佩服自己的聪明。
两年后……
这个年轻人长大了,紧紧地又问了同样的问题。 我一愣,脑子里一个接一个地浮现出“出来混,迟早得还”的声音。
想想也想想。 差不多是必须拿出箱底商品的时候了。 毕竟我在限制“半吊子系统工程师”的title。 在我自律的title上,还有很多东西。 半吊子的顾客服务、半吊子的产品经理、半吊子的研发项目经理等等……
概要
deepin系统的启动,从整体上看主要分为
硬件通电、内核启动、内核启动、系统初始化、图形界面等几个阶段。
将这些阶段分为两个部分,第一部分硬件加电、内核启动、内核启动主要是“引导”,而偏重于内核启动的第二部分系统初始化、图形界面两个阶段的主要任务对于一个系统来说,只有内核是不行的,各种服务管理系统的硬件和软件也是一般来说分发不是纯粹的GNU/Linux内核和概念的理由之一。
从软件开发人员的角度,介绍各阶段的理解和调试方法。
接通硬件电源
既然说了作为软件开发者的立场,那这部分对我来说基本上就相当于黑匣子。 但我们知道,一般来说,这部分主要是:
接通硬件电源
BIOS/UEFI
引导加载器
从你按下电源的那一刻起,电流就会流入主板,启动BIOS(basicinputoutputsystem )系统。
BIOS系统顾名思义是最直接与硬件进行交互的系统。 因为有标准规定,所以输入输出设备的所有基本功能都可以使用。 某些硬件的交换机配置也可以在BIOS中操作。
此外,BIOS有两个重要功能。 一个是硬件自检。 另一个是负载引导。 硬件自检和“半吊子系统工程师”没有任何关系,不用说。 路导的过程其实是大家熟悉的MBR,蝌蚪在找妈妈…啊,不…在MBR里找bootloader。
支持BIOS的UEFI和它们的区别在于,负载引导方法有很大的不同。 对我来说,界面可能已经可以用鼠标点击了吧。 嗯……哈哈。
在这里说段子。 在前面的15.7中进行启动时间优化时,进行测试的同学测试了系统的启动时间优化情况。 我一直说效果不理想。 我们去看看吧。 他们测试系统的启动是因为硬件的启动。 我说请直接从内核的启动开始计算,他问了我为什么。 优化时间/(BIOS时间GRUB时间内核时间图形时间)和优化时间/(内核时间图形时间)哪个更大? 只能说这个测试的同学数学不太好……
内核启动
当BIOS为MBR或UEFI为主板专用存储设备且找到并加载引导加载器时,引导加载器将开始加载Linux内核并启动。
GRUB引导
deepin系统的默认引导加载器是接地引导加载器( grub )。 其实我一直觉得这个名字很恶心。 大神们果然很有分量……GRUB不需要按照什么规则在硬盘上找系统,而是根据/boot/grub/grub.cfg的启动项目加载内核,启动系统。 此配置文件将在安装系统或手动运行update-grub命令时生成和更新。
update-grub命令实际上是针对grub-mkconfig的包,在非Debian类的分发中没有。 grub-mkconfig执行的操作主要包括:
加载/etc/default/grub的几个设置项目。 例如,GRUB_CMDLINE_LINUX_DEFAULT配置条目控制Linux的引导参数。
按顺序运行/etc/grub.d/目录中的脚本,以生成最终的grub.cfg文件。 例如,要说平时看在执行update-grub命令时输出的哪个启动项目,实际上是在/etc/grub.d/03_os-prober这个脚本中用os-prober这个工具
在GRUB界面中选择启动项目,然后按e键编辑启动项目。 除了使用普通的上下左右键移动光标外,还可以使用基本的Emacs快捷键。
Ctrl N下一行
Ctrl P的上一行
Ctrl B向左移动一个字符
Ctrl F向右移动一个字符
将Ctrl A光标移动到行首
将Ctrl E光标移动到行尾
编辑完成后,按Ctrl X键根据编辑的结果启动系统,但不保存编辑的结果。 这意味着,如果需要永久修改启动项目,则必须修改grub.cfg文件或grub.cfg生成的/etc/default/grub和/etc/grub.d/脚本文件
关于GRUB,我们一般需要知道的只有这个。 有关GRUB的其他使用和知识,请参见题为GRUB和系统引导( https://blog.Nanpu yue.com/2017/037.html )的文章。
UFI直接引导
在UEFI模式下,除了使用GRUB引导内核外,还可以直接通过UEFI引导内核。 有关具体配置方法,请参阅debianwikiefistub ( https://wiki.debian.org/EFI stub )。 请注意,使用efibootmgr创建启动项目时,必须使用-d参数指定设备。 否则,启动项目的创建可能会失败。
内核启动
内核启动部分其实主要是想说initrd。 initrd是一个小型rootfs,它可以保证内核启动期间所需的内核模块和用户状态工具。 此外,还必须为下一阶段“系统初始化”,即init程序准备真正的文件系统并启动init程序。 内核使用initrd启动的过程主要包括:
1 .运行init脚本(这不是上面的init程序,而是您创建的initramfs中的/init文件。 之后的步骤实际上会在此脚本的执行过程中发生。)
2 .解析内核启动参数,标识调试、引导、引导等关键物品;
执行/scripts/init-top/的脚本;
4 .加载内核模块
执行/scripts/init-premount/的脚本;
执行/scripts/$BOOT脚本中的mountroot函数。 其中$BOOT参数由在步骤2中识别的boot参数指定,附带的选项为local (本地启动,缺省)、nfs (例如PXE启动) )。
执行/scripts/init-bottom/的脚本;
运行init程序。
生命周期系统
在上面的步骤6中,initramfs-tools软件包附带了两种boot类型: local和nfs。 使用live系统时的boot类型实际上是live。 这种boot类型主要由一个叫live-boot的包支撑。
当启动活动系统时,/scripts/live的装载根通过调用/lib/live/boot/目录中的脚本来设置根文件系统。 这包括在ISO上设置挂起和叠加。
调试
initrd启动阶段支持一些特殊的启动参数以帮助调试。
1.debug打开initrd启动脚本调试模式;
2.break可以说是在启动的某个阶段停止了。 例如,break=premount在装载真正的根文件系统之前停止启动过程,并赋予busybox环境。 可选的break阶段显示在/scripts/init脚本中。 使用maybe_break的行。
系统初始化
从这个阶段开始,即使启动过程进入了实际的系统,init程序也会启动各种服务来配置系统,确保硬件和软件环境正常使用。
deepin系统上的默认init程序是systemd。 这个庞然大物太复杂了。 将来,也许能打孔写一系列的系列就好了。 ……此处简要介绍了与系统启动过程相关的内容。 一个是man bootup的图:
它基本上涵盖了systemd接管系统时,systemd管理的服务之间的依赖关系和基本优先级。
另一个是systemd-analyze命令,通过systemd-analyze plog bootup.svg可以更直观地看到systemd中每个服务在启动过程中启动和存在的时间。
图形界面
图形界面阶段是系统到达图形环境后的过程,主要包括以下几个部分:
显示管理器. service启动lightdm;
灯光DM启动灯光DM-deepin-greeter;
用户输入密码后,进入图形会话
lightdm执行/usr/sbin/deepin-session;
/usr/sbin/deepin-session
运行/etc/X11/Xsession.d脚本,最终启动/usr/bin/startdde;
startdde启动了桌面环境的组件,系统启动完成。
结尾曲
啊,对了,文章开头的故事是虚构的。 请不要核对号码。
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn