跳转至内容

Syslinux

来自 ArchWiki

Syslinux 是一个引导程序集合,能够从驱动器、CD 以及通过 PXE 网络进行引导。

支持的文件系统

其支持的部分文件系统包括 FATNTFSext2ext3ext4XFSUFS/FFS,以及未压缩的单设备 Btrfs

警告
  • 自 Syslinux 6.03 起,引导程序尚不支持某些已支持文件系统的特定功能。更多信息请参见完整的文件系统支持列表。这通常可以通过使用一个单独的、采用通用支持文件系统(如 FAT32)的 /boot 分区来解决。
  • Syslinux 不支持扇区大小非 512 字节的 FAT 文件系统。
注意: Syslinux 本身无法访问除其自身所在分区以外的文件。关于如何解决此问题,请参阅 #链式加载

安装

安装 syslinux 软件包。

对于 BIOS/GPT 方案的 BIOS 引导,还需要 gptfdisk 软件包;如果你的 /boot 分区是 FAT 格式,则需要 mtools

UEFI 引导需要安装 efibootmgr 软件包。

安装 Syslinux 引导程序

安装软件包不等于安装引导程序。在安装了相关的软件包后,需要将引导程序代码本身安装到适当的区域(通常是 VBR 或 ESP)以引导系统;以下章节将根据你特定系统的特性提供不同的操作指令。

BIOS 系统

BIOS 上的 Syslinux 引导过程是分阶段进行的

阶段 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 部分 - 执行卷引导记录 (VBR)
阶段 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。每个 Syslinux 安装中都应存在 ldlinux.c32 文件,并且必须与安装在分区中的 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 上游并不提供/支持该脚本。请将针对该脚本的任何 Bug 报告提交到 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(将分区标记为 active 活动状态,带 boot 引导标志)、-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 升级时可能会发生这种情况。在引导当前的自定义内核时,LILO 将内核命令行参数(如 root=/dev/sda1)转换成了其数值等价物 root=801,这可以通过 /proc/cmdlinemount 命令的输出得到证实。要解决此问题,可以继续按下方描述的手动安装,同时向 extlinux 指定 --device=/dev/sda1,或者干脆先重启到 Arch Linux 官方内核;由于其使用了 initramfs,可以避免此问题。

  • 如果你现在重启系统,你会看到 Syslinux 提示符。为了自动引导系统或获取引导菜单,你需要创建(编辑)配置文件。
  • 如果你在另一个根目录(例如从安装盘启动)安装 SYSLINUX,请通过指向 chroot 来安装
# 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 引导引导 (bootstrap) 代码:

详见后续章节。

更多一般信息请参见 主引导记录 (Master Boot Record)

提示: 如果你不确定正在使用的是哪种分区表(MBR 或 GPT),可以使用 blkid -s PTTYPE -o value /dev/sda 进行检查。
注意: 对于无分区安装 (partitionless),无需将 Syslinux 引导代码安装到 MBR。你可以跳过后续步骤,直接进入 #配置。参见 [1]
MBR 分区表

对于 MBR 分区表,确保你的引导分区在分区表中被标记为“活动”(active)(设置了“引导” (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 键编辑内核参数可能会导致显示混乱 (文字重叠)。Bug 报告: [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 或更高版本上不存在此类问题。Bug 报告: [4], [5] 以及 [6]
  • Memdisk 在 UEFI 下不可用。改进建议: [7]
  • Syslinux 为 UEFI 引导使用已弃用的 EFI handover 协议。官方支持的内核不受影响,因为它们编译时带有 CONFIG_EFI_HANDOVER_PROTOCOL=y。若引导未带此参数编译的内核,将引导失败,请参见 FS#77632
  • 混合模式引导(从 IA32 syslinux 引导 x86_64 内核)可能不起作用。[8]
  • 没有妥善的 安全启动 (Secure Boot) 支持。[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 时。
  • 以下示例假设内核和 initramfs 文件位于相对于 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 子卷,请在 APPEND 行修正为 rootflags=subvol=root_subvolume。例如,当 /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 password

来设置主引导程序密码,并且在

syslinux.cfg
MENU PASSWD password

LABEL 块中使用来对单个引导项进行密码保护。

密码可以是明文,也可以是哈希过的:请参阅官方文档

链式加载

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 替换为你希望链式加载的驱动器。使用返回的十六进制数字(在本例中为 0xf00f1fd3),syslinux.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

或者,也可以通过在 core.img 前附加 lnxboot.imgGRUB 作为 linux 内核加载。lnxboot.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 镜像引导所必需的。

链式加载其他 Linux 系统

本文或本章节的准确性存在争议。

理由: 除了其他不准确之处之外... 1. 如果你已经拥有与另一个分区/OS 相关的引导程序(例如安装在 MBR 或被链式加载分区的 VBR 中的 GRUB2),则没有义务再安装另一个引导程序。2. Syslinux(及其任何派生程序)从未被“安装到 MBR”,因此在本节中提到 MBR 而不解释其含义或如何在实践中操作只会增加困惑。3. 拼写错误。4. 无需(再次)解释如何将某些(其他)引导程序安装到某些(其他)分区/OS;只需说明如何从 Syslinux 链式加载到该其他分区/引导程序/OS 即可。 (在 Talk:Syslinux 中讨论)

链式加载像 Windows 这样的其他引导程序是很显而易见的,因为有一个明确的引导程序可以连接到。但是对于 Syslinux,它只能加载位于与配置文件相同分区的文件。因此,如果你在单独的分区上有另一个版本的 Linux 且没有共享的 /boot,则必须使用 EXTLINUX 而不是其他 OS 的默认引导程序(例如 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 条目在每次更新该 OS 的内核时都需要编辑,除非它在 / 路径下有指向其最新内核和 initramfs 的符号链接。因为我们是直接引导内核,而不是链式加载另一个 OS 的默认引导程序。

使用 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 (Hardware Detection Tool) 显示硬件信息。和之前一样,必须从 /boot/syslinux/ 复制 .c32 文件。可能还需要额外的 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 是一个调用 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 的默认行为,仅在下次引导时启动另一个 label。以下命令展示了如何执行一次引导 archfallback 标签:

# extlinux -o archfallback /boot/syslinux

在下次引导时,指定的 label 将在没有任何 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/usr/bin/tune2fs /usr/bin/

按照 ext2fs: no external journal 的说明为根分区创建一个新的日志。

在某些计算机上找不到 Default 或 UI

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

# mkfs.fat -F 16 /dev/sda1

然后安装并配置 Syslinux。

操作系统缺失 (Missing operating system)

  • 检查是否已为 GPT 分区表安装了 gptmbr.bin,为 MBR 安装了 mbr.bin。"Missing operating system" 消息来自 mbr.bin,而 gptmbr.bin 会显示 "Missing OS" 消息。
  • 检查包含 /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 标志重新向 mdadm 创建你的 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 文件设置了 不可变属性 (immutable),这防止其被删除或覆盖。这是因为该文件的扇区位置绝不能改变,否则 Syslinux 必须重新安装。要移除它,请运行:

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

使用 vesamenu 时左上角出现白色方块

问题描述:从 linux-3.0 起,modesetting 驱动在更改解析度后会尝试保留屏幕当前内容(至少在使用 Intel 显卡且 Syslinux 处于文本模式时是这样的)。这在与 Syslinux 中的 vesamenu 模块结合使用时似乎会出错(白色方块实际上是试图保留 Syslinux 菜单的操作,但驱动程序无法从 vesa 图形模式中获取图片)。

如果你使用了自定义解析度以及开启了 early modesetting 的 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

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.