Linux 的启动其实和 Windows 的启动过程很类似,不过 Windows 我们是无法看到启动信息的,而 linux 启动时我们会看到许多启动信息,例如某个服务是否启动。
Linux 系统的启动过程大体上可分为五部分:内核的引导;运行 init;系统初始化;建立终端 ;用户登录系统。
内核引导
当计算机打开电源后,首先是 BIOS 开机自检,按照 BIOS 中设置的启动设备(通常是硬盘)来启动。紧接着由启动设备上的 grub 程序开始引导 linux,当引导程序成功完成引导任务后,Linux 从它们手中接管了 CPU 的控制权,然后 CPU 就开始执行 Linux 的核心映象代码,开始了 Linux 启动过程。也就是所谓的内核引导开始了,在内核引导过程中其实是很复杂的,我们就当它是一个黑匣子,反正是 linux 内核做了一些列工作,最后内核调用加载了 init 程序,至此内核引导的工作就完成了。交给了下一个主角 init。
运行 init
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。inittab 是一个不可执行的文本文件,它有若干行指令所组成。
系统初始化
在 init 的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而 rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit 是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
建立终端
rc 执行完毕后,返回 init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init 接下来会打开 6 个终端,以便用户登录系统
用户登录系统
Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。然后 login 会对用户名进行分析:如果用户名不是 root,且存在 /etc/nologin文件,login 将输出 nologin 文件的内容,然后退出。这通常用来系统维护时防止非 root 用户登录。只有 /etc/securetty 中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 可以在任何终端上登录。/etc/usertty 文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login 将搜索 /etc/passwd 以及 /etc/shadow 来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种 shell。如果没有指定主目录,将默认为根目录;如果没有指定 shell,将默认为 /bin/bash。
login 程序成功后,会向对应的终端在输出最近一次登录的信息(在 /var/log/lastlog 中有记录),并检查用户是否有新邮件(在 /usr/spool/mail/ 的对应用户名目录下)。然后开始设置各种环境变量:对于 bash 来说,系统首先寻找 /etc/profile 脚本文件,并执行它;然后如果用户的主目录中存在 .bash_profile 文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。