我正在尝试从 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
按着这些次序:
启动进入 Live Linux 会话。
/
将已安装操作系统的分区挂载到/mnt
sudo mount /dev/sda6 /mnt
设置
chroot
环境:sudo chroot /mnt
您现在处于一个“假”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