Syslinux

来自 ArchWiki

Syslinux 是一系列启动引导器的集合,能够从驱动器、CD 启动,以及通过 PXE 网络启动。

支持的文件系统

一些受支持的文件系统包括 FATNTFSext2ext3ext4XFSUFS/FFS 和未压缩的单设备 Btrfs

警告
  • 截至 Syslinux 6.03,启动引导器不支持某些受支持文件系统的特性。请参阅文件系统支持的完整列表以获取更多信息。这通常可以通过使用单独的 /boot 分区和通用支持的文件系统(如 FAT32)来解决。
  • Syslinux 不支持扇区大小不是 512 字节的 FAT 文件系统。
注意: Syslinux 本身无法访问来自自身分区以外的文件。请参阅 #链式加载 章节了解如何解决此问题。

安装

安装 syslinux 软件包。

BIOS 启动还需要 gptfdisk 软件包用于 BIOS/GPT 设置,如果您的 /boot 分区是 FAT 格式,则还需要 mtools 软件包。

UEFI 启动需要安装 efibootmgr 软件包。

安装 Syslinux 启动引导器

安装软件包与安装启动引导器不同。安装相关软件包后,还需要安装启动引导器代码本身(到适当的区域,通常是 VBR 或 ESP),以便能够启动系统;以下章节根据您特定系统的特性提供了替代说明。

BIOS 系统

Syslinux 在 BIOS 上的启动过程分阶段进行

