Syslinux - Arch Linux 中文维基

跳至內容

# Syslinux

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Syslinux，最近一次同步於 2020-07-22，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Arch Boot Process

Syslinux是一個啟動加載器集合，可以從硬碟、光碟或通過 PXE 的網絡引導啟動系統。支持的文件系統包括 FAT，ext2，ext3，ext4 和非壓縮單設備 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.sys` 和 `ldlinux.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*.c32` 和 `ldlinux.c32`的`/boot/syslinux/*.c32` 模塊) 需要提供 `/boot/syslinux/lib*.c32` (庫)模塊[3]。同樣，{ic|lib*.c32}} 庫模塊和非核心的 `*.c32` 模塊需要與分區中的 `ldlinux.sys` 版本相匹配。

### 在 BIOS 上安裝

安裝軟體包 syslinux包。

注意：

- GPT 支持需要安裝軟體包 gptfdisk包。請參考#自動安裝部分。
- FAT 支持需要安裝軟體包 mtools包。

安裝軟體包並不是安裝啟動加載器。在安裝完相關的包後，還需要安裝啟動加載器代碼（到適合的位置，一般是 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、MBR[損壞的連結：無效的章節] 和 GPT 磁碟。

如果您使用分開的啟動分區，請用 `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/cmdline` 和 `mount` 等命令的輸出確認。 可以通過向 `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 分區表上會安裝 `mbr.bin`
- #GPT 分區表上會安裝 `gptmbr.bin`

這些會在下面的內容中詳細描述。

更多信息，請參考 MBR 分區表[損壞的連結：無效的章節]。

提示：如果您不確定您的分區表類型，可以通過 `blkid -s PTTYPE -o value /dev/sda` 來檢查。
注意：對於一個無盤安裝實例，不需要向MBR中安裝Syslinux 引導代碼。您可以跳過這一段，直接跳到#配置部分。更多信息請參考[4]。

##### 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 提供一個替代的分區表 `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 Shell`、`Windows Boot Manager` 等 EFI 應用程式。查看關於此的增強請求：[7]
- 在某些情況下，UEFI Syslinux 可能不能在通過 QEMU/OVMF、VirtualBox 和 VMware 的一些特定產品或版本構建的虛擬機的中啟動。一些如 DUET 等 UEFI 模擬環境中也是如此。Syslinux 的貢獻者已經確認，在 VMware Workstation 10.0.2 版本、Syslinux 6.02 版本以後不會發生這個問題。查看關於此的 Bug 報告：[8], [9] 和 [10]
- Memdisk 不被 UEFI 支持。查看關於此的增強請求：[11]

### 在 UEFI 上安裝

注意：在與 UEFI 有關的命令中，`esp` 指的是 EFI 系統分區(ESP)所掛載的位置。

- 安裝來自官方軟體源的 syslinux包 和 efibootmgr包。然後按如下步驟安裝 Syslinux 到 EFI 系統分區(ESP)：
- 複製 Syslinux 文件到 EFI 系統分區:

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

- 使用 efibootmgr 安裝引導記錄:

    # 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 允許您使用一個文本啟動目錄來選擇。要做到這一點，請將 `menu` 和 `libutil` 模塊複製到您的 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 RESOLUTION`、`MENU HSHIFT $N` 和 `MENU 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 Lock` 或 `Scroll 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` 改成您想要鏈式加載的驅動器。這裡需要使用您磁碟的十六進制標識符，這個例子中是 `0xf00f1fd3`。`syslinux.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.img`。`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 鏡像引導的系統，這可能會被用到。

### 使用內存測試 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

## 更多信息

- 官方網站

分類：​

- 啟動加載程序

隱藏分類：​

- 包含損壞章節連結的頁面

Syslinux
新增話題