Syslinux

出自 Arch Linux 中文维基

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

在 BIOS 上安裝[編輯 | 編輯原始碼]

安裝軟體包 syslinux

注意:

安裝軟體包並不是安裝啟動加載器。在安裝完相關的包後,還需要安裝啟動加載器代碼(到適合的位置,一般是 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/cmdlinemount 等命令的輸出確認。 可以通過向 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 分區表[損壞的連結:無效的章節]

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

對於一個安裝在 MBR 分區表[損壞的連結:無效的章節]上的實例,請確保您的啟動分區已經被標記為活動分區(有啟動標誌)。您可以用 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 提供一個替代的分區表 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 ShellWindows Boot Manager 等 EFI 應用程式。查看關於此的增強請求:[7]
  • 在某些情況下,UEFI Syslinux 可能不能在通過 QEMU/OVMF、VirtualBoxVMware 的一些特定產品或版本構建的虛擬機的中啟動。一些如 DUET 等 UEFI 模擬環境中也是如此。Syslinux 的貢獻者已經確認,在 VMware Workstation 10.0.2 版本、Syslinux 6.02 版本以後不會發生這個問題。查看關於此的 Bug 報告:[8], [9][10]
  • Memdisk 不被 UEFI 支持。查看關於此的增強請求:[11]

在 UEFI 上安裝[編輯 | 編輯原始碼]

注意: 在與 UEFI 有關的命令中,esp 指的是 EFI 系統分區(ESP)所掛載的位置。
  • 安裝來自官方軟體源syslinuxefibootmgr。然後按如下步驟安裝 Syslinux 到 EFI 系統分區(ESP):
  • 複製 Syslinux 文件到 EFI 系統分區:
# mkdir -p esp/EFI/syslinux
# cp -r /usr/lib/syslinux/efi64/* esp/EFI/syslinux
# 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 允許您使用一個文本啟動目錄來選擇。要做到這一點,請將 menulibutil 模塊複製到您的 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 RESOLUTIONMENU HSHIFT $NMENU 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 LockScroll 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 改成您想要鏈式加載的驅動器。這裡需要使用您磁碟的十六進位標識符,這個例子中是 0xf00f1fd3syslinux.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.imglnxboot.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

更多信息[編輯 | 編輯原始碼]