Blog

home category

开机过程和名词解释IV - 操作系统

11 May 2014

操作系统阶段

之前记录的可认为是Linux启动的第一个概念阶段,其性能提升主要来自硬件升级;在内核加载和操作系统获取到控制权之后,启动进入第二个概念阶段,此时性能提升几乎完全来自软件。

vmlinuz

在linux系统中,vmlinux(vmlinuz)是一个包含linux kernel的链接文件。内核压缩文件位于/boot,类似/boot/vmlinux-3.13.0-24-generic。我在/root下找到了vmlinux文件。

GRUB将内核压缩文件载入内存,通常为zImage或bzImage。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压。然后该例程会调用内核,并开始启动内核引导的过程。

initrd

与内核一同被GRUB加载入内存的还有initrd。Initial RAM disk或者initrd是指一个临时文件系统,它在启动阶段被Linux内核调用。initrd主要用于根文件系统被挂载之前,进行准备工作。Linux2.6内核的initrd的文件格式由原来的文件系统镜像文件转变成了cpio格式,文件位于/boot,在/root下找到链接文件initrd.img。

Linux可以动态载入核心模块,如设备驱动等,精简内核同时提高灵活,存储在/lib/modules中。文件系统可以存储在包括IDE、SCSI、USB在内的多种介质中。若要挂载存储设备中的文件系统,则先要访问此存储设备,获取存储在文件系统中的设备驱动以便驱动此存储设备提供访问可能,非常矛盾的关系。此时initrd便出现以解决此问题。

内核在访问真正的文件系统前先访问initrd文件系统。相较于Linux2.4内核文件系统镜像,cpio格式的initrd在处理流程上简化了不少。GRUB将initrd释放到rootfs(基于内存的文件系统,因此不需要任何驱动),然后执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。之前版本在挂载initrd后执行/linuxrc加载访问根文件系统必须的驱动,卸载initrd后加载根文件系统,并执行/sbin/init。

init

当内核被引导并进行初始化之后,内核就可以启动自己的第一个用户空间应用程序了。这是第一个调用的使用标准C库编译的程序。在此之前,还没有执行任何标准的C应用程序。init(initialization)是Unix和类Unix系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为1。init进程非常独特,能够完成其他进程无法完成的任务。

init系统能够定义、管理和控制init进程的行为。它负责组织和运行许多独立的或相关的初始化工作,从而让计算机系统进入某种用户预订的运行模式,如启动shell或进入图形界面。

init系统不断发展,早先的Sysvinit,来自Ubuntu被各发行版普遍使用的Upstart,有取代Upstart趋势的systemd;随着Debian Jessie默认使用systemd,Ubuntu也确定将采用systemd

运行模式描述了系统各种可能的状态。通常有8种运行模式,即运行模式0到6和S或s。其中有3个保留运行模式

  • 0,关机
  • 1,单用户模式
  • 6,重启

其余依照不同发行版有不同选择。每个运行模式X都有一个对应目录/etc/rcX.d存放启动/关闭脚本,每个脚本名称都有规范的前缀,如启动脚本S开头,关闭脚本K开头,接着的数字为启动/关闭顺序。这些脚本都是软连接,实际位于/etc/init.d。/etc/rc.local是留给用户进行个性化设置的地方,最后执行

参看