使用 Grub2 从外部硬盘启动 Ubuntu 时出现问题

使用 Grub2 从外部硬盘启动 Ubuntu 时出现问题

我在外部硬盘上安装了 Ubuntu,但它无法在笔记本电脑上启动。我该怎么办?

我读了一些资料,并将问题的根源追溯到 Grub2。显然,Grub2 不使用设备的 UUID,而是使用 linux 目录 (/dev/sdf2)。这意味着,每当我将 E-HDD 插入连接了不同数量驱动器的系统时,如果不编辑启动命令,我将无法启动。我不太明白,但这就是我从阅读中得到的。

有没有什么办法解决这一问题?

这是我的 grub 配置(经过修剪以显示示例内核条目)。我不知道为什么它不使用 UUID。我一次也没有调整过它...

### BEGIN /etc/grub.d/10_linux ###
menuentry "Ubuntu, Linux 2.6.31-20-generic" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
    set quiet=1
    linux   /boot/vmlinuz-2.6.31-20-generic root=/dev/sdc2 ro   quiet splash
    initrd  /boot/initrd.img-2.6.31-20-generic
}
menuentry "Ubuntu, Linux 2.6.31-20-generic (recovery mode)" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
    linux   /boot/vmlinuz-2.6.31-20-generic root=/dev/sdc2 ro single 
    initrd  /boot/initrd.img-2.6.31-20-generic
}

答案1

问题是我的 device.map 配置不正确,导致 grub 使用 ubuntu 名称,例如 sdf2,而不是硬盘的 UUID。解决方法是更新 device.map,然后更新 grub2。我认为,这是通过运行“drivemap”,然后运行 ​​update-grub 来完成的。我不太确定更新 device.map 的命令,因为我大约一周前这样做过,但没错。这只是以防有人遇到我的问题。

答案2

好的,你是对的,这并不是在抓取 UUID,这让我感到很奇怪。

内核入口如下应该看(这是来自我的 Ubuntu 9.10 VM,稍微调整了一下但应该是相当原始的):

menuentry "Ubuntu, Linux 2.6.31-20-generic" {
    recordfail=1
    if [ -n ${have_grubenv} ]; then save_env recordfail; fi
    set quiet=1
    insmod ext2
    set root=(hd0,1)
    search --no-floppy --fs-uuid --set b22c7fe9-4354-40bf-b9bf-87a469289f6e
    linux /boot/vmlinuz-2.6.31-20-generic root=UUID=b22c7fe9-4354-40bf-b9bf-87a469289f6e ro
    initrd        /boot/initrd.img-2.6.31-20-generic
}

/boot/grub/grub.cfg当某些程序运行时会生成文件更新 grub来自脚本/etc/grub.d和文件中的变量/etc/默认/grub


  • 现在,默认文件中有一个变量,GRUB_DISABLE_LINUX_UUID,如果设置为真的将给予根= / dev / sdXY价值Linux的内核行(而不是根=UUID=...值)。我不认为这是你的问题,但检查一下你的/etc/默认/grub文件以确保无误。您应该看到以下几行(#行首的 表示该行已被注释掉):

    # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
    #GRUB_DISABLE_LINUX_UUID=true
    

    如果你看到GRUB_DISABLE_LINUX_UUID没有#开头的,插入它,保存文件,然后运行sudo update-grub重新生成grub配置文件.然后检查grub配置文件再次查看是否正确。


  • 如果默认文件看起来没问题,接下来检查驱动器的 UUID 本身。驱动器 UUID 可能设置不正确,或者无法正确检测到。 uDev负责在设备树中为磁盘 UUID 创建符号链接;检查它们:

    $ ls -l /dev/disk/by-uuid
    total 0
    lrwxrwxrwx 1 root root 10 2010-04-18 04:15 b22c7fe9-4354-40bf-b9bf-87a469289f6e -> ../../sda1
    lrwxrwxrwx 1 root root 10 2010-04-18 04:15 e1c64ac1-186d-4c15-8833-6072ac6421df -> ../../sda5
    

    如果这没有显示你期望看到的分区,你可能需要直接使用以下命令检查文件系统tune2fs手册页) (代替/dev/sda1使用正确的设备名称):

    $ sudo tune2fs -l /dev/sda1 | grep UUID
    Filesystem UUID:          b22c7fe9-4354-40bf-b9bf-87a469289f6e
    

    如果缺失,您可以使用以下方式重新创建:

    $ sudo tune2fs -U random /dev/sda1
    

    现在重新检查tune2fs-l 复制代码输出,然后检查/dev/磁盘/by-uuid再次。您可能需要重新启动,uDev 才能获取更改。更新 grub脚本现在应该可以获取 UUID,因此重新运行它并检查新的grub配置文件看看是否正确。


  • 如果以上这些都不是问题,你可能需要再深入挖掘一下。让我们来检查一下我们的假设:
    • 您的启动驱动器是如何分区的?(fdisk -l
    • 您的启动驱动器是如何格式化的?(ext2/3/4?FAT32?NTFS?)
    • 你是通过 Wubi 安装的吗?

相关内容