Pages

Tuesday, 7 May 2024

grub2 或 syslinux 启动失败后

经常升级内核的情况下,偶尔还是会出现一些问题的。

譬如 grub2-mkconfig 的时候,/boot 是单独的分区,且忘记挂载了。

譬如 Gentoo 下 copy 新内核到 /boot 目录的时候,忘记修改配置了,且手快的删除了旧内核。

更甚者,直接忘记 copy 新内核到 /boot 下,就兴冲冲的去修改 Grub2 or Syslinux 的配置去了。- -!

等等。

此时就需要手动在 bootloader 界面去输入了

Grub2

grub> set root=hd0,0
grub> linux /boot/3.14.4-gentoo root=/dev/sda2
grub> boot

hd0,0 修改为自己的 grub2 所在分区。sda2 则为根分区所在的目录,忘记路径的时候可以按 tab 来提示。

Syslinux

syslinux 就相对简单了,直接

boot: LINUX /boot/3.14.4-gento root=/dev/sda2

当然,也要善用 tab

如果你连 Grub2 或 Syslinux的界面也进不去的话,那么恭喜,通过 liveusb 进去 chroot 后,重装这两者之一吧。

Goodluck

------------------------

使用 Syslinux 替换掉 Grub

自从几个月前的工作机的 Grub2 用 Syslinux 替换掉后,今天家用台式机的 Grub2 也替换成 Syslinux 了。主要是因为现在的 Syslinux 配置简单,功能强大,可以引导基于 DOS 的各种工具。

废话不多说,安装:

emerge -av syslinux

说明:

  • SYSLINUX - FAT 文件系统引导
  • EXTLINUX - ext2/3/4 及 btrfs等文件系统引导
  • PXELINUX - Network PXE bootloader
  • ISOLINUX - ISO-9660 (CDROM) bootloader

操作:

对于 /boot 独立分区的用户,需将 /boot 分区设置为 active

fdisk /dev/sda

Command (m for help): a
Partition number (1-4): 1
Command (m for help): p
 ...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      206847      102400    83  Linux
/dev/sda2          206848   122882047    61337600    7   HPFS/NTFS/exFAT
/dev/sda3       122882048   225282047    51200000    83  Linux
/dev/sda4       225282048   250066943    12392448    83  Linux

Command (m for help): w
 ...

写 MBR:

dd bs=440 conv=notrunc count=1 if=/usr/share/syslinux/mbr.bin of=/dev/sda

如果是 GPT,则:

dd bs=440 conv=notrunc count=1 if=/usr/share/syslinux/gptmbr.bin of=/dev/sda

接下来就是引导文件安装,由于我的 /boot 是独立分区,且是 ext2 文件系统,所以我使用的是 extlinux。

mount /boot
mkdir /boot/extlinux
extlinux --install /boot/extlinux
ln -snf . /boot/boot

需要用到的一些模块:

cp /usr/share/syslinux/{menu.c32,memdisk,libcom32.c32,libutil.c32} /boot/extlinux/

如果你有windows linux双系统,则再:

cp /usr/share/syslinux/chain.c32 /boot/extlinux/

各文件系统的配置文件:

  • SYSLINUX: syslinux.cfg
  • EXTLINUX: extlinux.conf
  • ISOLINUX: isolinux.cfg

extlinux.conf 配置如下

touch /boot/extlinux/extlinux.conf

UI menu.c32
PROMPT 0

MENU TITLE Boot Menu
TIMEOUT 50
DEFAULT gentoo

LABEL gentoo
        MENU LABEL Gentoo Linux 3.11.0
        LINUX /boot/3.11.0-gentoo
        APPEND root=/dev/sda3 radeon.audio=1 radeon.dpm=1

LABEL gentoo-old
        MENU LABEL Gentoo Linux 3.10.10
        LINUX /boot/3.10.10-gentoo
        APPEND root=/dev/sda3

APPEND 指的是后面的命令接到上面 LINUX 行的后面,一般一些额外的 kernel 命令放入 APPEND 行。

如果有 windows 系统,则:

LABEL windows
        MENU LABEL Windows 7 Ultimate
        COM32 chain.c32
        APPEND hd0 2

这里我使用的是文本启动菜单,即 UI menu.c32,你也可以使用图形启动菜单 UI vesamenu.c32

具体的用法,可以参考:http://git.kernel.org/cgit/boot/syslinux/syslinux.git/tree/doc/menu.txt

技巧:

  1. 无法删除 ldlinux.sys

    chattr -i /boot/syslinux/ldlinux.sys; rm /boot/syslinux/ldlinux.sys

  2. 启动 Syslinux 出错

    别急,可以按 tab 来编辑你的启动命令,按 ESC 再回车来启动。

  3. 测试新内核

    启动到 Syslinux菜单后,按 tab,输入:

    boot: LINUX /boot/3.11.0-gentoo root=/dev/sda3

参考:

 

 

No comments:

Post a Comment