声明:本人没用过UEFI模式和GPT分区格式,所有关于这两部分的内容都是网络上找的资料,仅供参考。 典型启动顺序
从上面的过程可以看出,一个PXE服务器至少包含一个DHCP server和一个TFTP server。 以硬盘启动及GRUB2为例,接着介绍Linux的启动过程
注意事项:GRUB2GRUB2需要加载/boot下的grub模块才能工作,所以格式化Linux分区一定要注意,如果不小心格式化了/boot所在的分区,会导致GRUB2用不了,从而启动不了任何系统。 GRUB2同时需要加载硬盘上的Linux内核文件,所以它也需要有文件系统的驱动,当然它只需要读取文件,所以驱动很小。GRUB2已经支持所有的常见文件系统,并且完全支持LVM和RAID。 参考: BIOS VS UEFIUEFI可以简单理解为新一代的BIOS,支持更多新的功能,当然它也向下兼容BIOS,现在新的主板都支持UEFI,只是我们BIOS叫习惯了,所以就算主板已经支持新的UEFI,我们还是把它当BIOS用。UEFI的优点请参考 这里 。 BIOS和UEFI两者启动系统的方式不一样,BIOS是读取硬盘第一个扇区的MBR到内存中,然后将控制权交给MBR里的Bootloader。而UEFI是读取efi分区,如果efi分区存在且里面有启动程序的话,将控制权交给启动程序,否则和BIOS一样,读取硬盘第一个扇区的MBR到内存中,将控制权交给MBR里面的Bootloader。从这里可以看出:
如何判断原系统的模式: 如何以UEFI模式安装: Ubuntu 参考: MBR VS GPTMBR格式硬盘的布局 ------------------------------------------------------------------ | | | | |-------------------------------| |MBR| 主分区1 | 主分区2 | 主分区3 | 扩展 |逻辑分区1|...|逻辑分区n | | | | | |-------------------------------| ------------------------------------------------------------------ ↓ 扩展分区是一个特殊的主分区,分区最前面包含所有逻辑分区的描述,包含大小,位置等
GPT主要用来替换MBR,并且配合UEFI使用。 在Windows和OS X上,只支持通过UEFI方式启动GPT硬盘,而FreeBSD,Linux依然支持BIOS模式启动GPT硬盘。 GPT的主要优点:
参考: 内核参数和initrd image下面是一个GRUB2配置的例子 kernel /boot/vmlinuz-2.6.9-1.667 ro root=/dev/hda5 quiet initrd /boot/initrd-2.6.9-1.667.img 当GRUB2加载完Linux内核(/boot/vmlinuz-2.6.9-1.667)后,将这里的“ro root=/dev/hda5 quiet”做为参数传给Linux内核,然后将控制权交给Linux内核。Linux支持的内核参数请点 这里 ,其中一个重要的参数是"init" 'init=...' 指定init程序的位置,Linux内核初始化完成后,将运行该位置所指定的程序 , 并将该进程作为第一个用户态进程,设置其进程ID为1 如果没有指定这个参数,或者这个参数指定的位置不存在, Linux内核将依次搜索/sbin/init, /etc/init, /bin/init, /bin/sh这些路径, 如果都不存在,Linux将启动失败。 这里指定的init程序可以是可执行文件,软链接,也可以是脚本。 initrd image是干嘛的呢?我们都知道Linux内核模块的概念,比方说Linux支持N种不同的文件系统,Ext2/3/4,XFS, Btrfs等等,那需要把所有的这些文件系统驱动都编译进内核吗?当然不需要,因为这样做会导致内核太大,运行时占用太多的内存,取而代之,我们会把这些驱动编译成一个一个的内核模块,在需要用到的时候再把它们加载进内核,其它时间存放在磁盘上就好了。 现在有个问题,在GRUB将控制权交给Linux内核后,内核需要启动init程序,这个init程序是放在某个磁盘分区上的,这个磁盘分区用的是N个文件系统中的某一个,内核到哪里找这个文件系统的驱动呢?这个时候initrd image出场了,它里面包含了很多驱动模块,并且用的是内存文件系统,内存文件系统的驱动已经编译到内核中了,所以内核是可以直接访问initrd image的(老版本的initrd可能用的其它格式,但不管怎么样,肯定是被内核支持的格式)。当然initrd image里面不仅仅只包含文件系统的驱动,还有其它的很多文件,这个跟每个发行版有关,具体的内容可以参考相应的发行版。 init内核启动的第一个用户态进程init到底是个什么东东?其实它就是一个普通的程序,内核并没有对它做什么要求,只是别退出就好,init进程如果挂了的话,系统就崩溃了,至于init进程干些啥,启动其它的哪些进程,跟内核已经没有关系了,内核的任务就是管理硬件资源并调度这些用户态进程。我们也可以写一个我们自己的init程序放到那里,它也会正常的被内核启动起来。 除了在init进程里指定了handler的信号外,内核会帮init进程屏蔽掉其他所有信号,包括普通进程无法捕获和屏蔽的信号SIGKILL和SIGSTOP,这样可以防止其他进程不小心kill掉init进程导致系统挂掉。这是内核给用户态启动的第一个进程的特殊待遇。 init是用户态的第一个进程,所以非常重要,各个Linux发行版都用这个进程来创建很多子进程,然后让这些子进程来初始化用户态的环境,如mount各个分区,启动各个服务等,现在各个发行版主要采用这三种框架中的一种 sysvinit , upstart , systemd 简单点说,sysvinit出现最早,简单易用,但缺点是速度慢,比如有10个服务需要在开机时启动,那么sysvinit只能一个接一个的启动它们,即使他们之间没有任何关系,也不能并行的启动。于是出现了upstart,upstart基于事件驱动,可以让没有关系的服务并行的启动,这样可以加快开机速度。但是人们觉得还是不够快,于是出现了systemd,它可以通过一定的技术和技巧让有关系的服务也能并发的启动,当然导致的结果是systemd比较复杂。这里只提到了启动速度,当然还有其他方面的改进,详情请参考: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|