Syslinux
Syslinux是一個啟動加載器集合,可以從硬盤、光盤或通過 PXE 的網絡引導啟動系統。支持的文件系統包括 FAT,ext2,ext3,ext4 和非壓縮單設備 Btrfs 文件系統。
BIOS 系統[編輯 | 編輯原始碼]
啟動流程[編輯 | 編輯原始碼]
- 第一階段 - 第一部分 - 加載MBR 電腦啟動時,BIOS 會先加載磁盤開始的 440 字節 MBR[損壞的鏈接:無效的章節] 啟動代碼 (
/usr/lib/syslinux/bios/mbr.bin
或/usr/lib/syslinux/bios/gptmbr.bin
)。 - 第一階段 - 第二部分 - 尋找活動分區第一階段的MBR啟動代碼會尋找活動分區(設置了可啟動標記的 MBR 分區),此處我們假設是
/boot
分區。 - 第二階段 - 第一部分 - 執行卷啟動記錄程序 MBR 啟動代碼會執行上面找到的
/boot
分區的卷啟動記錄程序(VBR,volume boot record)。對於 Syslinux 來說,VBR 就是由extlinux --install
命令創建的/boot/syslinux/ldlinux.sys
位於開始扇區的部分。請注意ldlinux.sys
和ldlinux.c32
是不同的。 - 第二階段 - 第二部分 - 執行
/boot/syslinux/ldlinux.sys
VBR 會加載ldlinux.sys
剩餘的部分。ldlinux.sys
所處在的扇區位置不可更改,否則 syslinux 無法啟動。注意: 對於 Btrfs 來說,因為文件不斷移動導致ldlinux.sys
扇區的位置不斷變化,上述的方法將不會工作。因此在 Btrfs 中整個ldlinux.sys
文件會直接緊接着嵌入卷啟動記錄程序,而不是像其他文件系統那樣保存在/boot/syslinux/ldlinux.sys
處。 - 第三階段 - 加載
/boot/syslinux/ldlinux.c32
ldlinux.sys
加載剩下的 syslinux 的核心部分/boot/syslinux/ldlinux.c32
(這部分是因為文件大小限制無法放入ldlinux.sys
中的核心模塊)。ldlinux.c32
文件應該在每一個裝有 syslinux 的實例中出現,並且與分區中的ldlinux.sys
版本相匹配,否則 Syslinux 將無法啟動。更多資料請參閱 [2]。 - 第四階段 - 查找並加載配置文件當 syslinux 完全加載完畢,它將自動查找配置文件
/boot/syslinux/syslinux.cfg
(或某些情況下的/boot/syslinux/extlinux.conf
),如果找到即加載。否則會進入 Syslinuxboot:
的命令提示符。這一步和剩下的非核心 Syslinux 部分(除lib*.c32
和ldlinux.c32
的/boot/syslinux/*.c32
模塊) 需要提供/boot/syslinux/lib*.c32
(庫)模塊[3]。同樣,{ic|lib*.c32}} 庫模塊和非核心的*.c32
模塊需要與分區中的ldlinux.sys
版本相匹配。
在 BIOS 上安裝[編輯 | 編輯原始碼]
安裝軟件包並不是安裝啟動加載器。在安裝完相關的包後,還需要安裝啟動加載器代碼(到適合的位置,一般是 VBR)才能啟動系統;接下來的部分對您的特定系統的特性提供了替代的指令。
自動安裝[編輯 | 編輯原始碼]
syslinux-install_update
是 Arch Linux 特有的,並不被 Syslinux 的上游提供/支持。請不要向上游,而是直接向 Arch Bug Tracker 提交關於這個特定腳本的 bug 報告。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
手動安裝[編輯 | 編輯原始碼]
/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 分區表[編輯 | 編輯原始碼]
對於一個安裝在 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 上安裝[編輯 | 編輯原始碼]
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 維基來查看依賴樹。
/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 開始。
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 ...
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
重啟和關機[編輯 | 編輯原始碼]
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 啟動提示符下的參數,您可能想要匹配您的鍵盤布局。這樣您就可以在一個非美式英語鍵盤上方便地輸入"="、"/"等字符了。
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[編輯 | 編輯原始碼]
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" 錯誤提示可能會有很多原因。 其中的一種可能是文件系統工具或者文件系統結構遭到了更改。
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
[編輯 | 編輯原始碼]
問題: 從 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