Syslinux
Syslinux 是一系列启动加载程序的集合,能够从驱动器、CD 启动,以及通过 PXE 通过网络启动。
支持的文件系统
部分支持的文件系统包括 FAT、NTFS、ext2、ext3、ext4、XFS、UFS/FFS 以及未压缩的单设备 Btrfs。
- 截至 Syslinux 6.03,启动引导器不支持部分受支持文件系统的功能。有关更多信息,请参阅文件系统支持的完整列表。通常可以通过使用单独的 /boot 分区 和通用支持的文件系统(如 FAT32)来解决此问题。
- Syslinux 不支持扇区大小不是 512 字节的 FAT 文件系统。
安装
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.sys
与ldlinux.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
(核心模块),其中包含无法放入ldlinux.sys
的 syslinux 核心部分的其余部分(由于文件大小限制)。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
),如果找到则加载它。如果未找到配置文件,您将进入 Syslinuxboot:
提示符。此步骤和 Syslinux 的其余非核心部分(/boot/syslinux/*.c32
模块,不包括lib*.c32
和ldlinux.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
。它可以处理 MBR 和 GPT 磁盘以及软件 RAID
如果您使用单独的启动分区,请确保已挂载它。使用 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 升级时,可能会发生这种情况,LILO 在启动当前自定义内核时,将内核命令行参数(例如 root=/dev/sda1
)转换为其数字等效项 root=801
,如 /proc/cmdline
和 mount
命令的输出所证明的那样。通过继续执行下面描述的手动安装,同时为 extlinux
指定 --device=/dev/sda1
,或者首先重新启动到 stock Arch Linux 内核来解决这种情况;它使用 initramfs 避免了这个问题。
- 如果您现在重新启动系统,您将获得 Syslinux 提示符。要自动启动系统或获取启动菜单,您需要创建(编辑)配置文件。
- 如果您在另一个根目录(例如,来自安装盘),请通过定向到 chroot 来安装 SYSLINUX
# syslinux-install_update -i -a -m -c /mnt
现在是按照 #配置 和 #内核参数 编辑 /boot/syslinux/syslinux.cfg
的时候了。
手动
/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 引导代码
如下节所述。
有关更多常规信息,请参阅主引导记录。
blkid -s PTTYPE -o value /dev/sda
进行检查。MBR 分区表
对于 MBR 分区表,请确保您的启动分区在分区表中标记为“活动”(设置了“启动”标志)。能够执行此操作的应用程序包括 fdisk 和 parted。它应该看起来像这样
# 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 Shell
或Windows 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 对 UEFI 启动使用已弃用的 EFI handover 协议。官方支持的内核不受影响,因为它们是使用
CONFIG_EFI_HANDOVER_PROTOCOL=y
构建的。启动未使用它构建的内核将失败,请参阅 FS#77632。 - 混合模式启动(从 IA32 syslinux 启动 x86_64 内核)可能无法工作。[8]
- 没有适当的 安全启动 支持。[9]
部署
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
配置
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
之外,关键字KERNEL
也可以使用。KERNEL
尝试检测文件类型,而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 还允许您使用启动菜单。要使用它,请将 menu
和 libutil
模块复制到您的 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。
/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 RESOLUTION
、MENU HSHIFT $N
和 MENU 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
。在启动期间按住 Shift
或 Alt
,或设置 Caps Lock
或 Scroll 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 驱动器上的第三个分区 - 驱动器从零开始计数,但分区从一开始计数。
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 ...
或者,也可以通过将 lnxboot.img
前置到 core.img
来将 GRUB 加载为 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 系统
链式加载另一个启动引导器(如 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 ...
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
重启并关机
poweroff.c32
仅适用于 APM,不适用于 ACPI。对于可能的解决方案,请参阅 acpioff: COM32 模块,用于使用 ACPI 关闭计算机。使用以下章节来重启或关机你的机器
/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
PXELINUX 由 syslinux 软件包提供。
对于 BIOS 客户端,复制 lpxelinux.0
和 ldlinux.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 镜像启动,有关示例,请参阅 Multiboot USB drive#Using Syslinux and memdisk。
串口控制台
请参阅 Working with the serial console#Syslinux。
启动另一个操作系统一次
可以临时更改默认的 Syslinux 操作,并在下次启动时仅启动另一个标签。以下命令显示如何启动 archfallback
标签一次
# extlinux -o archfallback /boot/syslinux
在下次启动期间,将启动指定的标签,而不会显示任何 Syslinux 提示符。默认的 Syslinux 启动行为将在下次重启时恢复。
故障排除
加载 ldlinux 失败
初始启动期间出现的诸如 “Failed to load ldlinux.c32” 的错误消息可能由多种不同的原因触发。一个潜在的原因可能是文件系统工具或文件系统结构的变化,具体取决于其自身的版本。
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:
,因此暂时无法再次启动内核,
- 创建一个临时目录,以便挂载你的根分区(如果它尚不存在)
# mkdir -p /new_root
- 将
/
挂载到/new_root
下(如果/boot/
在同一分区上,否则你需要同时挂载它们)注意: 如果/boot
在其自己的 ext2 分区上,Busybox 无法挂载它。# mount /dev/sd[a-z][1-9] /new_root
- 编辑
syslinux.cfg
再次以满足你的需求并保存文件。 - 重启。
fsck 在根分区上失败
在根分区严重损坏(日志损坏)的情况下,在 ramfs 紧急 shell 中,挂载根文件系统
# mount /dev/root partition /new_root
并从根分区获取 tune2fs 二进制文件(它不包含在 Syslinux 中)
# cp /new_root/sbin/tune2fs /sbin/
按照 ext2fs: no external journal 中的说明为根分区创建新的日志。
在某些计算机上找不到 Default 或 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
将显示“缺少 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
标志重新创建你的 RAID 阵列。
Windows 启动,忽略 Syslinux
解决方案: 确保包含 /boot
的分区已启用 boot 标志。此外,确保 Windows 分区上未启用 boot 标志。请参阅上面的安装部分。
Syslinux 附带的 MBR 查找第一个设置了 boot 标志的活动分区。Windows 分区很可能首先被找到并设置了 boot 标志。如果你愿意,你可以使用 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
问题:从 linux-3.0 开始,modesetting 驱动程序尝试在更改分辨率后保留屏幕的当前内容(至少在使用文本模式下的 Syslinux 的 Intel 显卡时是这样)。当与 Syslinux 中的 vesamenu 模块结合使用时,这似乎会出错(白色块实际上是尝试保留 Syslinux 菜单,但驱动程序无法从 vesa 图形模式捕获图片)。
如果你有一个自定义分辨率和一个带有早期 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