使用 grub 从外部备份驱动器正确启动

使用 grub 从外部备份驱动器正确启动

编辑:我想我解决了我自己的问题 - 有关详细信息,请参阅问题底部

/我在外部 USB 连接硬盘上有所有文件的副本。为了测试此备份是否有效,我尝试从它启动。然而,事实证明这比我预期的要困难一些。

  1. 在我假设的 BIOS 中,我选择外部 HD 作为启动设备。但是,无论我选择此设备还是我常用的驱动器作为引导设备,都会显示相同的 GRUB 菜单。无论我是否手动在外部硬盘上安装 GRUB,都会发生这种情况。所以我的问题是,GRUB 是从我的正常启动驱动器还是从外部驱动器加载,这有关系吗?

    • 我发现在外部驱动器上未安装 GRUB 的情况下使用 GRUB 命令行时,外部驱动器显示为(hd2,gpt1),但是在外部驱动器上安装 GRUB 后,它显示为(hd0,gpt2)
  2. 也许我遇到的困难与我的第一个问题有关,但是当我在指定后启动时,我总是会遇到一些与指定为未找到的linux /boot/vmlinuz-linux root=/dev/sda2驱动器相关的故障。root即使我通过设备 uuid 指定 root,也会发生这种情况。我的问题是,我需要担心

    • /etc/fstab?为了确保找到根目录,我是否需要更改此内容?我更改/etc/fstab内部驱动器上的文件还是外部驱动器上的文件有关系吗?(我确实在外部驱动器上进行了修改/etc/fstab,以便将具有根分区UUID的驱动器挂载到/,但没有效果)

    • 也许因为它是一个USB连接的外部硬盘,我需要做一些特别的事情吗?我注意到正常启动时出现错误usb 2-4: device descriptor read/64, error -71,但由于这对驱动器的功能没有明显影响,因此我忽略了它。此错误也出现在两个独立的外部高清坞站上,因此我认为这不是硬件问题。


澄清:

我使用以下命令创建了外部备份博格,这会创建所有文件的副本。它不会像 那样复制整个磁盘dd,因此例如在安装 grub 时我仍然需要手动创建带有该bios_grub标志的分区。

我在尝试引导时在 grub 中使用的确切命令是

set root=(hd0,gpt2)
linux vmlinuz-linux root=/dev/sda2
initrd  initramfs-linux.img
boot

我已经成功启动了。

我已经尝试了这两种方法linux /boot/vmlinuz-linux root=/dev/sda2,但linux /boot/vmlinuz-linux root=/dev/sdc2都无济于事——第一个是因为驱动器在 grub 中显示(hd0,gpt2),第二个是因为分区被标记为/dev/sdc2我正常启动时的状态。然而,这些都不起作用,并且都让我进入了一个奇怪的命令行。我发现/dev/sdb2由于某种原因实际上安装了具有正确 UUID 的分区!使用root=/dev/sdb2我很好地启动了系统。我认为我之前通过指定 UUID 进行引导的尝试由于多种原因之一而失败(未安装 GRUB、UUID 中的拼写错误等)。

这实在是太虎头蛇尾了。我仍然对我最初的问题感到好奇——即,1.当有多个驱动器安装了GRUB时,如何决定使用哪个GRUB?2.在启动过程中确实/etc/fstab起作用,还是无关紧要? ——我将悬赏回答这些问题。

答案1

你的问题是因为那是通过它root=/dev/sda2进行安装device name不独特。如果您只安装了一个驱动器,那么通常总是显示为/dev/sda没有问题。但是安装第二个磁盘或任何其他显示的东西,因为/dev/sd?这样就不能保证任何东西的顺序,而且通常被sda移动到的东西sdb......可能会很快变得混乱并失败。

最好通过安装通过设备 ID或者按-uuid这将是独一无二的。

在下面/dev/disk/你会看到类似的文件夹

  • 按 ID/
  • 按标签/
  • 旁路/
  • 通过-uuid/

例如,在下面by-id/您将看到诸如以下的链接

这是我的/etc/fstab安装座,by device-id可以给您一个想法,我删除了多余的线条以保持其正确性。我使用 EFI 而不是 GRUB,但原理是一样的,只是用 Grub 更详细{grub 统一引导加载程序中的重要部分}:

/dev/disk/by-id/scsi-35000cca070168a20-part2                    /           ext3    acl,user_xattr 1 1
/dev/disk/by-id/scsi-35000cca070168a20-part1                    /boot/efi   vfat    umask=0002,utf8=true 0 0
/dev/disk/by-id/scsi-36003048018e26e011d81ba1714e4c99f-part1    /data       xfs     defaults 1 0
/dev/disk/by-id/scsi-36003048018fa44011d57b61bbe1b8533-part1    /scratch    xfs     defaults 1 0
/dev/disk/by-id/scsi-36003048018e266011d81ba7e1afeadf6-part1    /bkup       xfs        defaults              1 2

注意:这是我在 SLES 11.4 中看到的。当我使用EFI时,您需要找到GRUB或GRUB2中的特定项并进行修改。作为示例,这里是我的/boot/efi/efi/SuSE/elilo.conf文件,请注意该root=部分。您想要将 GRUB 中与此相对应的内容修改为by device-idby uuid。并且不要忘记/etc/fstab通过唯一方法修改为by-idby-uuid

# This file has been transformed by /sbin/elilo.
# Please do NOT edit here -- edit /etc/elilo.conf instead!
# Otherwise your changes will be lost e.g. during kernel-update.
#
# Modified by YaST2. Last modification on Mon Oct 15 11:04:42 EDT 2018
timeout = 80
##YaST - boot_efilabel = "SUSE Linux Enterprise Server 11 SP4"
default = SLES11_SP4_16
prompt

image = vmlinuz-3.0.101-108.77-default
###Don't change this comment - YaST2 identifier: Original name: linux###
    label = SLES11_SP4_16
    append = "splash=verbose showopts                 "
    initrd = initrd-3.0.101-108.77-default
    root = /dev/disk/by-id/scsi-35000cca070168a20-part2

image = vmlinuz-3.0.101-108.77-default
###Don't change this comment - YaST2 identifier: Original name: failsafe###
    label = Failsafe_15
    append = "showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 nomodeset x11failsafe                  "
    description = "Failsafe (3.0.101-108.77-default)"
    initrd = initrd-3.0.101-108.77-default
    root = /dev/disk/by-id/scsi-35000cca070168a20-part2

你不想要boot=/dev/sd?root=/dev/sd?任何地方,?无论字母在哪里。从/dev/disk/by-id或中引用磁盘/dev/disk/by-uuidby-label如果您设置分区标签并相信它们是唯一的,您甚至可以使用。

答案2

这应该可以回答您的问题:

  • 通常,所使用的 GRUB 是 BIOS 最先看到的磁盘上的GRUB 或在 BIOS 中选择首先运行的GRUB。因为驱动器的 MBR 指向加载的 GRUB。

  • /etc/fstab 只负责自动执行挂载、分区过程。在窗帘情况下,您可以完全绕过 fstab。

相关内容