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 设置)和 mtools 包(如果您的 /boot 分区是 FAT 格式)。
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 部分 - 执行卷引导记录
- 阶段 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(核心模块),其中包含 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)并在找到后加载它。如果找不到配置文件,您将进入 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 脚本后,请勿忘记通过 #Configuration 和 #Kernel parameters 编辑 /boot/syslinux/syslinux.cfg。
syslinux-install_update 脚本设置的默认根分区可能与您的特定系统不匹配。通过编辑 /boot/syslinux/syslinux.cfg 将 Syslinux 指向正确根分区非常重要,否则操作系统将无法启动。请参阅 #Kernel parameters。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,或者简单地先重启到标准的 Arch Linux 内核来纠正这种情况;其使用 initramfs 避免了这个问题。
- 如果现在重新启动系统,您将看到 Syslinux 提示符。要自动引导系统或获得引导菜单,您需要创建(编辑)配置文件。
- 如果您在另一个根目录(例如,来自安装盘)下,请通过指向 chroot 来安装 SYSLINUX。
# syslinux-install_update -i -a -m -c /mnt
现在是时候通过 #Configuration 和 #Kernel parameters 编辑 /boot/syslinux/syslinux.cfg 了。
手动设置
/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 partition table,将安装
mbr.bin,或者 - 对于 #GUID partition table,将安装
gptmbr.bin。
如以下各节所述。
有关更多一般信息,请参阅 Master Boot Record。
blkid -s PTTYPE -o value /dev/sda 进行检查。MBR 分区表
对于 MBR 分区表,请确保您的引导分区在分区表中被标记为“活动”(设置了“boot”标志)。能够执行此操作的应用程序包括 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”(传统 BIOS 可引导)。对于 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 系统
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]
- UEFI 不支持 Memdisk。功能请求:[7]
- Syslinux 使用已弃用的 EFI handover 协议进行 UEFI 引导。官方支持的内核(Officially supported kernels)不受影响,因为它们是使用
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,请参阅 #Configuration。
- 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目录。 - 可以使用关键字
KERNEL代替LINUX。KERNEL尝试检测文件类型,而LINUX始终期望 Linux 内核。 TIMEOUT值单位为 0.1 秒。
示例
- 示例中找到的任何配置文件都需要编辑以设置正确的内核参数。请参阅 #Kernel parameters 部分。
- 请密切注意路径。示例可能不适用于您的安装,尤其是在使用 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 还允许您使用引导菜单。要使用它,请将 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 Install 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 的分辨率。但是,背景图片必须具有完全正确的 Auflösung,否则 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 参数的值;有关支持的方法,请参阅 Persistent block device naming。
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 菜单,请使用 #Boot prompt,并将 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 块内为单个引导项设置密码保护。
密码可以是明文密码或哈希密码:参见官方文档。
链式加载
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 ...
或者,也可以通过在 core.img 前面添加 lnxboot.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 而不是其他 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
请注意,除非其在/下有指向最新内核和initramfs的符号链接,否则每次更新此操作系统的内核时,都需要编辑<other-OS>/boot/syslinux/syslinux.cfg中的其他Linux条目。因为我们是直接引导内核,而不是链式加载其他操作系统的默认引导加载程序。
使用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
重启和关机
使用以下部分来重启或关闭您的机器
/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是一个调用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/在同一个分区上,否则您需要同时挂载它们)注意 Busybox无法挂载/boot,如果它在自己的ext2分区上。# 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中的说明为根分区创建新日志。
某些计算机上缺少默认或UI
某些主板制造商对从USB设备引导的兼容性不如其他制造商。虽然ext4格式的USB驱动器可以在较新的计算机上引导,但某些计算机可能会挂起,如果包含内核和initramfs的引导分区不在FAT16分区上。为防止旧计算机加载ldlinux并无法读取syslinux.cfg,请创建一个分区(≤ 2 GB)并使用dosfstools格式化为FAT16
# mkfs.fat -F 16 /dev/sda1
然后安装并配置Syslinux。
操作系统丢失
- 检查您是否已安装GPT的
gptmbr.bin和MBR分区表的mbr.bin。“Missing operating system”消息来自mbr.bin,而gptmbr.bin会显示“Missing OS”消息。 - 检查包含
/boot的分区是否启用了“boot”标志。 - 检查引导设备上的第一个分区是否从扇区1开始,而不是从扇区63或2048开始。使用
fdisk -l检查此项。如果它从扇区1开始,您可以使用救援磁盘上的gparted移动分区。或者,如果您有一个单独的引导分区,您可以使用
# cp -a /boot /boot.bak
备份/boot,然后使用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开始,modesetting驱动程序会尝试在更改分辨率后保留屏幕的当前内容(至少在我的Intel上,当Syslinux处于文本模式时是这样)。当与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
用您的Windows驱动器上的MBR代码替换(详情请参阅上方),并向选项中添加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