8.8. 配置 Bootloader
或许已经运作了,但最好知道如何配置与安装加载启动器,万一它不在 Master Boot Record 中。安装 Windows 等其他操作系统后,很可能出现这种情况。以下的信息在必要时可协助修改加载启动器配置。
基本 Master boot record
主引导记录 (Master Boot Record, MBR) 位于第一颗磁盘的最前方 512 字节,首先被 BIOS 加载,再启动操作系统。一般来说,由主引导记录安装启动程序,移除稍早的内容。
8.8.1. 辨识磁盘
文化 udev 与 /dev/
/dev/
文件夹习惯保存被称为 “特殊的” 文件,用于代表系统的周边设备 (见专栏 基本 设备访问权限)。曾经纳入所有可能用到的特殊文件。这种处理方式有若干缺点,限制设备数量是其中之一,每种设备只能有一个 (因为清单名称被限制),且不可能知道实际上该用那个特殊文件。
Nowadays, the management of special files is entirely dynamic and matches better the nature of hot-swappable computer devices. The kernel cooperates with udev (第 9.11.3 节 “udev 如何工作”) to create and delete them as needed when the corresponding devices appear and disappear. For this reason, /dev/
doesn’t need to be persistent and is thus a RAM-based filesystem that starts empty and contains only the relevant entries.
核心与添加的设备沟通,并发给主要/次要号码以供辨识。以 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.4. 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 can only identify hard drives based on information provided by the BIOS. (hd0)
corresponds to the first disk thus detected, (hd1)
the second, etc. In most cases, this order corresponds exactly to the usual order of disks under Linux, but problems can occur when you associate SCSI and IDE disks. GRUB used to store the correspondences that it detects in the file /boot/grub/device.map
, GRUB avoids this problem nowadays by using UUIDs or file system labels when generating grub.cfg
. However, the device map file is not obsolete yet, since it can be used to override when the current environment is different from the one on boot. If you find errors there (because you know that your BIOS detects drives in a different order), correct them manually and run grub-install
again. grub-mkdevicemap
can help creating a device.map
file from which to start.
区分表在 GRUB 内也有特定的名称。通常使用 MS-DOS 格式的 “经典” 区分,第一个磁盘的第一个分区标记为 (hd0,msdos1)
、第二个分区标记为 (hd0,msdos2)
,余此类推。
GRUB 2 configuration is stored in /boot/grub/grub.cfg
, but this file (in Debian) is generated from others. Be careful not to modify it by hand, since such local modifications will be lost the next time update-grub
is run (which may occur upon update of various packages). The most common modifications of the /boot/grub/grub.cfg
file (to add command line parameters to the kernel or change the duration that the menu is displayed, for example) are made through the variables in /etc/default/grub
. To add entries to the menu, you can either create a /boot/grub/custom.cfg
file or modify the /etc/grub.d/40_custom
file. For more complex configurations, you can modify other files in /etc/grub.d
, or add to them; these scripts should return configuration snippets, possibly by making use of external programs. These scripts are the ones that will update the list of kernels to boot: 10_linux
takes into consideration the installed Linux kernels; 20_linux_xen
takes into account Xen virtual systems, and 30_os-prober
lists other operating systems (Windows, OS X, Hurd).