Syslinux (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Syslinux翻译。上次翻译日期:2020-07-22。如果英文版本有所更改,则您可以帮助同步翻译。

Syslinux是一个启动加载器集合,可以从硬盘、光盘或通过 PXE 的网络引导启动系统。支持的文件系统包括 FAText2ext3ext4 和非压缩单设备 Btrfs 文件系统。

警告: 在 Syslinux 6.03 版本中,启动加载器可能不支持某些文件系统的部分功能。详情请参考 [1]
注意: Syslinux 本身只能访问其所在分区上的数据,参阅 #链式加载 来了解如何绕过这个限制。

BIOS 系统

启动流程

  1. 第一阶段 - 第一部分 - 加载MBR 电脑启动时,BIOS 会先加载磁盘开始的 440 字节 MBR 启动代码 (/usr/lib/syslinux/bios/mbr.bin/usr/lib/syslinux/bios/gptmbr.bin)。
  2. 第一阶段 - 第二部分 - 寻找活动分区 第一阶段的MBR启动代码会寻找活动分区(设置了可启动标记的 MBR 分区),此处我们假设是 /boot 分区。
  3. 第二阶段 - 第一部分 - 执行卷启动记录程序 MBR 启动代码会执行上面找到的 /boot 分区的卷启动记录程序(VBR,volume boot record)。对于 Syslinux 来说,VBR 就是由 extlinux --install 命令创建的 /boot/syslinux/ldlinux.sys 位于开始扇区的部分。请注意 ldlinux.sysldlinux.c32 是不同的。
  4. 第二阶段 - 第二部分 - 执行 /boot/syslinux/ldlinux.sys VBR 会加载 ldlinux.sys 剩余的部分。ldlinux.sys 所处在的扇区位置不可更改,否则 syslinux 无法启动。
    注意: 对于 Btrfs 来说,因为文件不断移动导致ldlinux.sys扇区的位置不断变化,上述的方法将不会工作。因此在 Btrfs 中整个 ldlinux.sys 文件会直接紧接着嵌入卷启动记录程序,而不是像其他文件系统那样保存在 /boot/syslinux/ldlinux.sys 处。
  5. 第三阶段 - 加载 /boot/syslinux/ldlinux.c32 ldlinux.sys 加载剩下的 syslinux 的核心部分 /boot/syslinux/ldlinux.c32(这部分是因为文件大小限制无法放入 ldlinux.sys 中的核心模块)。ldlinux.c32 文件应该在每一个装有 syslinux 的实例中出现,并且与分区中的 ldlinux.sys 版本相匹配,否则 Syslinux 将无法启动。更多资料请参阅 [2]
  6. 第四阶段 - 查找并加载配置文件 当 syslinux 完全加载完毕,它将自动查找配置文件 /boot/syslinux/syslinux.cfg (或某些情况下的 /boot/syslinux/extlinux.conf),如果找到即加载。否则会进入 Syslinux boot: 的命令提示符。这一步和剩下的非核心 Syslinux 部分(除 lib*.c32ldlinux.c32/boot/syslinux/*.c32 模块) 需要提供 /boot/syslinux/lib*.c32 (库)模块[3]。同样,{ic|lib*.c32}} 库模块和非核心的 *.c32 模块需要与分区中的 ldlinux.sys 版本相匹配。

在 BIOS 上安装

安装软件包 syslinux

注意:

安装软件包并不是安装启动加载器。在安装完相关的包后,还需要安装启动加载器代码(到适合的位置,一般是 VBR)才能启动系统;接下来的部分对您的特定系统的特性提供了替代的指令。

自动安装

注意: 脚本 syslinux-install_update 是 Arch Linux 特有的,并不被 Syslinux 的上游提供/支持。请不要向上游,而是直接向 Arch Bug Tracker 提交关于这个特定脚本的 bug 报告。
  • 执行完 syslinux-install_update 脚本后,请不要忘记按照#配置#内核参数两节编辑 /boot/syslinux/syslinux.cfg
警告: syslinux-install_update 脚本很有可能会设置一个与您的特定系统不同的默认根分区。将 /boot/syslinux/syslinux.cfg 文件中的根分区修改正确对于成功启动是至关重要的。参见#内核参数

syslinux-install_update脚本将自动安装启动加载器代码(一般到 VBR)、复制 *.c32 模块到/boot/syslinux、设置分区启动标记并将启动代码安装到 MBR。它可以处理软 RAID、MBRGPT 磁盘。

如果您使用分开的启动分区,请用 lsblk 命令确保它们都已被挂载。如果您没有看到 /boot 挂载点,请在继续之前将其挂载。

  • syslinux-install_update 的参数:-i (安装文件),-a (将活动分区标上启动标记),-m (安装 MBR 启动代码): 如果
    # syslinux-install_update -i -a -m
    命令失败并报错Syslinux BIOS install failed,问题可能出在 extlinux 可执行文件不能找到包含 /boot 的分区:
# extlinux --install /boot/syslinux/
extlinux: cannot find device for path /boot/syslinux
extlinux: cannot open device (null)

例如,这可能发生在从 LILO 升级时,后者在引导当前的自定义内核时,将诸如 root=/dev/sda1 的内核命令行参数转写成了等效的数字参数 root=801。这可以从 /proc/cmdlinemount 等命令的输出确认。 可以通过向 extlinux 手动指定 --device=/dev/sda1 来解决下文手动安装时的问题,或者先重启到现有的Arch Linux内核,这样会使用 initramfs 来避免此问题。

注意:
  • 如果您现在重新启动系统,则会出现 Syslinux 的提示符。如果想要实现系统自动引导或显示引导目录,您需要创建(或编辑)配置文件。
  • 如果您位于另一个根目录(例如,从安装磁盘上),则可以通过 chroot,重定向后安装:
# syslinux-install_update -i -a -m -c /mnt
  • 现在您需要按照接下来的#配置#内核参数两节编辑 /boot/syslinux/syslinux.cfg文件。

手动安装

注意: 如果您尝试使用Live CD拯救已安装的系统,请确保在执行这些命令之前已经 chroot 到目标系统。否则您必须在所有文件(除了/dev/)路径之前添加挂载点。

您计划安装Syslinux的启动分区必须包含 FAT,ext2,ext3,ext4 或 Btrfs 文件系统。您不必把它安装在文件系统的根目录上,比如把磁盘 /dev/sda1 挂在到 /boot。 例如,可以在syslinux子目录里安装 Syslinux:

 # mkdir /boot/syslinux

如果您希望使用除基本引导提示之外的任何目录或配置,请把 /usr/lib/syslinux/bios/ 里的所有的 .c32 文件复制到 /boot/syslinux/ 中。请不要使用符号链接。

 # cp /usr/lib/syslinux/bios/*.c32 /boot/syslinux/     

现在安装启动加载器。对 挂载后的 FAT,ext2/3/4,或 btrfs 启动分区使用 extlinux 安装:

# extlinux --install /boot/syslinux

替代的,对一个没有被挂载的 FAT 启动分区使用syslinux 安装:

 # syslinux --directory syslinux --install /dev/sda1

在此之后,继续安装适用于对应分区表的 Syslinux 引导代码:

这些会在下面的内容中详细描述。

更多信息,请参考 MBR 分区表

提示: 如果您不确定您的分区表类型,可以通过 blkid -s PTTYPE -o value /dev/sda 来检查。
注意: 对于一个无盘安装实例,不需要向MBR中安装Syslinux 引导代码。您可以跳过这一段,直接跳到#配置部分。更多信息请参考[4]
MBR 分区表

对于一个安装在 MBR 分区表上的实例,请确保您的启动分区已经被标记为活动分区(有启动标志)。您可以用 fdiskparted 等工具确认。它应该看起来像这个样子:

# fdisk -l /dev/sda
[...]
  Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      104447       51200   83  Linux
/dev/sda2          104448   625142447   312519000   83  Linux

安装 MBR 启动代码:

# dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sda

Syslinux 提供一个替代的分区表 altmbr.bin。这个分区表不会扫描可启动分区,而是从 MBR 的最后一个字节中的值读取用于启动的分区。下面的操作会将这个分区表写入。

# printf '\x5' | cat /usr/lib/syslinux/bios/altmbr.bin - | dd bs=440 count=1 iflag=fullblock of=/dev/sda

在这个例子中,一个数值为5(十六进制的)的单个字节会被添加到 altmbr.bin 的内容后,并向 sda 的 MBR 分区表中写入440字节的内容。Syslinux 会被安装到磁盘的第一个逻辑分区(/dev/sda5)。

GPT 分区表

对于一个安装在 GPT 分区表上的实例, 请确保您的启动分区 /boot 被设置上了 2 号属性"传统BIOS可启动"(legacy BIOS bootable)。Parted 可以使用"legacy_boot"参数实现,而 sgdisk 则需要输入下面的命令:

# sgdisk /dev/sda --attributes=1:set:2

这会在 /dev/sda 的第一个分区设置"传统BIOS可启动"属性。检查命令:

# sgdisk /dev/sda --attributes=1:show
1:2:1 (legacy BIOS bootable)

安装 MBR 启动代码:

# dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/bios/gptmbr.bin of=/dev/sda

UEFI 系统

注意:
  • efi64 对应 x86_64 UEFI 系统。如果是 IA32(32位) EFI 您需要在下面的命令中将 efi64 替换为 efi32
  • 因为 Syslinux(目前)没有办法访问它自己所在以外的分区,因此内核与 initramfs 文件需要位于 Syslinux 同在的 EFI 系统分区(也叫ESP)。因此,这里推荐将ESP分区挂载在 /boot
  • /usr/bin/syslinux-install_update 自动安装脚本不支持 UEFI 安装。
  • syslinux.cfg 文件的配置与 BIOS 的配置方法相同。

UEFI Syslinux 的局限性

  • UEFI Syslinux 程序 syslinux.efi 不能通过 sbsign(sbsigntools 软件包提供)签名,导致无法进行 UEFI 安全启动。查看关于此的 Bug 报告:[5]
  • 在 UEFI Syslinux 目录中编辑内核参数时使用 TAB 缩进会导致显示错误(重叠显示)。查看关于此的 Bug 报告:[6]
  • UEFI Syslinux 程序不支持链式加载其他如 UEFI ShellWindows Boot Manager 等 EFI 应用程序。查看关于此的增强请求:[7]
  • 在某些情况下,UEFI Syslinux 可能不能在通过 QEMU/OVMF、VirtualBoxVMware 的一些特定产品或版本构建的虚拟机的中启动。一些如 DUET 等 UEFI 模拟环境中也是如此。Syslinux 的贡献者已经确认,在 VMware Workstation 10.0.2 版本、Syslinux 6.02 版本以后不会发生这个问题。查看关于此的 Bug 报告:[8], [9][10]
  • Memdisk 不被 UEFI 支持。查看关于此的增强请求:[11]

在 UEFI 上安装

注意: 在与 UEFI 有关的命令中,esp 指的是 EFI 系统分区(ESP)所挂载的位置。
  • 安装来自官方软件源syslinuxefibootmgr。然后按如下步骤安装 Syslinux 到 EFI 系统分区(ESP):
  • 复制 Syslinux 文件到 EFI 系统分区:
# mkdir -p esp/EFI/syslinux
# cp -r /usr/lib/syslinux/efi64/* esp/EFI/syslinux
# efibootmgr --create --disk /dev/sdX --part Y --loader /EFI/syslinux/syslinux.efi --label "Syslinux" --verbose

其中,/dev/sdXY是包含启动加载器的分区。

  • 按照#配置创建或编辑esp/EFI/syslinux/syslinux.cfg文件。
注意:
  • UEFI 的配置文件是 esp/EFI/syslinux/syslinux.cfg 而非 /boot/syslinux/syslinux.cfg。在 /boot/syslinux/ 中的文件是 BIOS 启动专用的,和 UEFI Syslinux 无关。

在BIOS模式下启动时, efibootmgr 将无法为 /EFI/syslinux/syslinux.efi 设置 EFI 存储于非易失性存储器(nvram)的条目。欲实现此,请将资源放在默认 EFI 位置:esp/EFI/syslinux/* -> esp/EFI/BOOT/*esp/EFI/syslinux/syslinux.efi -> esp/EFI/BOOT/bootx64.efi 处。

配置

Syslinux 的配置文件 syslinux.cfg 必须和 Syslinux 放在同一个目录下。在我们的示例中,BIOS 系统放在 /boot/syslinux/ 处,UEFI 系统放在 esp/EFI/syslinux/ 处。

启动器将自动寻找 syslinux.cfg (优先)和 extlinux.conf这两个配置文件之一。

提示:
  • 除了 LINUX,您也可以使用 KERNEL 关键字。KERNEL 关键字会试图去检测内核文件的类型,而 LINUX 总是会将其按照 Linux 内核处理。
  • TIMEOUT 的单位是 0.1 秒,也就是说 50 代表 5 秒。

示例

注意:
  • 示例这一节中的所有配置文件都需要编辑并设定合适的内核参数。参见#内核参数节。
  • 请一定仔细检查路径。这个实例可能不能够直接照搬到您的安装实例,尤其是 UEFI 系统。
  • 接下来的例子假设内核与 initrd 文件都位于 syslinux.cfg 的父目录。(准确的说,是工作目录的父目录)。

启动提示符

这是一个非常简单的配置文件,会显示 boot: 提示符并在 5 秒后自动启动。如果您不希望看见提示符,请将 PROMPT 设置为 0

配置文件:

* BIOS: /boot/syslinux/syslinux.cfg
* UEFI: esp/EFI/syslinux/syslinux.cfg
PROMPT 1
TIMEOUT 50
DEFAULT arch

LABEL arch
	LINUX ../vmlinuz-linux
	APPEND root=/dev/sda2 rw
	INITRD ../initramfs-linux.img

LABEL archfallback
	LINUX ../vmlinuz-linux
	APPEND root=/dev/sda2 rw
	INITRD ../initramfs-linux-fallback.img

文本启动目录

Syslinux 允许您使用一个文本启动目录来选择。要做到这一点,请将 menulibutil 模块复制到您的 Syslinux 目录:

# cp /usr/lib/syslinux/bios/{menu,libutil}.c32 /boot/syslinux/

在 5.00 版本之后,其他的 lib*.c32 库模块也会频繁地被调用。参考 Syslinux 维基来查看依赖树。

配置文件:

* BIOS: /boot/syslinux/syslinux.cfg
* UEFI: esp/EFI/syslinux/syslinux.cfg
UI menu.c32
PROMPT 0

MENU TITLE Boot Menu
TIMEOUT 50
DEFAULT arch

LABEL arch
	MENU LABEL Arch Linux
	LINUX ../vmlinuz-linux
	APPEND root=/dev/sda2 rw
	INITRD ../initramfs-linux.img

LABEL archfallback
	MENU LABEL Arch Linux Fallback
	LINUX ../vmlinuz-linux
	APPEND root=/dev/sda2 rw
	INITRD ../initramfs-linux-fallback.img

更多关于启动目录的信息,请参考 Syslinux 维基

图形化启动目录

Syslinux 允许您使用一个文本启动目录来选择。要做到这一点,请将 vesamenu COM32 模块复制到您的 Syslinux 目录:

# cp /usr/lib/syslinux/bios/vesamenu.c32 /boot/syslinux/

在 5.00 版本之后,其他的 lib*.c32 库模块也会频繁地被调用。参考 Syslinux 维基来查看依赖树。

注意: 如果您使用的是 UEFI 系统,请一定从 /usr/lib/syslinux/efi64/ 目录(或者 IA32 (32位) EFI 的 efi32) 中复制。否则电脑会黑屏。如果出现这个情况,请从 Live CD 中启动并使用 chroot 来进行正确的修改。

这个配置文件使用了和 Arch Linux 安装光盘相同的目录设计,您可以在 gitlab.archlinux.org 上找到。Arch Linux 启动背景图像 也可以在那儿下载。请把图像复制到 /boot/syslinux/splash.png 处。

配置文件:

* BIOS: /boot/syslinux/syslinux.cfg
* UEFI: esp/EFI/syslinux/syslinux.cfg
UI vesamenu.c32
DEFAULT arch
PROMPT 0
MENU TITLE Boot Menu
MENU BACKGROUND splash.png
TIMEOUT 50

MENU WIDTH 78
MENU MARGIN 4
MENU ROWS 5
MENU VSHIFT 10
MENU TIMEOUTROW 13
MENU TABMSGROW 11
MENU CMDLINEROW 11
MENU HELPMSGROW 16
MENU HELPMSGENDROW 29

# Refer to https://wiki.syslinux.org/wiki/index.php/Comboot/menu.c32

MENU COLOR border       30;44   #40ffffff #a0000000 std
MENU COLOR title        1;36;44 #9033ccff #a0000000 std
MENU COLOR sel          7;37;40 #e0ffffff #20ffffff all
MENU COLOR unsel        37;44   #50ffffff #a0000000 std
MENU COLOR help         37;40   #c0ffffff #a0000000 std
MENU COLOR timeout_msg  37;40   #80ffffff #00000000 std
MENU COLOR timeout      1;37;40 #c0ffffff #00000000 std
MENU COLOR msg07        37;40   #90ffffff #a0000000 std
MENU COLOR tabmsg       31;40   #30ffffff #00000000 std

LABEL arch
	MENU LABEL Arch Linux
	LINUX ../vmlinuz-linux
	APPEND root=/dev/sda2 rw
	INITRD ../initramfs-linux.img

LABEL archfallback
	MENU LABEL Arch Linux Fallback
	LINUX ../vmlinuz-linux
	APPEND root=/dev/sda2 rw
	INITRD ../initramfs-linux-fallback.img

从 Syslinux 3.84 版本开始,vesamenu.c32 支持 MENU RESOLUTION $WIDTH $HEIGHT 指令。 使用这个指令,请将 MENU RESOLUTION 1440 900 插入您的配置文件,这样可以将分辨率设置为 1440x900。 但是,背景图像需要和分辨率完全一致,否则 Syslinux 将拒绝加载目录。

如果想要将目录居中并调整分辨率,请调节 MENU RESOLUTIONMENU HSHIFT $NMENU VSHIFT $N 三个参数。将 $N 设置为非负值会将其从左上角开始移动。默认值都是 0,因此目录会显示在显示器的左上角。反过来,如果这个数值为负,则会从反方向开始移动。(比如说 VHSHIFT -4是从底部向上移动四行)。

如果想要使目录居中,请添加或改为这些值:

* BIOS: /boot/syslinux/syslinux.cfg
* UEFI: esp/EFI/syslinux/syslinux.cfg
MENU RESOLUTION 800 600 # or whatever your screen resolution is
MENU WIDTH 78           # width of the menu also required to bring the menu box to size
MENU VSHIFT 10          # moves menu down
MENU HSHIFT 10          # moves menu right

VESA 标准通常最大允许 25 行 80 列,因此如果将其设置得过大可能会将目录移出屏幕外,可能需要使用救援介质才能改回来。

内核参数

syslinux.cfg 中,内核参数的设定使用 APPEND 指令: 对每一个 LABEL 记录, APPEND 命令只能出现在一行内(就是说,把命令拆分成多行是无效的)。

推荐将下列的设置同时作为回滚条目。

最简单的情形root 参数中的分区名称需要被修改。 将 /dev/sda2 改为正确的启动分区。

APPEND root=/dev/sda2

如果您想使用 UUID,通过块设备持久化命名制定启动分区,请如下改变 APPEND 行。这里我们用1234来代表您需要修改的UUID

APPEND root=UUID=1234 rw

如果您想使用 dm-crypt 加密设备 请如下改变 APPEND 行。

APPEND root=/dev/mapper/name cryptdevice=/dev/sda2:name rw

如果您使用 mdadm 构建的软 RAID , 请如下改变 APPEND 行来适配您的 RAID 阵列。下面是一个适配 3 RAID-1 阵列、并将一个合适的分区设为根分区的示例。

APPEND root=/dev/md1 rw md=0,/dev/sda2,/dev/sdb2 md=1,/dev/sda3,/dev/sdb3 md=2,/dev/sda4,/dev/sdb4

如果在内核设备节点模式下通过软 RAID 启动失败,下面是一个替代的更可靠的方法:使用分区标签:

APPEND root=LABEL=THEROOTPARTITIONLABEL rw

如果从一个 btrfs 子卷启动,向 APPEND 添加 rootflags=subvol=<root subvolume> 这一行。举个例子,我们称 /dev/sda2 被挂载到一个叫 'ROOT' 的 btrfs 子卷。(例如 mount -o noatime,subvol=ROOT /dev/sda2 /mnt),这时应该将 APPEND 行改为这样:

APPEND root=/dev/sda2 rw rootflags=subvol=ROOT

如果此处错误,会收到 ERROR: Root device mounted successfully, but /sbin/init does not exist.错误信息。

自动启动

If you do not want to see the Syslinux menu at all, use the 如果您根本不想看见 Syslinux 的目录,请参考#启动提示符一节,将 PROMPT 设置为 0 并将任何 UI 的目录记录注释掉。将 TIMEOUT 设置为 0 也可以。确保您在 syslinux.cfg 设置的有默认回滚 DEFAULT 选项。按下 Shift 或者 Alt,或者设置为按下 Caps LockScroll Lock, 在启动时可以允许更多除了默认选项以外的操作。更多可以设置的替代键,请参考上游的维基

安全措施

Syslinux 有两级启动加载器安全措施,可以在 syslinux.cfg 中配置目录主密码,和分别针对每个条目的密码。使用

MENU MASTER PASSWD passwd 

来配置目录主密码,在 LABEL 的块中使用

MENU PASSWD passwd 

来设定针对这个条目的密码。

密码可以是明文,也可以是哈希值。更多信息,请参考官方文档

链式加载

在 BIOS 上配置的 Syslinux 不能直接链式加载其他分区上的文件,但是 chain.c32 模块可以启动其他启动分区上的卷启动记录程序(VBR),或是另一个磁盘上的 MBR 启动代码。

链式加载卷启动记录程序

如果您想要链式加载另一个操作系统(比如 Windows)或启动加载器,请将 chain.c32 模块复制到 Syslinux 目录(还需要复制其他需要的 lib*.c32 库模块。更多信息请参考前面几节),然后在配置文件中建立下面这一节:

/boot/syslinux/syslinux.cfg
...
LABEL windows
	MENU LABEL Windows
	COM32 chain.c32
	APPEND hd0 3
...

hd0 3 是第一个 BIOS 控制驱动器上的第三个分区。请注意,驱动器计数从 0 开始,而分区计数则是从 1 开始。

注意: 对于引导 Windows,这样会跳过 Windows 自己的启动管理器环节 (bootmgr),而一些系统更新(例子)会需要这个组件才能完成。如果更新需要,在这种情况下建议临时将 MBR 的启动分区标记设在 Windows 所在分区(可以使用 GParted)并完成更新安装,再将启动分区标记改回 Syslinux 所在的分区。(可以使用 Windows自带的 DiskPart)。

链式加载 MBR 启动代码

如果您不知道 BIOS 会怎么安排驱动器的编号,您也可以使用 MBR 标记,或者说 GPT 的文件系统标签。使用 MBR 标记请如下文所示设置:

# fdisk -l /dev/sdb
Disk /dev/sdb: 128.0 GB, 128035676160 bytes 
255 heads, 63 sectors/track, 15566 cylinders, total 250069680 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf00f1fd3
 
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152    7  HPFS/NTFS/exFAT
/dev/sdb2         4196352   250066943   122935296    7  HPFS/NTFS/exFAT

/dev/sdb 改成您想要链式加载的驱动器。这里需要使用您磁盘的十六进制标识符,这个例子中是 0xf00f1fd3syslinux.cfg 需要改成这个样子:

/boot/syslinux/syslinux.cfg
...
LABEL windows
	MENU LABEL Windows
	COM32 chain.c32
	APPEND mbr:0xf00f1fd3
...

更多关于链式启动的信息,请参阅 Syslinux 维基

链式加载另一个启动加载器

如果您在同一个分区安装了 GRUB 引导程序,您可以像这样来链式加载它:

/boot/syslinux/syslinux.cfg
...
LABEL grub2
	MENU LABEL Grub2
	COM32 chain.c32
	APPEND file=../grub/boot.img
...

作为替代,也可以将 GRUB 作为一个 linux 内核来引导。只需要用 lnxboot.img 来替代 core.imglnxboot.img 文件是 core/grub 提供的,您可以在 /usr/lib/grub/i386-pc 处找到它。

/boot/syslinux/syslinux.cfg
...
LABEL grub2lnx
	MENU LABEL Grub2 (lnxboot)
	LINUX ../grub/i386-pc/lnxboot.img
	INITRD ../grub/i386-pc/core.img
...

对于需要从 ISO 镜像引导的系统,这可能会被用到。

使用内存测试 memtest

安装来自官方软件源memtest86+

用这个 LABEL 片段来启动内存测试

/boot/syslinux/syslinux.cfg
...
LABEL memtest
	MENU LABEL Memtest86+
	LINUX ../memtest86+/memtest.bin
...
注意: 如果您使用 PXELINUX,请将 memtest.bin 重命名为 memtest。因为 PXELINUX 会把有 .bin 后缀名的文件当作启动扇区,这样就只会读取文件的前 2KB。

硬件检测工具

硬件检测工具(HDT) 可以显示硬件信息。和前文所述的一样,.c32 模块需要从 /boot/syslinux/ 中复制,其他需要的 lib*.c32 库模块也需要一并复制。 如果想要显示 PCI 总线信息请将 /usr/share/hwdata/pci.ids 复制到 /boot/syslinux/pci.ids,并在您的配置文件中添加这些行:

/boot/syslinux/syslinux.cfg
LABEL hdt
	MENU LABEL Hardware Info
	COM32 hdt.c32

重启和关机

注意: 对于 Syslinux 6.03 版本,poweroff.c32 只能在高级电源管理(APM)下使用,而不适配高级配置与电源接口(ACPI)。您可以参考acpioff: 一种关闭使用 ACPI 控制机器的 COM32 模块,这是一种可能的解决办法。

使用下面的片段来重启或关机:

/boot/syslinux/syslinux.cfg
LABEL reboot
	MENU LABEL Reboot
	COM32 reboot.c32

LABEL poweroff
	MENU LABEL Power Off
	COM32 poweroff.c32

清空目录

当退出时清空屏幕,在配置文件中加入下面这一行:

/boot/syslinux/syslinux.cfg
MENU CLEAR

键盘布局

如果您需要经常修改 Syslinux 启动提示符下的参数,您可能想要匹配您的键盘布局。这样您就可以在一个非美式英语键盘上方便地输入"="、"/"等字符了。

注意: syslinux 软件包下的 keytab-lilo 是一个调用键位加载的 perl 脚本。

生成一个适配的键盘布局映射表,(比如说,德语键盘),运行:

# keytab-lilo /usr/share/kbd/keymaps/i386/qwerty/us.map.gz /usr/share/kbd/keymaps/i386/qwertz/de.map.gz > /boot/syslinux/de.ktl

现在在 syslinux.cfg 文件中加入

/boot/syslinux/syslinux.cfg
KBDMAP de.ktl

更多细节,请参考 Syslinux 维基

隐藏目录

在配置文件中使用

/boot/syslinux/syslinux.cfg
MENU HIDDEN

参数来隐藏目录并只显示超时倒计时。按下任意按键来显示目录。

PXELINUX

注意: 对于 UEFI 设备,Syslinux 使用相同的二进制文件来从磁盘和网络启动。从 TFTP 或其他网络协议中启动要求 Syslinux 的网络启动。

PXELINUX 和 syslinux 软件包一起提供。

对于一个 BIOS 客户机,将 {l,}pxelinux.0 启动加载器复制到客户机的启动目录。对于 5.00 版本及以上的 Syslinux,还需要将同一个软件包中的 ldlinux.c32 复制过去。

# cp /usr/lib/syslinux/bios/pxelinux.0 "TFTP_root/boot/"
# cp /usr/lib/syslinux/bios/ldlinux.c32 "TFTP_root/boot/"
# mkdir "TFTP_root/boot/pxelinux.cfg"

这时,我们同时也创建了 pxelinux.cfg 目录。PXELINUX 会默认在这个目录中寻找配置文件。我们不想对每一个不同的主机 MAC 地址都作出单独的设置,我们需要创建 default 作为默认配置。

TFTP_root/boot/pxelinux.cfg/default
DEFAULT linux

LABEL linux
	KERNEL vmlinuz-linux
	APPEND initrd=initramfs-linux.img quiet ip=:::::eth0:dhcp nfsroot=10.0.0.1:/arch

如果您使用 NBD 网络存储启动,添加下面这行:

append ro initrd=initramfs-linux.img ip=:::::eth0:dhcp nbd_host=10.0.0.1 nbd_port=10809 nbd_name=arch root=/dev/nbd0
注意: 您需要对应修改 nbd_host 和/或 nfsroot 来与您的网络配置(NFS/NBD 服务器的地址)相匹配。

PXELINUX 的配置和 SYSLINUX 使用相同的语法。参考上游的文档来获取更多信息。

内核与 initramfs 会通过 TFTP 传输,因此需要设置对 TFTP 根目录的相对路径。否则,根文件系统需要挂载在 NFS 挂载点上。

若要加载 PXELINUX, 请将 /etc/dhcpd.conf 文件中的 filename "/grub/i386-pc/core.0"; 替换为 filename "/pxelinux.0" (或 filename "/lpxelinux.0")。

通过 memdisk 启动 ISO9660 镜像

Syslinux 支持通过 memdisk 模块从 ISO 镜像中启动。参考Multiboot USB drive#Using Syslinux and memdisk中的示例。

串行控制台

参考 Working with the serial console#Syslinux

单次引导到另一个操作系统

可以临时改变 Syslinux 的行为,让其仅在下一次启动时引导进入另一个操作系统。下面的命令展示了怎样临时引导 archfallback

# extlinux -o archfallback /boot/syslinux

在下一次启动的过程中,上面制定的启动标签会在没有任何 Syslinux 启动提示符的情况下直接启动。默认的启动行为会在下一次重启的时候复原。

常见问题

无法加载 ldlinux

启动时出现 "Failed to load ldlinux.c32" 错误提示可能会有很多原因。 其中的一种可能是文件系统工具或者文件系统结构遭到了更改。

警告: 在 Syslinux 6.03 版本中,启动加载器可能不支持某些文件系统的部分功能。详情请参考 [12]
注意: 出现 Failed to load ldlinux.c32 并不一定与文件系统出现问题直接相关:
  • 文件系统可能出现的其他症状,除了这条信息,还可能指出另一些与文件系统有关的问题。
  • 这条信息并不说明问题处在了文件系统。还有其他的一些问题会导致这条信息出现。

您也可以参考 [13]。 (这一整页都和常见问题有关)。

使用 Syslinux 启动提示符

您可以输入(在您的 syslinux.cfg 配置过的) LABEL 的名称来启动对应的系统。如果您是按照上述的例子进行的配置,您只需要输入:

boot: arch

如果您收到了配置文件无法加载的错误信息,您可以向启动提示符中直接输入您的启动参数。比如说:

boot: ../vmlinuz-linux root=/dev/sda2 rw initrd=../initramfs-linux.img

如果在ramfs中您没有 boot: 的访问权限,并且您暂时无法启动内核,

1. 创建一个临时的目录,来加载您的根分区 (如果不存在的话):
 # mkdir -p /new_root
2. 将 / 挂载到 /new_root (我们假设 /boot/ 也在同一个分区,否则您需要将这些分区全部挂载):
注意: 如果 /boot 在自己的 ext2 分区,Busybox 将无法挂载。
 # mount /dev/sd[a-z][1-9] /new_root
3. 使用 vim 来重新将 syslinux.cfg 编辑正确。保存文件。
4. 重启。

根分区文件系统检测失败

如果根分区被严重损坏(分区日志受损),在ramfs的应急 shell 中,加载根分区文件系统:

# mount /dev/root partition /new_root

将二进制程序 tune2fs 从根分区中复制出来(这个不包含在 Syslinux 中)。

# cp /new_root/sbin/tune2fs /sbin/

按照下面的指示ext2fs: 日志损坏重建根分区日志。

没有找到默认回滚和界面设置

有些主板厂家对 USB 设备启动的支持会差一些。此时一个在通常的现代电脑上都能启动的 ext4 格式的 U 盘,一些要求内核与 initrd 文件必须存储在 FAT16 分区的电脑可能无法正常运作。为了避免这种老设备无法读取 syslinux.cfg 而去加载 ldlinux,用 dosfstools 工具建立一个 FAT16 的小分区(≤ 2 GB):

# mkfs.fat -F 16 /dev/sda1

再来安装配置 Syslinux。

找不到操作系统

  • 确保您在#MBR 分区表上安装的是 mbr.bin,在#GPT 分区表上安装的是 gptmbr.bin。如果安装错误,mbr.bin 会显示 "Missing operating system" 错误信息,而 gptmbr.bin 会显示 "Missing OS" 信息。
  • 检查包含 /boot 的分区是否有可启动标记。
  • 检查第一个分区是否是从 1 扇区,而不是 63 扇区或 2048 扇区开始的。您可以使用 fdisk -l 命令确认。如果是从 1 扇区开始的,您可以通过救援介质上的 gparted 修改。如果您有另一个启动分区,您可以将 /boot 备份:
# cp -a /boot /boot.bak

然后使用 Arch 安装磁盘启动。接下来,使用 cfdisk 删掉 /boot 分区,再重建它。现在这个分区应该从正确的 63 扇区开始。现在挂载您的分区,并按照安装指南中写的那样 chroot 进入待修复系统。使用以下指令恢复 /boot

# cp -a /boot.bak/ /boot/

检查 /etc/fstab 是否正确:

# syslinux-install_update -iam

然后重启。

如果您试图从用一个太新以至于 Syslinux 无法识别其元数据的工具创建的 md RAID-1 阵列启动,您也会得到这个错误信息。在 2013 年 8 月 mdadm 会创建使用 1.2 版本的元数据的阵列,但是 Syslinux 不能够识别高于 1.0 版本的元数据。如果是因此而出错,您需要重建您的序列,并在使用 mdadm 时添加 --metadata=1.0 参数。

启动了 Windows,Syslinux 被忽略掉了

解决办法: 确保包含 /boot 的分区上有可启动标记。同时,确保 Windows 分区上没有这个标记。请参考上面的#链式加载卷启动记录程序部分。

Syslinux 所在的 MBR 会找到第一个有可启动标记的活动分区。Windows 分区很可能最先被发现。如果您想要修改,您可以使用 Windows 或 MS-DOS 上的 fdisk

目录项失效

您选择了一个目录项,但是什么都没有发生,只是"刷新"了一下目录。这通常意味着您的 syslinux.cfg 文件出了问题。按下 Tab 键来修改您的启动参数。或者您也可以按下 Esc 键,并输入您的启动项的 LABEL。(比如说,arch)。另一种可能导致这个情况的原因可能是您没有安装内核。想个办法进入您的文件系统(比如说,用live CD),检查 /mount/vmlinuz-linux 文件存在并且非空。如果是这里出错,请重新安装您的内核。

无法删除 ldlinux.sys

ldlinux.sys 文件设置了不可变属性,禁止您删除或覆盖它。这样保证了除了重装 Syslinux,没有别的办法来修改这个文件。若要删除这个文件,请运行下面的指令:

# chattr -i /boot/syslinux/ldlinux.sys
# rm /boot/syslinux/ldlinux.sys

vesamenu的左上角有白色块

问题: 从 linux-3.0 开始,模式设置驱动程序会在更改分辨率后尝试保留屏幕的当前内容(至少在我的 Intel 设备上,使用 Syslinux 的文本模式的情况下如此)。而 Syslinux 中的 vesamenu 模块会与这个特性冲突。(白色方框实际上是驱动程序试图保留 Syslinux 目录,但是驱动程序无法从 vesa 图形模式下捕获图片)。

如果您的分辨率是自定义的,而 vesamenu 在很早就进行了模式设置,请尝试在 syslinux.cfg 添加这一行来消除白色块:

APPEND root=/dev/sda6 rw 5 vga=current quiet splash

当 Windows 安装在另一张磁盘上时,链式启动失效

如果 Windows 安装在在另一张磁盘上,您又不能通过链式启动来引导 Windows, 请尝试下列配置:

LABEL Windows
	MENU LABEL Windows
	COM32 chain.c32
	APPEND mbr:0xdfc1ba9e swap

将 MBR 代码换成您的 Windows 驱动器的值(详见上文),并将 swap 加入选项。

查看启动加载器日志

在一些情况下(比如启动加载器无法启动内核),我们很想得到启动的更多信息。Syslinux 会显示错误信息,但是文字一闪而过,看不清。为了保留日志信息,请禁用 syslinux.cfg 中的 UI menu,并使用默认的命令提示符。这意味着

  • 不使用 UI 命令
  • 不使用 ONTIMEOUT
  • 不使用 ONERROR
  • 不使用 MENU CLEAR
  • TIMEOUT 设为更高的值
  • 使用 PROMPT 1
  • 使用 DEFAULT problematic_label

若要得到更详细的调试日志,To get more detailed debug log, 添加下面的 C 编译标志并重新编译 syslinux 软件包:

-DDEBUG_STDIO=1 -DCORE_DEBUG=1

Btrfs 压缩

从压缩 Btrfs 文件系统启动不受支持。[14] 会显示下列错误信息:

btrfs: found compressed data, cannot continue!
invalid or corrupt kernel image.

多设备 Btrfs

从多设备 Btrfs 文件系统启动不受支持。[15] (21-Jul-2016 版本,main.c 文件第 1246 行validate_device_btrfs()会对此进行检查) 这个令人抓狂的问题会显示下列错误信息:(假设您将 Syslinux 装在 sda1):

/boot/syslinux is device /dev/sda1
extlinux: path /boot/syslinux doesn't match device /dev/sda1

更多信息