阶段 1 - 部分 1 - 加载 MBR
启动时,BIOS 加载磁盘开头的 440 字节 MBR 引导代码 (/usr/lib/syslinux/bios/mbr.bin/usr/lib/syslinux/bios/gptmbr.bin)。
阶段 1 - 部分 2 - 搜索活动分区
阶段 1 MBR 引导代码 查找标记为活动的分区(MBR 磁盘中的启动标志)。假设这是 /boot 分区,例如。
阶段 2 - 部分 1 - 执行卷引导记录
阶段 1 MBR 引导代码 执行 /boot 分区的卷引导记录 (VBR)。对于 Syslinux,VBR 引导代码是 /boot/syslinux/ldlinux.sys 的起始扇区,它由 extlinux --install 命令创建。请注意,ldlinux.sysldlinux.c32 不同。
阶段 2 - 部分 2 - 执行 /boot/syslinux/ldlinux.sys
VBR 将加载 /boot/syslinux/ldlinux.sys 的其余部分。/boot/syslinux/ldlinux.sys 的扇区位置不应更改,否则 syslinux 将无法启动。
注意:Btrfs 的情况下,上述方法将不起作用,因为文件会移动,导致 ldlinux.sys 的扇区位置发生变化。因此,在 Btrfs 中,整个 ldlinux.sys 代码嵌入在 VBR 之后的空间中,并且不像其他文件系统的情况那样安装在 /boot/syslinux/ldlinux.sys 中。
阶段 3 - 加载 /boot/syslinux/ldlinux.c32
/boot/syslinux/ldlinux.sys 将加载 /boot/syslinux/ldlinux.c32(核心模块),其中包含 syslinux 核心部分的其余部分,这些部分由于文件大小限制而无法放入 ldlinux.sys 中。ldlinux.c32 文件应存在于每个 Syslinux 安装中,并且应与分区中安装的 ldlinux.sys 版本匹配。否则,Syslinux 将无法启动。有关更多信息,请参阅 https://bugzilla.syslinux.org/show_bug.cgi?id=7
阶段 4 - 搜索并加载配置文件
Syslinux 完全加载后,它会查找 /boot/syslinux/syslinux.cfg(或在某些情况下为 /boot/syslinux/extlinux.conf),如果找到则加载它。如果未找到配置文件,您将进入 Syslinux boot: 提示符。此步骤和 Syslinux 的其余非核心部分(/boot/syslinux/*.c32 模块,不包括 lib*.c32ldlinux.c32)需要存在 /boot/syslinux/lib*.c32(库)模块(https://wiki.syslinux.org/wiki/index.php/Common_Problems#ELF)。lib*.c32 库模块和非核心 *.c32 模块应与分区中安装的 ldlinux.sys 版本匹配。

自动

注意: syslinux-install_update 脚本是 Arch 特有的,Syslinux 上游不提供/支持。请将特定于该脚本的错误报告提交给 Arch 问题跟踪器,而不是上游。

执行 syslinux-install_update 脚本后,不要忘记按照 #配置#内核参数 编辑 /boot/syslinux/syslinux.cfg

警告: syslinux-install_update 脚本设置的默认根分区可能与您的特定系统不匹配。务必通过编辑 /boot/syslinux/syslinux.cfg 将 Syslinux 指向正确的根分区,否则操作系统将无法启动。请参阅 #内核参数

syslinux-install_update 脚本将安装启动引导器代码(通常安装到 VBR),将 *.c32 模块复制到 /boot/syslinux/,设置启动标志,在 MBR 中安装引导代码,并将 /usr/share/syslinux/syslinux.cfg 复制到 /boot/syslinux/syslinux.cfg。它可以处理 MBRGPT 磁盘以及软件 RAID

如果您使用单独的启动分区,请确保已挂载它。使用 lsblk 检查;如果您没有看到 /boot 挂载点,请在继续操作之前挂载它。

使用标志运行 syslinux-install_update-i(安装文件),-a(将分区标记为活动,并设置启动标志),-m(安装 MBR 引导代码)

# syslinux-install_update -i -a -m

如果此命令失败并显示Syslinux BIOS 安装失败,则问题可能是 extlinux 二进制文件找不到包含 /boot 的分区

# extlinux --install /boot/syslinux/
extlinux: cannot find device for path /boot/syslinux
extlinux: cannot open device (null)

例如,当从 LILO 升级时,可能会发生这种情况,LILO 在启动当前自定义内核时,将内核命令行参数(例如 root=/dev/sda1)转换为其数字等效值 root=801,这可以从 /proc/cmdlinemount 命令的输出中看出。通过以下方法解决此问题:继续执行下面描述的手动安装,同时为 extlinux 指定 --device=/dev/sda1,或者首先重新启动到 stock Arch Linux 内核;它使用 initramfs 避免了这个问题。

注意
  • 如果您现在重新启动系统,您将获得 Syslinux 提示符。要自动启动系统或获取启动菜单,您需要创建(编辑)配置文件。
  • 如果您在另一个根目录(例如从安装盘启动),请通过 chroot 定向安装 SYSLINUX
# syslinux-install_update -i -a -m -c /mnt

现在是时候按照 #配置#内核参数 编辑 /boot/syslinux/syslinux.cfg 了。

手动

注意: 如果您尝试使用 Live CD 救援已安装的系统,请务必先 chroot 进入该系统,然后再执行这些命令。如果您不先 chroot,则必须在所有文件路径(不是 /dev/ 路径)前加上挂载点。

您计划安装 Syslinux 的启动分区必须包含 FAT、ext2、ext3、ext4 或 Btrfs 文件系统。您不必将其安装在文件系统的根目录中,例如,设备 /dev/sda1 挂载在 /boot 上。例如,您可以将 Syslinux 安装在 syslinux 子目录中

# mkdir /boot/syslinux

如果您希望使用基本启动提示符以外的任何菜单或配置,请将所有 .c32 文件从 /usr/lib/syslinux/bios/ 复制到 /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 或 GPT),您可以使用 blkid -s PTTYPE -o value /dev/sda 进行检查。
注意: 对于无分区安装,无需将 Syslinux 引导代码安装到 MBR。您可以跳过以下内容并跳转到 #配置。请参阅 [1]
MBR 分区表

对于 MBR 分区表,请确保您的启动分区在分区表中标记为“活动”(设置了“boot”标志)。能够执行此操作的应用程序包括 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 提供的另一种 MBR 是:altmbr.bin。此 MBR 扫描可启动分区;相反,MBR 的最后一个字节设置为一个值,指示要从中启动的分区。以下是如何将 altmbr.bin 复制到位的示例

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

在本例中,值为 5(十六进制)的单个字节附加到 altmbr.bin 的内容中,并将生成的 440 字节写入设备 sda 上的 MBR。Syslinux 安装在磁盘的第一个逻辑分区 (/dev/sda5) 上。

GUID 分区表

对于 GPT,请确保为 /boot 分区设置属性位 2 “Legacy BIOS bootable”。对于 Parted,可以使用 “legacy_boot” 标志进行设置。使用 sgdisk 设置属性的命令是

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

这将在 /dev/sda 的分区 1 上设置属性 “legacy BIOS bootable”。要检查

# 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 文件需要位于 EFI 系统分区(又名 ESP)中,因为 Syslinux(目前)无法访问自身分区之外的文件(即本例中 ESP 之外的文件)。因此,建议将 ESP 挂载在 /boot
  • 自动安装脚本 /usr/bin/syslinux-install_update 不支持 UEFI 安装。
  • UEFI 的 syslinux.cfg 配置语法与 BIOS 相同。

UEFI Syslinux 的限制

  • 在 UEFI Syslinux 菜单中使用 Tab 编辑内核参数可能会导致显示乱码(文本重叠)。错误报告:[2]
  • UEFI Syslinux 不支持链式加载其他 EFI 应用程序,如 UEFI ShellWindows Boot Manager。增强功能请求:[3]
  • 在某些情况下,UEFI Syslinux 可能无法在某些虚拟机中启动,例如 QEMU/OVMF 或 VirtualBox 或某些 VMware 产品/版本,以及某些 UEFI 模拟环境(如 DUET)中。一位 Syslinux 贡献者已确认 VMware Workstation 10.0.2 和 Syslinux-6.02 或更高版本中不存在此类问题。错误报告:[4][5][6]
  • Memdisk 不适用于 UEFI。增强功能请求:[7]
  • Syslinux 使用已弃用的 EFI handover 协议进行 UEFI 启动。官方支持的内核不受影响,因为它们是使用 CONFIG_EFI_HANDOVER_PROTOCOL=y 构建的。启动未构建它的内核将失败,请参阅 FS#77632
  • 混合模式启动(从 IA32 syslinux 启动 x86_64 内核)可能无法工作。[8]
  • 没有合适的 安全启动 支持。[9]

部署

注意: 在与 UEFI 相关的命令中,esp 表示 EFI 系统分区(又名 ESP)的挂载点。

按如下方式在 EFI 系统分区中设置 Syslinux。

将 Syslinux 文件复制到 ESP

# mkdir -p esp/EFI/syslinux
# cp -r /usr/lib/syslinux/efi64/* esp/EFI/syslinux

使用 efibootmgr 为 Syslinux 创建 UEFI 启动项

# efibootmgr --create --disk /dev/sdX --part Y --loader /EFI/syslinux/syslinux.efi --label "Syslinux" --unicode

其中 /dev/sdXY 是包含启动引导器的 EFI 系统分区。

按照 #配置 创建或编辑 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

配置

本文或章节已过时。

原因: /boot/syslinux/syslinux.cfg 已由 syslinux 软件包提供,并且如果 ESP 挂载在 /boot 中,则可以在 BIOS 和 UEFI 中工作。(在 Talk:Syslinux#Location of the configuration file 中讨论)

Syslinux 配置文件 syslinux.cfg 应在您安装 Syslinux 的同一目录中创建。在我们的例子中,BIOS 系统为 /boot/syslinux/,UEFI 系统为 esp/EFI/syslinux/

启动引导器将查找 syslinux.cfg(首选)或 extlinux.conf

提示
  • syslinux-install_update 通过复制示例配置文件 /usr/share/syslinux/syslinux.cfg 创建 /boot/syslinux/syslinux.cfg。如果您手动安装了 Syslinux 启动引导器,您也需要手动将 /usr/share/syslinux/syslinux.cfg 复制到 syslinux 目录。
  • 除了 LINUX 之外,还可以使用关键字 KERNELKERNEL 尝试检测文件类型,而 LINUX 始终期望 Linux 内核。
  • TIMEOUT 值以 0.1 秒为单位。

示例

注意
  • 示例中找到的任何配置文件都需要编辑以设置正确的内核参数。请参阅 #内核参数 部分。
  • 请密切注意路径。这些示例可能不适合您的安装,尤其是在使用 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=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
	INITRD ../initramfs-linux.img

LABEL archfallback
	LINUX ../vmlinuz-linux
	APPEND root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
	INITRD ../initramfs-linux-fallback.img

文本启动菜单

Syslinux 还允许您使用启动菜单。要使用它,请将 menulibutil 模块复制到您的 Syslinux 目录

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

自 5.00 版本起,也经常需要额外的 lib*.c32 库模块。有关模块依赖关系树,请参阅 Syslinux wiki

配置

* 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=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
	INITRD ../initramfs-linux.img

LABEL archfallback
	MENU LABEL Arch Linux Fallback
	LINUX ../vmlinuz-linux
	APPEND root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
	INITRD ../initramfs-linux-fallback.img

有关菜单系统的更多详细信息,请参阅 Syslinux wiki

图形启动菜单

Syslinux 还允许您使用图形启动菜单。要使用它,请将 vesamenu COM32 模块复制到您的 Syslinux 文件夹

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

自 5.00 版本起,也经常需要额外的 lib*.c32 库模块。有关模块依赖关系树,请参阅 Syslinux wiki

注意: 如果您正在使用 UEFI,请确保从 /usr/lib/syslinux/efi64/(或 IA32 (32 位) EFI 系统的 efi32)复制,否则您将看到黑屏。在这种情况下,请从 Live 介质启动并使用 chroot 进行相应的更改。

此配置使用与 Arch 安装 CD 相同的菜单设计,其配置可以在 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=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
	INITRD ../initramfs-linux.img

LABEL archfallback
	MENU LABEL Arch Linux Fallback
	LINUX ../vmlinuz-linux
	APPEND root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 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 将是从屏幕底部算起的第 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 列,因此高于这些值可能会将菜单移出屏幕,可能需要从救援 CD 进行编辑。

内核参数

内核参数通过在 syslinux.cfg 中使用 APPEND 指令设置:对于每个 LABEL 条目,最多接受一个 APPEND 行(即,跨越多行无效)。

建议也对 “fallback” 条目进行以下更改。

在最简单的情况下,需要替换 root 参数的值;有关支持的方法,请参阅 持久块设备命名

APPEND root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw

root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 更改为指向正确的根卷。

如果您使用 dm-crypt 加密,请更改 APPEND 行以使用您的加密卷

APPEND root=/dev/mapper/name cryptdevice=UUID=YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY:name rw

如果引导 btrfs 子卷,请使用 rootflags=subvol=root_subvolume 修改 APPEND 行。例如,如果 /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 已挂载为名为 'ROOT' 的 btrfs 子卷(例如 mount -o noatime,subvol=ROOT /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt),则需要按如下方式修改 APPEND

APPEND root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw rootflags=subvol=ROOT

否则,未能这样做将导致以下错误消息:ERROR: Root device mounted successfully, but /sbin/init does not exist.

自动启动

如果您根本不想看到 Syslinux 菜单,请使用 #启动提示符,并将 PROMPT 设置为 0 并注释掉任何 UI 菜单项。将 TIMEOUT 变量设置为 0 也可能是一个好主意。确保在您的 syslinux.cfg 中设置了 DEFAULT。在启动期间按住 ShiftAlt,或设置 Caps LockScroll Lock,将允许使用默认选项以外的选项。有关其他替代方案,请参阅 上游 wiki

安全

Syslinux 具有两个级别的启动引导器安全性:菜单主密码和每个菜单项密码。在 syslinux.cfg 中,使用

MENU MASTER PASSWD passwd 

设置主启动引导器密码,以及

MENU PASSWD passwd 

LABEL 块中密码保护各个启动项。

passwd 可以是明文密码或哈希密码:请参阅官方文档

链式加载

Syslinux BIOS 无法直接链式加载位于其他分区上的文件;但是,chain.c32 可以启动分区引导扇区 (VBR) 或另一个磁盘的 MBR。

链式加载分区 VBR

如果您想链式加载其他操作系统(例如 Windows)或启动引导器,请将 chain.c32 模块复制到 Syslinux 目录(可能还需要额外的 lib*.c32 库模块;有关详细信息,请参阅上一节中的说明)。然后在配置文件中创建一个部分

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

hd0 3 是第一个 BIOS 驱动器上的第三个分区 - 驱动器从零开始计数,但分区从一开始计数。

注意: 对于 Windows,这将跳过系统自身的启动管理器 (bootmgr),这是完成一些重要更新(例如)所必需的。在这种情况下,建议暂时将 MBR 启动标志设置为 Windows 分区(例如使用 GParted),让更新完成安装,然后将标志重置为 Syslinux 分区(例如使用 Windows 自己的 DiskPart)。

链式加载磁盘 MBR

如果您不确定 BIOS 认为哪个驱动器是“第一个”,您可以改为使用 MBR 标识符,或者如果您使用 GPT,则可以使用文件系统标签。要使用 MBR 标识符,请运行命令

# sfdisk --disk-id /dev/sdb
0xf00f1fd3

/dev/sdb 替换为您要链式加载的驱动器。使用返回的十六进制数,在本例中为 0xf00f1fd3syslinux.cfg 中的语法为

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

有关链式加载的更多详细信息,请参阅 Syslinux wiki

链式加载其他启动引导器

如果您在同一分区上安装了 GRUB,您可以使用链式加载它

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

或者,也可以通过将 lnxboot.img 前置到 core.img 的方式,将 GRUB 加载为 Linux 内核。文件 lnxboot.imgcore/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 镜像启动所必需的。

链式加载其他 Linux 系统

此文章或章节的 事实准确性 存在争议。

原因: 除其他不准确之处... 1_ 如果您已经拥有与另一个分区/操作系统相关的引导加载程序(例如,安装在 MBR 或要链式加载的分区的 VBR 中的 GRUB2),则没有义务安装另一个引导加载程序。 2_ Syslinux(及其任何衍生版本)永远不会“安装到 MBR”,因此在本节中提及 MBR 而不对其含义或如何在实践中执行进行任何解释,只会增加混乱。 3_ 错别字和拼写错误。 4_无需(再次)解释如何将某个(其他)引导加载程序安装到某个(其他)分区/操作系统;只需说明如何从 Syslinux 链式加载到另一个分区/引导加载程序/操作系统。(在 Talk:Syslinux 中讨论)

链式加载另一个引导加载程序(如 Windows 的引导加载程序)非常明显,因为它有一个明确的引导加载程序可以链式加载。但是对于 Syslinux,它只能加载与配置文件位于同一分区的文件。因此,如果您在单独的分区上有另一个 Linux 版本,而没有共享的 /boot,则必须使用 EXTLINUX 而不是其他操作系统的默认引导加载程序(例如 GRUB2)。本质上,EXTLINUX 可以安装在分区超级块/VBR 上,并可以从 Syslinux 安装的 MBR 中作为单独的引导加载程序调用。EXTLINUX 是 Syslinux 项目的一部分,包含在 syslinux 软件包中。

以下说明假设您已经安装了 Syslinux。这些说明还将假设正在使用典型的 Arch Linux 配置路径 /boot/syslinux,并且链式加载的系统的 / 位于 /dev/sda3 上。

从启动的 Linux 系统(可能是设置为由 Syslinux 启动的分区)中,将另一个系统的根分区挂载到您期望的挂载点。在本例中,这将是 /mnt。此外,如果在第二个操作系统上使用了单独的 /boot 分区,也需要挂载该分区。本例假设它是 /dev/sda2

# mount /dev/sda3 /mnt
# mount /dev/sda2 /mnt/boot (only necessary for separate /boot)

将 EXTLINUX 安装到分区 VBR,并复制必要的 *.c32 文件

# extlinux -i /mnt/boot/syslinux/ (first create the directory if necessary)
# cp /usr/lib/syslinux/bios/*.c32 /mnt/boot/syslinux

创建 /mnt/boot/syslinux/syslinux.cfg。您可以参考其他 Linux 系统的引导加载程序菜单文件。以下是一个示例

/mnt/boot/syslinux/syslinux.cfg on /dev/sda3
TIMEOUT 10

UI menu.c32

LABEL OtherLinux
	LINUX /boot/vmlinuz-linux
	INITRD /boot/initramfs-linux.img
	APPEND root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw quiet

LABEL MAIN
	COM32 chain.c32
	APPEND hd0 0

然后在您的主 syslinux.cfg 中添加一个条目

/boot/syslinux/syslinux.cfg
LABEL OtherLinux
	COM32 chain.c32
	APPEND hd0 3

请注意,每次您更新此操作系统的内核时,都需要编辑 <other-OS>/boot/syslinux/syslinux.cfg 中的其他 Linux 条目,除非它在 / 中具有指向其最新内核和 initrd 的符号链接。因为我们是直接引导内核,而不是链式加载其他操作系统的默认引导加载程序。

使用 memtest

安装 memtest86+

使用此 LABEL 部分启动 memtest

/boot/syslinux/syslinux.cfg
...
LABEL memtest
	MENU LABEL Memtest86+
	LINUX ../memtest86+/memtest.bin
...
注意: 如果您正在使用 PXELINUX,请将名称从 memtest.bin 更改为 memtest,因为 PXELINUX 将带有 .bin 扩展名的文件视为引导扇区,并且仅加载 2KB 的内容。

HDT

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 启动提示符下使用不同的参数编辑启动命令,那么您可能需要重新映射您的键盘布局。这允许您在非美国键盘上轻松输入“=”,“/”和其他字符。

注意: keytab-lilo 包含在 syslinux 软件包中,是一个调用 loadkeys 程序的 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 wiki

隐藏菜单

使用选项

/boot/syslinux/syslinux.cfg
MENU HIDDEN

隐藏菜单,同时仅显示超时。按任意键显示菜单。

PXELINUX

注意: 对于 UEFI,Syslinux 对磁盘启动和网络启动使用相同的二进制文件。从 TFTP 或其他网络协议加载文件将需要网络启动 Syslinux。

PXELINUX 由 syslinux 软件包提供。

对于 BIOS 客户端,将 lpxelinux.0ldlinux.c32 复制到客户端的启动目录。

# cp /usr/lib/syslinux/bios/lpxelinux.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 行

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 挂载本身,因此它们相对于 NFS 服务器的根目录。

要实际加载 PXELINUX,请将 /etc/dhcpd.conf 中的 filename "/grub/i386-pc/core.0"; 替换为 filename "/lpxelinux.0"

使用 memdisk 启动 ISO9660 镜像文件

Syslinux 支持使用 memdisk 模块直接从 ISO 镜像启动,有关示例,请参阅 多重启动 USB 驱动器#使用 Syslinux 和 memdisk

串行控制台

请参阅 使用串行控制台#Syslinux

单次启动另一个操作系统

可以临时更改默认的 Syslinux 操作,并在下次启动时仅启动另一个标签。以下命令显示如何单次启动 archfallback 标签

# extlinux -o archfallback /boot/syslinux

在下次启动期间,将启动指定的标签,而不会显示任何 Syslinux 提示符。默认的 Syslinux 启动行为将在下次重启时恢复。

故障排除

加载 ldlinux 失败

初始启动期间出现诸如 “Failed to load ldlinux.c32” 之类的错误消息可能是由多种不同的原因引起的。一个潜在的原因可能是文件系统工具或文件系统结构发生了更改,具体取决于其自身的版本。

警告: 从 Syslinux 6.03 开始,引导加载程序不支持某些受支持文件系统的功能。有关更多信息,请参阅 [10]
注意: 诸如 Failed to load ldlinux.c32 之类的消息与文件系统相关问题之间没有直接且唯一的对应关系
  • 其他替代症状,而不是此消息,也可能表明与文件系统相关的问题。
  • 该消息并不一定意味着问题与文件系统有关;此类型的消息还有其他可能的原因。

另请参阅 [11](整个页面可能也与故障排除相关)。

使用 Syslinux 提示符

您可以键入您要启动的条目的 LABEL 名称(根据您的 syslinux.cfg)。如果您使用了示例配置,只需键入

boot: arch

如果您收到无法加载配置文件的错误,您可以传递您需要的启动参数,例如

boot: ../vmlinuz-linux root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 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. 编辑 syslinux.cfg 以再次满足您的需求并保存文件。
  4. 重启。

根分区上的 fsck 失败

如果根分区严重损坏(其中日志已损坏),在 ramfs 紧急 shell 中,挂载根文件系统

# mount /dev/root partition /new_root

并从根分区抓取 tune2fs 二进制文件(它不包含在 Syslinux 中)

# cp /new_root/sbin/tune2fs /sbin/

按照 ext2fs:无外部日志 中的说明为根分区创建新日志。

某些计算机上未找到默认或 UI

某些主板制造商对从 USB 设备启动的兼容性不如其他制造商。虽然 ext4 格式化的 USB 驱动器可能在较新的计算机上启动,但如果包含内核initrd的启动分区不在 FAT16 分区上,则某些计算机可能会挂起。为防止旧机器加载 ldlinux 并无法读取 syslinux.cfg,请创建一个分区(≤ 2 GB)并使用 dosfstools 格式化为 FAT16

# mkfs.fat -F 16 /dev/sda1

然后安装和配置 Syslinux。

缺少操作系统

  • 检查您是否为 GPT 安装了 gptmbr.bin,为 MBR 分区表安装了 mbr.bin。“缺少操作系统”消息来自 mbr.bin,而 gptmbr.bin 将显示“缺少操作系统”消息。
  • 检查包含 /boot 的分区是否已启用“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

然后重启。

如果您尝试从 md RAID 1 阵列启动,并且使用 Syslinux 无法理解的过新版本的元数据创建了阵列,您也会收到此错误。截至 2013 年 8 月,默认情况下 mdadm 将创建一个版本为 1.2 元数据的阵列,但 Syslinux 不理解高于 1.0 的元数据。如果是这种情况,您将需要使用 --metadata=1.0 标志重新创建您的 RAID 阵列。

Windows 启动,忽略 Syslinux

解决方案: 确保包含 /boot 的分区已启用启动标志。另外,确保 Windows 分区上未启用启动标志。请参阅上面的安装部分

Syslinux 附带的 MBR 查找第一个设置了启动标志的活动分区。Windows 分区很可能首先被找到并设置了启动标志。如果您愿意,可以使用 Windows 或 MS-DOS fdisk 提供的 MBR。

菜单条目无任何反应

您选择一个菜单条目,但它没有任何反应,只是“刷新”菜单。这通常意味着您的 syslinux.cfg 文件中存在错误。按 Tab 键编辑您的启动参数。或者,按 Esc 键并键入您的启动条目的 LABEL(例如,arch)。另一个原因可能是您没有安装内核。找到一种访问您的文件系统的方法(通过 Live CD 等),并确保 /mount/vmlinuz-linux 存在且大小不为 0。如果是这种情况,请重新安装您的内核。

无法删除 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=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw 5 vga=current quiet splash

链式加载 Windows 无法工作,当它安装在另一个驱动器上时

如果 Windows 安装在与 Arch 不同的驱动器上,并且您在链式加载它时遇到问题,请尝试以下配置

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

要获取更详细的调试日志,请使用附加的 CFLAGS 重新编译 syslinux 软件包

-DDEBUG_STDIO=1 -DCORE_DEBUG=1

Btrfs 压缩

不支持从启用压缩的 btrfs 启动。[12] 此错误将显示

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

Btrfs 多设备

不支持从多设备 btrfs 启动。[13] (截至 2016 年 7 月 21 日,main.c 中 validate_device_btrfs() 的第 1246 行)此令人费解的错误将显示(假设您正在 sda1 上安装)

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

另请参阅