8.8. 配置 Bootloader

或许已经运作了,但最好知道如何配置与安装加载启动器,万一它不在 Master Boot Record 中。安装 Windows 等其他操作系统后,很可能出现这种情况。以下的信息在必要时可协助修改加载启动器配置。

基本 Master boot record

主引导记录 (Master Boot Record, MBR) 位于第一颗磁盘的最前方 512 字节,首先被 BIOS 加载,再启动操作系统。一般来说,由主引导记录安装启动程序,移除稍早的内容。

8.8.1. 辨识磁盘

文化 udev/dev/

/dev/ 文件夹习惯保存被称为 “特殊的” 文件,用于代表系统的周边设备 (见专栏 基本 设备访问权限)。曾经纳入所有可能用到的特殊文件。这种处理方式有若干缺点,限制设备数量是其中之一,每种设备只能有一个 (因为清单名称被限制),且不可能知道实际上该用那个特殊文件。

如今,以动态方式管理特殊的文件,并且更适合热切换的电脑设备。核心与 udev 合作在需要的时候添加与删除文件以映射出现或消失的设备。所以,/dev/ 不需要维持不变,反而采用 RAM 保存的文件系统清除或纳入相关的条目。

核心与添加的设备沟通,并发给主要/次要号码以供辨识。以 udevd 命令可以添加特殊的文件并授权使用它。也可添加别名运行其他的工作 (诸如初始化或登录工作)。udevd 命令的行为由一组 (可客制化) 的规则驱动。

动态给予名称,就能够让同名称永远指向特定设备,不必在意链接的设备或顺序,尤其在使用 USB 周边时更为便利。第一个磁盘的第一个区块称为 /dev/sda1 可供向后兼容,喜欢的话也可称为 /dev/root-partition,或两者共用,因为 udevd 可以配置成自动添加符号链接。

过去在需要进入特定设备文件时,部分的核心模块无法自动加载。现在情况已变了,周边设备的特殊文件于加载模块时才会存在;所以问题不大,受惠于自动侦测硬件,大部分模块都可于启动时加载。但对于侦测不到的周边 (诸如极旧的磁盘机或 PS/2 鼠标),则无效。在此情况下,就需添加 floppypsmousemousedev 等模块至 /etc/modules 才能于启动时强迫加载。

配置启动程序必须辨认硬盘及其分区。Linux 使用 “block” 特殊文件保存在 /dev/ 文件夹内。因为 Debian Squeeze 版本使用源自 Linux 核心的硬盘命名架构,所有的硬盘 (IDE/PATA、SATA、SCSI、USB、IEEE 1394) 都以 /dev/sd* 表示。

每个分区由其磁盘代号表示:如,/dev/sda1 是第一个磁盘的第一个分区,而 /dev/sdb3 是第二个磁盘的第三个分区。

PC 架构 (或 “i386”,包括新出现的 “amd64”) 不再受限于使用 “MS-DOS” 分区表格式,每个磁盘可以拥有超过 4 个 “主要” 分区。在此架构下要超过此限制,必须添加 “延伸” 分区,然后就能使用添加的 “次要” 分区。这些次要分区由 5 开始编号。所以,第一个磁盘的次要分区可以是 /dev/sda5,然后是 /dev/sda6,余此类推。

MS-DOS 分区表格式的另个限制是磁盘的容量不能超过 2 TiB,成为当代磁盘的真正问题。

GPT 是新的分区表格式,解放对区分数的限制 (标准方式最多可以设置 128 个区分) 以及磁盘容量的限制 (最多达 8 ZiB,超过 8 百万兆字节)。若想在一个磁盘切出多个实体区分,必须以 GPT 格式添加分区表。

不容易记得磁盘挂在 SATA 控制卡的位置,或在 SCSI 链的第三个位置,尤其是热插拔硬式磁盘机 (包括 SATA 磁盘与插件磁盘) 可改变开机的位置。还好,udev 以固定的名称,添加 /dev/sd* 以外的符号链接,就能够轻易的辨识硬式磁盘机。这种符号链接保存在 /dev/disk/by-id 之内。例如,在两个实体磁盘的机器,可以找到如下的消息:

  1. mirexpress:/dev/disk/by-id#

同颗磁盘出现多次 (因为它们同时做为 ATA 磁盘与 SCSI 磁盘),但是根据磁盘的型号与序号等相关信息,就可找到对应的周边设备文件。

下节的配置档根据同样的设置而来:一个 SATA 磁盘,第一个区分是安装旧型的窗口、第二个分区安装 Debian GNU/Linux。

8.8.2. 配置 LILO

LILO (Linux 启动程序, LInux LOader) 是最旧的启动程序 — 稳定但粗糙。把核心的实体地址写入 MBR 的启动,所以每次更新至 LILO (或其配置文件) 都必须再运行命令 lilo。忘记的话,移除或更新核心后,新的核心就不会在磁盘的原来位置,以致系统无法启动。

