我正在阅读一本关于 Linux 分区和文件系统的相对较旧的文本(LPIC 1 认证圣经)。它说:
某些版本的 Linux 引导加载程序无法访问磁盘上前 1024 个柱面之外的内核。通过将 /boot 分区放在驱动器的开头,您可以确保在引导时访问内核时不会出现问题。在双引导 Linux 和第一个分区上的另一个操作系统的情况下,此问题最常出现。
为什么引导加载程序会有“无法访问磁盘上前 1024 个柱面之外的内核“?
另外,什么是“将 /boot 分区放在驱动器的开头“ 意思是?
答案1
这是由非常旧的 BIOS 和引导加载程序而不是 Linux 本身造成的限制。 BIOS 只能访问磁盘的前 1024 个柱面(参见这里有关什么是柱面/磁头/扇区的更多信息)。此限制将扩展到引导加载程序,由于其简单的性质,引导加载程序没有自己的磁盘驱动程序,并且将使用 BIOS 服务来访问磁盘。
这意味着引导加载程序和内核(因为加载它是引导加载程序的工作)都必须位于具有此限制的系统上的前 1024 个柱面内。执行此操作的一个简单方法是创建一个/boot
包含内核的单独分区,并将其放在驱动器的开头(通常只需将其设为第一个分区)。这意味着它实际上会驻留在前 1024 个柱面内,当然前提是分区不是太大。
该限制不再是问题,因为它仅适用于旧的 BIOS。此外,许多现代引导加载程序(例如 GRUB)都有自己的磁盘驱动程序,因此不需要依赖 BIOS 服务。现代引导加载程序可能/boot
用于其他目的,但不再需要位于单独的分区上和在前 1024 个柱面内(尽管很多情况下需要/boot
在单独的分区上)。
答案2
历史
/boot
包含不被操作系统使用但被操作系统使用的文件引导装载程序。您会发现引导加载程序本身的文件(例如/boot/grub/*
Grub)和 Linux 内核 ( /boot/vmlinuz*
),并且通常还包含一个关联的文件初始化程序或者初始化文件系统。
在 PC 上传统BIOS(相对于较新的UEFI在大多数最新的计算机上都有),ROM 中的软件将启动盘的前 512 字节加载到内存中(引导扇区)。由于只有 512 字节(并非所有字节都包含代码:其中一些包含分区表等数据),代码不能做太多事情 — 其中不可能有真正的磁盘驱动程序。在如此有限的空间内所能做的就是使用 BIOS 接口来加载更多代码。该接口提供了加载磁盘上第 N 个扇区的命令,而 N 的大小是有限的,因此只能到达磁盘的开头。
BIOS界面有进化了一点它已经存在了三十年左右的时间,但它的大小限制一直难以跟上磁盘大小,导致较旧的 BIOS 和引导加载程序在 32MB、512MB、2GB、8GB(可能还有其他我不知道的阈值)下崩溃记住)。引导加载程序需要能够使用 BIOS 接口来加载直接访问磁盘驱动器所需的所有部分。引导加载程序通常不包含所有磁盘控制器的驱动程序,因此加载 Linux 内核(和 initrd/initramfs)之前的所有内容都必须使用 BIOS 接口,因此必须适合磁盘的开头。
请注意,这是 BIOS 或引导加载程序的限制,而不是 Linux 本身或发行版的限制。
/boot
今天分开
在具有最新 BIOS 和最新引导加载程序或 UEFI 的系统上,大小限制不再相关:磁盘大小现在需要很长时间才能赶上。但是,还有其他用例可以使单独的/boot
分区发挥作用。它允许主系统位于RAID设备引导加载程序不支持,或者引导加载程序不支持的文件系统类型。它允许主系统位于加密设备上,Linux 可以解密该设备,但不能解密引导加载程序。
如果这些限制和用例都不适合您,则保留/boot
为单独的分区是没有用的。但它们影响了足够多的人,大多数发行版都支持它。
答案3
除了提到的 BIOS 问题之外的另一个原因是,单独的分区允许对引导加载程序无法理解的卷/boot
使用文件系统(而不像使用 那样仅限于块列表加载)。/
lilo
答案4
存在一个/boot
目录是历史上确定的,并且从那里“固定”在文件系统层次结构标准。拥有这样的标准允许程序(和系统管理员)期望某些文件位于某些位置。在本例中是与引导过程关联的文件。
在光盘开头设置/boot
分区对于较旧的 BIOS 来说是有意义的,因为它们无法在所有可用驱动器中对块/扇区进行索引。因此,应该加载的信息应该位于可以索引的扇区上,因此是一个单独的分区(扇区号较低),/boot
BIOS 可以从中加载其他数据/程序(反过来又能够寻址完整的数据/程序)。不使用 BIOS 的光盘范围)。