前言沙子龙的办公室改成了客栈。东方大梦无从醒来。----老舍《断魂枪》云计算大潮来了,我把IT技术收起来像五虎杀枪。我不会压到箱底的,偶尔练练聊天,纪念技术黄金时代。这篇文章讲了一个很有嚼劲的技术问题,Linux系统的启动过程,当我们不用自己安装系统的时候,我们就失去了很多乐趣。主板上电,写入硬件自检,是开机后第一屏启动界面。如果CPU和内存有问题,服务器会发出哔哔声,网卡和硬盘插不插都无所谓,因为这些外设都不是经典的电脑系统。早期的小内存服务器一般都有内存检测功能,但是256G内存的服务器启动太慢了。重启后一分钟内可以启动的服务可以恢复。重新启动三分钟后,群集行为可能会发生变化。把他关掉了。2.读取主板开机配置,现在终于可以从外部设备读取数据了。大多数主板都是BIOS启动,也有一些是UEFI启动,但从服务器用户的角度来看,差别不大。主板可选择从USB/SATA/NIC接口获取启动数据,并可以队列加载。如果第一个加载失败,请尝试第二个。系统安装镜像有倒计时防止误操作,网络启动一般在最下面,硬盘启动一般是启动系统的方式。爱折腾台式机的朋友,从这一步开始玩双系统/WINPE/USB版Ubuntu/无盘工作站。好在服务器维护人员比较简单敬业。3.读取MBR(可跳过)。如果是BIOS引导,作为老古董,只能读MBR,而MBR可以读GRUB;而UEFI则跳过MBR,直接读取GRUB。BIOS把引导权限交给了MBR这446字节,而这446字节连Linux引导界面上的logo都放不下。MBR只是一个搬运工,会将引导权限交给GRUB。在经历了几天糟糕的日子后,我曾经使用dd来备份每台服务器的前512个字节,但是自从我做了备份之后,我就再也没有遇到过任何糟糕的情况。##抱歉,没有图片4.GRUB引导并启动vmlinuz内核。如果GRUB2细化有stage1、stage1.5、stage2多个步骤,我们可以简单的认为前两步是等到stage2加载完成。我们使用GRUB来选择要加载的内核,并将大量的启动参数传递给它,这样我们就可以在多个OS、多个Kernel、多个运行级别之间来回切换。网上的GRUB调试教程都是针对这一步的。我们也可以直接传参以单用户模式启动,不用密码直接登录服务器。有些人习惯给/boot一个128M的小分区,可能老师老师说这样比较“安全”。即早期版本的GRUB程序无法读取GB级磁盘分区,无法加载vmlinuz内核。现在只是一种迷信。5.内核开机加载驱动,不过这还没有接触到任何业务。相同版本的vmlinuz内核在不同硬件上的hash值是相同的,因为驱动信息放在initrd*.img中。Initrd*.img是一个包含所有驱动程序的流线型linux映像。一般是安装系统后自动生成,也可以事后手动生成。有一次建议用集成镜像安装一个部分软件,但安装后无法启动。我用相同的内核版本和硬件配置替换了init*.img后,系统正常启动了。加载所有驱动程序后,内核将卸载initrd*.img。在早期的Linux版本中,在系统启动过程中,仍然可以看到很多“umountfilesystem”的提示。那不是卸载官方文件系统,而是卸载initrd*.img。小系统,##Sorrynopicture6.Init进程启动,服务正式启动。从看到“欢迎使用CentOS”的彩色欢迎文字开始,init服务就已经启动了。之前的启动过程也是读取BIOS/MBR/GRUB和/boot分区,现在终于开始读取/etc目录下的配置文件了。首先要读取的是/etc/fstab,每个磁盘都挂载到位。这个文件注释很简单,但是水很深。是用标签还是UUID来标识磁盘,是否开启文件系统自检功能?这可以讨论几个小时。查看每个服务的启动优先级也是一个微妙的过程。很容易理解iptables会先于网络启动这种依赖;但是我也遇到过云平台DHCP获取太慢,云主机操作系统启动很快,网络没有从DHCP获取IP地址,Mysqld等需要监听端口的服务启动失败。后记以上内容只能算是Linux系统启动过程的简化科普版。正式版启动过程能写10万字。有兴趣的朋友可以自己查维基百科,或者用我说的关键词百度一下。以前我把这些技能看成是资质,现在大家都上云了,也不过是唠叨而已。但是客户可以通过上云节省一名工程师来研究这个事情。上云真的很有意义。夜深人静,沙子龙关上小门,六十四枪一剑刺下;然后,倚着枪,望着天上的星星,他想起了野店野林的雄伟。叹了口气,他用手指缓缓抚摸着冰凉滑溜的枪身,然后微微一笑,“别传!别传!”----老舍《断魂枪》