LILO 的配置档是 /etc/lilo.conf;一个简单的文件供标准配置之用,如下例。

例 8.3. LILO 配置文件

  1. # The disk on which LILO should be installed.
  2. # By indicating the disk and not a partition.
  3. # you order LILO to be installed on the MBR.
  4. boot=/dev/sda
  5. # the partition that contains Debian
  6. root=/dev/sda2
  7. # the item to be loaded by default
  8. default=Linux
  9.  
  10. # the most recent kernel image
  11. image=/vmlinuz
  12. label=Linux
  13. initrd=/initrd.img
  14. read-only
  15.  
  16. # Old kernel (if the newly installed kernel doesn't boot)
  17. image=/vmlinuz.old
  18. label=LinuxOLD
  19. initrd=/initrd.img.old
  20. read-only
  21. optional
  22.  
  23. # only for Linux/Windows dual boot
  24. other=/dev/sda1
  25. label=Windows

8.8.3. GRUB 2 配置

GRUB (GRand Unified Bootloader) 是最近的事。更新核心后不必再启动它;GRUB 知道如何读取文件系统并找到核心在磁盘的位置。键入 grub-install /dev/sda 命令就能够把它安装在第一个磁盘的 MBR。

说明 GRUB 的磁盘名称

GRUB 只能根据 BIOS 提供的信息辨识硬式磁盘机。(hd0) 对应侦测到的第一个磁盘、(hd1) 第二个磁盘等。大部分的情况下,此顺序刚好是 Linux 的磁盘顺序,同时使用 SCSI 与 IDE 磁盘时就出问题。GRUB 把侦测到的信息保存在 /boot/grub/device.map 文件内。若在此发现错误 (因为已知 BIOS 以不同的顺序侦测到磁盘),再次运行 grub-install 命令。grub-mkdevicemap 命令可添加 device.map 文件。

区分表在 GRUB 内也有特定的名称。通常使用 MS-DOS 格式的 “经典” 区分,第一个磁盘的第一个分区标记为 (hd0,msdos1)、第二个分区标记为 (hd0,msdos2),余此类推。

GRUB 2 的配置存在 /boot/grub/grub.cfg 内,但该文件 (在 Debian 环境下) 以其他方式产生。不可以人工方式修改它,否则在下次运行 update-grub 时 (更新多个软件包时需运行它),将失去该等修改的内容。修改 /boot/grub/grub.cfg 文件 (添加给核心使用的参数或改变显示菜单的时间,举例而已) 通常经由 /etc/default/grub 的变量。添加条目至菜单时,可以新建 /boot/grub/custom.cfg 文件或修改 /etc/grub.d/50_custom 文件。更复杂的配置,可以修改 /etc/grub.d 内的其他文件,或添加之;这些脚本应送回配置的片断,很可能是外部程序做的修改。这些脚本将更新启动的核心:10_linux 考量安装 Linux 核心;20_linux_xen 考量 Xen 虚拟系统,而 30_os-prober 则列出其他的操作系统 (Windows、OS X、Hurd)。

8.8.4. Macintosh 电脑 (PowerPC):配置 Yaboot

Yaboot 是使用 PowerPC 芯片的旧型 Macintosh 电脑用到的启动程序。它的启动方式不同于 PC,采用 “引导” 分区法,从 BIOS (或 OpenFirmware) 运行启动程序,然后由 ybin 程序安装 yaboot 及其配置档。修改 /etc/yaboot.conf 文件后 (在启动程序分区复制,且 yaboot 知道如何到磁盘找寻核心的位置),需再次运行此命令。

运行 ybin 之前,应有合法的 /etc/yaboot.conf 程序。以下的最小配置的范例。

例 8.4. Yaboot 配置文件

  1. # bootstrap partition
  2. boot=/dev/sda2
  3. # the disk
  4. device=hd:
  5. # the Linux partition
  6. partition=3
  7. root=/dev/sda3
  8. # boot after 3 seconds of inactivity
  9. # (timeout is in tenths of seconds)
  10. timeout=30
  11.  
  12. install=/usr/lib/yaboot/yaboot
  13. magicboot=/usr/lib/yaboot/ofboot
  14. enablecdboot
  15.  
  16. # last kernel installed
  17. image=/vmlinux
  18. label=linux
  19. initrd=/initrd.img
  20. read-only
  21.  
  22. # old kernel
  23. image=/vmlinux.old
  24. label=old
  25. initrd=/initrd.img.old
  26. read-only
  27.  
  28. # only for Linux/Mac OSX dual-boot
  29. macosx=/dev/sda5
  30.  
  31. # bsd=/dev/sdaX and macos=/dev/sdaX
  32. # are also possible