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 鼠标),则无效。在此情况下,就需添加 floppy
、psmouse
与 mousedev
等模块至 /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
之内。例如,在两个实体磁盘的机器,可以找到如下的消息:
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 配置文件
- # The disk on which LILO should be installed.
- # By indicating the disk and not a partition.
- # you order LILO to be installed on the MBR.
- boot=/dev/sda
- # the partition that contains Debian
- root=/dev/sda2
- # the item to be loaded by default
- default=Linux
- # the most recent kernel image
- image=/vmlinuz
- label=Linux
- initrd=/initrd.img
- read-only
- # Old kernel (if the newly installed kernel doesn't boot)
- image=/vmlinuz.old
- label=LinuxOLD
- initrd=/initrd.img.old
- read-only
- optional
- # only for Linux/Windows dual boot
- other=/dev/sda1
- 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 配置文件
- # bootstrap partition
- boot=/dev/sda2
- # the disk
- device=hd:
- # the Linux partition
- partition=3
- root=/dev/sda3
- # boot after 3 seconds of inactivity
- # (timeout is in tenths of seconds)
- timeout=30
- install=/usr/lib/yaboot/yaboot
- magicboot=/usr/lib/yaboot/ofboot
- enablecdboot
- # last kernel installed
- image=/vmlinux
- label=linux
- initrd=/initrd.img
- read-only
- # old kernel
- image=/vmlinux.old
- label=old
- initrd=/initrd.img.old
- read-only
- # only for Linux/Mac OSX dual-boot
- macosx=/dev/sda5
- # bsd=/dev/sdaX and macos=/dev/sdaX
- # are also possible