启动盘基本上是软盘上的一个微型、自包含的 Linux 系统。 它必须执行与完整的、全尺寸 Linux 系统相同的许多功能。 在尝试构建启动盘之前,您应该了解基本的 Linux 启动过程。 在这里,我们介绍基本知识,这些知识足以理解本文档的其余部分。 许多细节和替代选项已被省略。
所有 PC 系统都通过执行 ROM 中的代码(特别是 BIOS)来启动启动过程,以从启动驱动器的 0 柱面 0 扇区加载扇区。 启动驱动器通常是第一个软盘驱动器(在 DOS 中指定为A,在 Linux 中指定为/dev/fd0)。 然后 BIOS 尝试执行此扇区。 在大多数可引导磁盘上,0 柱面 0 扇区包含以下内容:
来自引导加载程序(如 LILO)的代码,它定位内核、加载内核并执行它以启动适当的引导;或者
操作系统内核的开头,例如 Linux。
如果 Linux 内核已原始复制到软盘,则磁盘的第一个扇区将是 Linux 内核本身的第一个扇区。 这个第一个扇区将通过从启动设备加载内核的其余部分来继续启动过程。
当内核完全加载后,它会初始化设备驱动程序和它的内部数据结构。 一旦它完全初始化,它会查询其映像中的一个特殊位置,称为 ramdisk word。 这个词告诉它如何以及在哪里找到它的根文件系统。 根文件系统只是一个将作为 ``/'' 挂载的文件系统。 内核必须被告知在哪里查找根文件系统; 如果它在那里找不到可加载的映像,它就会停止。
在某些启动情况下——通常是从软盘启动时——根文件系统被加载到 ramdisk 中,ramdisk 是系统访问的 RAM,就好像它是一个磁盘。 RAM 比软盘快几个数量级,因此系统从 ramdisk 运行速度很快。 此外,内核可以从软盘加载压缩文件系统并将其解压缩到 ramdisk 上,从而可以将更多文件压缩到软盘上。
一旦根文件系统被加载和挂载,您会看到类似这样的消息
VFS: Mounted root (ext2 filesystem) readonly. |
一旦系统成功加载了根文件系统,它会尝试执行init程序(在/bin或/sbin). init中),读取其配置文件/etc/inittab,查找指定为sysinit的行,并执行指定的脚本。 该sysinit脚本通常类似于/etc/rc或/etc/init.d/boot。 该脚本是一组 shell 命令,用于设置基本的系统服务,例如在硬盘上运行 fsck,加载必要的内核模块,初始化交换,初始化网络以及挂载在/etc/fstab.
中提及的磁盘。 此脚本通常调用各种其他脚本来进行模块化初始化。 例如,在常见的 SysVinit 结构中,目录/etc/rc.d/包含一个复杂的子目录结构,其文件指定如何启用和关闭大多数系统服务。 但是,在启动盘上,sysinit 脚本通常非常简单。
当 sysinit 脚本完成时,控制权返回给 init,然后 init 进入默认运行级别,该级别在inittab中使用initdefault关键字指定。 运行级别行通常指定一个程序,例如 getty,它负责处理通过控制台和 tty 的通信。 正是 getty 程序打印出熟悉的 ``登录'' 提示符。 getty 程序反过来调用 login 程序来处理登录验证和设置用户会话。
回顾了基本的启动过程之后,我们现在可以定义涉及的各种磁盘类型。 我们将磁盘分为四种类型。 除非另有说明,否则此处以及本文档通篇使用术语“磁盘”来指代软盘,尽管大多数讨论同样适用于硬盘。
包含可以启动的内核的磁盘。 该磁盘可用于启动内核,然后内核可以在另一个磁盘上加载根文件系统。 启动盘上的内核通常必须被告知在哪里可以找到其根文件系统。
启动盘通常从另一个软盘加载根文件系统,但是可以设置启动盘以加载硬盘的根文件系统。 这通常在测试新内核时完成(实际上,“make zdisk”将从内核源代码自动创建这样的启动盘)。
具有包含运行 Linux 系统所需文件的文件系统的磁盘。 这样的磁盘不一定包含内核或引导加载程序。
一旦内核启动,根磁盘可用于独立于任何其他磁盘运行系统。 通常,根磁盘会自动复制到 ramdisk。 这使得根磁盘访问速度更快,并为实用程序磁盘腾出磁盘驱动器。
包含内核和根文件系统的磁盘。 换句话说,它包含在没有硬盘的情况下启动和运行 Linux 系统所需的一切。 这种磁盘的优点是它很紧凑——所需的一切都在一个磁盘上。 但是,所有内容逐渐增加的大小意味着即使使用压缩,也越来越难以将所有内容都放在一个软盘上。
包含文件系统但并非旨在作为根文件系统挂载的磁盘。 它是一个附加的数据盘。 如果您有太多内容无法放在根磁盘上,您将使用这种类型的磁盘来携带其他实用程序。
通常,当我们谈论“构建启动盘”时,我们指的是创建启动(内核)和根(文件)部分。 它们可以组合在一起(单个启动/根磁盘)或分开(启动 + 根磁盘)。 对于救援软盘而言,最灵活的方法可能是使用单独的启动和根软盘,以及一个或多个实用程序软盘来处理溢出。