grub-probe:错误:无法获取 /cow 的规范路径

grub-probe:错误:无法获取 /cow 的规范路径

我正在尝试从 USB 驱动器重新安装 grub。我运行以下命令:

sudo mount /dev/sda6 /mnt
sudo grub-install --root-directory=/mnt /dev/sda

我收到以下错误:

grub-probe: error: failed to get canonical path of /cow.

有人可以解释这个错误以及如何解决它吗?

编辑

我正在尝试修复损坏的双引导系统,该系统从包含 linux mint 的 USB 运行。

答案1

按着这些次序:

  1. 启动进入 Live Linux 会话。

  2. /将已安装操作系统的分区挂载到/mnt

    sudo mount /dev/sda6 /mnt
    
  3. 设置chroot环境:

    sudo chroot /mnt
    
  4. 您现在处于一个“假”Linux 安装中,它被/mnt视为/.这意味着 GRUB 所需的所有文件都位于/boot系统期望的位置,您可以像实际运行已安装的系统一样安装 GRUB:

    sudo update-grub
    sudo grub-install /dev/sda
    

现在重新启动,您应该会看到 GRUB 菜单正常显示。

答案2

为我

sudo touch /cow

解决了问题。

答案3

我也遇到这个错误,而且我认为它不会发生在 chroot 中。

背景

我认为这是 systemd 找不到路径的原因,因为它安装在目录中。因此,不同之处在于,当您设置 chroot 时,您已经配置了对硬件(包括驱动器)的访问。

尽管您可以在 Systemd 内部配置此访问权限,但这并不意味着您可以以相同的方式配置这些驱动器的权限。

例如,我创建了这个文件:

/etc/systemd/system/[email protected]/override.conf

它包含以下设置:

[Service]
DeviceAllow=char-usb_device rwm
DeviceAllow=char-usb
[Files]
Bind=/var/cache/apt/pkgcache.bin
Bind=/var/cache/apt/srcpkgcache.bin

grub-install /dev/sda当使用或update-grub用于通过 Debian Stretch 取消引导的 Pi 上的 USB 时,这仍然不起作用。即使使用 grub-uboot 和 grub-efi-arm 仍然存在grub-probe找不到规范路径的错误。

不仅如此,虽然update-grub会看到并知道操作系统是什么,但有趣的是,它grub-install无法识别 USB 上的 Debian 操作系统。

例子

root@raspixmc:/home/pi# grub-install /dev/sda
Installing for arm-uboot platform.
grub-install: warning: no hints available for your platform. Expect 
reduced performance.
grub-install: warning: WARNING: no platform-specific install was 
performed.
Installation finished. No error reported.
root@raspixmc:/home/pi#

有趣的是,当我创建一个 chroot 并可以运行时update-grub,即使我使用的是我从 USB 本身启动的操作系统,它也看不到自己的操作系统!

root@raspixmc:/home/pi# mount /dev/sda1 /mnt
root@raspixmc:/home/pi# cd /mnt
root@raspixmc:/mnt# mount --bind /dev dev/
root@raspixmc:/mnt# mount --bind /sys sys/
root@raspixmc:/mnt# mount --bind /proc proc/
root@raspixmc:/mnt# mount --bind /dev/pts dev/pts
root@raspixmc:/mnt# chroot . bin/bash
root@raspixmc:/# update-grub
Generating grub configuration file ...
Found Raspbian GNU/Linux 9 (stretch) on /dev/mmcblk0p2
done
root@raspixmc:/#

它只能看到 Raspbian。仅当尝试在容器内安装和更新 GRUB 时,但当我退出 chroot 时,才会发生这种情况。

观察它现在如何工作,因为我没有卸载 chroot 目录:

/dev dev/
/sys sys/
/proc proc/
/dev/pts dev/pts

请注意,我在容器外部运行此命令,并且grub-uboot安装在 Raspbian 上,并且包含已启动 Debian 的 USB 上没有 Grub。

root@raspixmc:/mnt# update-grub
Generating grub configuration file ...
Found Raspbian GNU/Linux 9 (stretch) on /dev/mmcblk0p2
Found Debian GNU/Linux 9 (stretch) on /dev/sda1
done
root@raspixmc:/mnt#

使用其中之一不会发生这种情况Debian ARM 的非官方可用镜像,但显然这仍然是一个尚未可用于 debootstrapping 的自定义。

故障排除

确实,有时候创建一条路径会更好。唯一的下一种可能性(也是可能的一种)是简单地编写 GRUB。为此,我将阅读此页。

https://www.dedoimedo.com/computers/grub-2.html

关于这个问题,我想分享的另一件事是一个可能有效的解决方案,但要意识到 microSD 卡非常敏感。我一直在构建自己的 Linux 镜像并且学得很快。最好的办法是尽可能使用 Qemu,但要尝试清除旧分区表,您可以尝试sgdisk --zap-all在驱动器上运行。

sgdisk --zap-all /dev/sdd

事实上,有时如果第一次出现错误并且是不是只读错误,您可以再次运行它,它最终将所有新的或旧的分区表。

你可以使用Qemu模拟Raspberry Pi在基于 AMD/Intel 的标准 PC 上。我会推荐它。我知道这比原始帖子的信息更多,但我认为这很可能是产生此错误的原因。现在是容器时代。

答案4

对于那些正在尝试使用实时 USB 或其他 chroot 方式重新安装或安装 grub 的人来说,我已经处理过这个问题好几次了,但之前忘记记录它,尽管我打算这样做。

您面临的问题是 grub 无法访问您所指的源路径 (/boot) 或目标路径(/dev/sda例如,您的系统和 chroot 可以看到吗?)或两者。当您准备 chroot 时,您将创建可在 chroot 环境中访问的绑定安装,或者使用 mount -t 在 chroot 中执行此操作。网上有很多指南可以采用任何一种方法。

您需要确保绑定/dev 或仅绑定/boot 中包含引导文件的特定分区(例如/dev/sda1)。 /boot 是一个单独的分区或 / 中的目录 chroot 需要访问您将(重新)安装 grub 的驱动器,因此请在 chroot 中执行 fdisk -l 以确保您可以看到输出中列出的设备。另请注意,如果您没有单独的引导分区,但 /root 中确实有一个包含引导文件的引导目录(而不仅仅是挂载点),那么您只需挂载包含 root 的分区。然后您就不必将任何内容安装到/root/boot。

You also need to make sure you bind the proc fileystem and the sys filesystem, but every guide I've seen has those two. I've just seen /dev missed out sometimes. There might be some cases when you don't need it, but I don't know of them.

tl;dr:确保绑定挂载 /dev

相关内容