获取/cow的规范路径失败

我一直在尝试安装Ubuntu 12.10,一步一步地克服了许多困难。现在我遇到了以下情况。
我有一台PC和一个10GB的硬盘,完全用于安装Ubuntu,所以没有Wubi和双启动的选项。
我尝试从DVD安装,但是卡在了“频率超出范围”的错误上。所以我只能选择USB启动选项。但是我的PC不支持USB启动,所以我使用了“Plop Boot Manager”来解决。所以我按照以下步骤进行安装:
1. 从已安装Plop的CD驱动器启动。 2. 在Plop选项中选择USB启动。 3. 从USB开始启动。 4. 显示器最终显示“频率超出范围”的错误。 5. 按下Shift+Alt+F1进入终端。 6. 使用sudo nano /etc/default/grub打开grub。 7. 进行必要的更改。 8. 运行sudo update-grub。 现在我遇到了以下错误:
/usr/sbin/grub-probe:error:failed to get canonical path of /cow.

我的系统是P4 3.06 GHz,1 GB内存,10 GB硬盘,没有操作系统,显示器是7年前的CRT lg StudioWorks。主板是Mercury P4 266a NDMx(相当于865)。整个系统在XP下完全正常工作,但不支持USB启动,其他设备都正常工作。
接下来我该怎么办?

你的电脑是否具备运行Ubuntu所推荐的最低系统要求?我曾经在内存小于1GB的机器上安装12.04时遇到了问题。 - C.S.Cameron
是的,现在我已经在问题中添加了我的系统规格。 - ulkaNCST
这个链接可能值得一试:http://askubuntu.com/questions/207663/cannot-update-grub-with-paramters-on-live-usb。 - Rinzwind
谢谢Rinzwind,我已经尝试过那种方法,但在我的电脑上没有起作用。我真的不知道应该将chroot到哪里?是USB还是硬盘? - ulkaNCST
5首先将您的硬盘挂载到某个文件夹,比如 /mnt,然后使用 chroot 命令切换到 /mnt 目录。 - green
觉得你可能会从这个链接中获得一些好处,因为其他人也遇到了频率超出范围的错误。建议是在看到错误时按下回车键强制Ubuntu启动,然后按照之前链接中提供的说明进行操作。这应该有助于解决问题。 - freecode
有打印错误吗?硬盘大小是10 GB吗?- 你可以简单地用0.01进行乘法来创建自己的新文件系统,但我不知道会发生什么,可能你可以把你的硬盘隐藏起来,或者之后变得极其缓慢。 - dschinn1001
@ulkaNCST - 你住在哪里?! - 硬盘是IDE/EIDE吗?! - dschinn1001
使用下面的链接,这将修复Grub并允许您在Ubuntu和Windows之间进行选择。这样做会更容易,可以搜索一下Ubuntu引导修复。https://www.howtogeek.com/114884/how-to-repair-grub2-when-ubuntu-wont-boot/ - Chin
这篇文章对我很有帮助。https://ubuntuforums.org/showthread.php?t=2036730 - Abhi
7个回答

从Ubuntu的live CD启动后(尝试了14.04和16.04版本),我通过在grub分区中运行chroot命令来解决了这个问题。 (请将下面的/dev/sda1替换为您安装grub的分区。所有命令都要以root用户身份执行。)
mkdir /mnt/chrootdir
mount /dev/sda1 /mnt/chrootdir
for dir in proc dev sys etc bin sbin var usr lib lib64 tmp; do
    mkdir /mnt/chrootdir/$dir && mount --bind /$dir /mnt/chrootdir/$dir
done
chroot /mnt/chrootdir
grub-install /dev/sda # May not be required
update-grub2

2尝试运行挂载命令时出现错误:NTFS 签名丢失。这很奇怪,因为应该是 Ext4,而不是 NTFS... - Cerin
1@Cerin,我强调/dev/sda1对我来说是正确的分区,但如果该卷是NTFS,则显然不适用于您。 - Nathan Kidd
你的解决方案有些令人困惑。你需要在第一个 chroot 中同时运行第一部分和第二部分吗?还是你会放弃第一部分的所有工作,只运行第二部分?为什么要挂载 /dev/sda 和 /dev/sda1 两个设备? - Cerin
/dev/sda是个打字错误,应该是/dev/sda1,抱歉。我已经更新了信息。现在清楚了吗? - Nathan Kidd
4我按照你的指示操作,结果出现了/usr/sbin/grub-probe: error: failed to get canonical path of '/boot'. 我的引导驱动器上只有我的/boot分区,其他部分在别处。 - Sled
1在执行update-grub之前,需要先执行额外的grub-install /dev/sda命令,然后它就可以正常工作了! - kiw
恢复EFI引导时,请注意以下事项:1)确保以EFI模式启动Live CD/USB;2)将上述指令与此处的指令结合起来https://unix.stackexchange.com/questions/379774/grub-installation-failed - 1844144
有人进行了编辑,将boot添加到链接列表中。虽然我可以相信在某些情况下可能需要这样做,但通常情况下,重点是从/dev/sda1中获取boot;你不想要一个不同的boot - Nathan Kidd
你救了我一天!非常感谢你! - automatix
mkdir /mnt/chrootdir/$dir很可能会导致错误,因为这些目录应该已经存在。 - mook765

找到应该启动的驱动器

mount

或者

parted -l

或者

fdisk /dev/sda

按下 p 键列出分区,查找类型为 83 的分区。
(如果你使用的是 Fedora,可能需要使用命令 vgslvs,如果你使用的是 mdraid,可能需要执行 cat /proc/mdstat 或者 mdadm -A --scan 或者 insmod raid1 或者 insmod raid5,然后使用 mdadm -A --scan)你将使用 /dev/md0 或者 /dev/mapper/my-vg 替代 /dev/sda

然后尝试挂载它。
mkdir /mnt
mount /dev/sda1 /mnt
cd /mnt
ls -l

这是你的驱动器吗?太酷了!
grub-install --recheck --root-directory=/mnt /dev/sda 

(或者你的根目录所在的任何/dev驱动器,以及它的挂载路径)
grub-install --recheck --root-directory=/mnt /dev/sda --force

(如果它不喜欢你的分区,就强制执行。)
现在应该启动到grub,然后您可以使用grub命令进行引导,在重新启动并从BIOS设置中选择正确的引导驱动器,或者按下ESCF8F12,具体取决于您的BIOS和您是否足够快,然后在Grub提示符处 - 如果不是(hd0,1)而是(hd1,3)或其他内容,您可以使用tab键补全来查找,但要注意,如果grub无法读取文件系统,tab键补全有时会停顿几秒钟。一旦启动到Grub,您可以尝试使用以下命令进行引导:
insmod linux
ls
root=(hd0,1)
linux /boot/vmlinuz root=/dev/sda1
initrd /boot/initrd
boot

希望你还有一个完整的grub.cfg文件...
ls
ls (hd0,1)/
ls (hd0,1)/boot
configfile (hd0,1)/boot/grub.cfg

Grub 1 允许您通过 Grub 进行安装:
install (hd0,1)

一旦从正确的驱动器启动,您可以重试update-grubgrub-install。如果仍然失败,您可以尝试:
grub-mkconfig -o /mnt/boot/grub/grub.cfg

你的路径可能会有所不同,所以只需尝试这些命令,直到你能看到每个位置和发生的情况。
最坏的情况可能是硬盘即将故障,或者最好的情况可能只是一个被意外覆盖的分区标志或引导文件,或者来自其他操作系统的故意或意外损坏的安装程序。

1它不喜欢我的分区,但 -f 没有起作用。我不得不使用 --force - Reinis Mazeiks
1为了从GRUB引导,我在我的系统上必须修改如下内容:linux /vmlinuz root=/dev/sda1(即根目录) initrd /boot/initrd.img(即添加.img - Warner
仍然出现“cow”错误。使用mkconfig时无法避免这个错误。 - Quidam
你好。安装完grub后,需要运行以下命令来更新它:sudo update-grub /dev/sda - SAdATT
如果出现“/cow”错误,只需使用以下命令创建:sudo mkdir /cow,然后再次尝试。 - SAdATT

基于上述代码的修订解决方案

上述解决方案在没有问题的情况下无法完全工作,因为它将引导分区挂载到文件系统的根目录(/)。这会导致grub抱怨/boot不存在,当然这是有道理的。以下是解决该问题的方法:

mkdir /mnt/chrootdir
mkdir /mnt/chrootdir/boot
mount /dev/sda1 /mnt/chrootdir/boot
for dir in proc dev sys etc bin sbin var usr lib lib64 tmp; do mkdir /mnt/chrootdir/$dir && mount --bind /$dir /mnt/chrootdir/$dir ; done
chroot /mnt/chrootdir
update-grub2  # inside chroot

如你所见,我还删除了换行符,这样对于每个人来说执行起来更容易。
另一个(更简单)的解决方案
如果你一直遇到问题无法使其工作,你应该考虑将/boot分区复制到/(根)分区。为此,请使用Ubuntu Live Boot DVD启动系统并打开终端。在终端中输入以下命令:
sudo su
fdisk -l

要找出你有哪些分区,以我的情况为例,sda1是我的/boot分区,大约250MB大小,还有一个sda5分区,大约500GB。我会在下面的命令中使用这些数值。
mkdir /mnt/boot/
mount /dev/sda1 /mnt/boot/

mkdir /mnt/root/
mount /dev/sda5 /mnt/root/

cp -R /mnt/boot/ /mnt/root/boot/

设置数据分区的可引导标志,并将引导分区的标志移除:
fdisk /dev/sda
b -> 1 (unset the bootable flag for the first partition)
b -> 5 (set the bootable flag for the fifth partition)
w -> write changes to the MBR

你的电脑现在将会查找sda5中的引导文件。是时候再次进行chroot操作了,这次需要一些grub所需的必要文件夹,这些文件夹已经由你的Ubuntu Live光盘生成了。
mkdir /mnt/chrootdir/
mkdir /mnt/chrootdir/dev/
mkdir /mnt/chrootdir/proc/
mkdir /mnt/chrootdir/sys/

mount /dev/sda5 /mnt/chrootdir/
mount --bind /dev/ /mnt/chrootdir/dev/
mount --bind /proc/ /mnt/chrootdir/proc/
mount --bind /sys/ /mnt/chrootdir/sys/

chroot /mnt/chrootdir/

grub-install /dev/sda

安装完成。未报告任何错误。
如果您没有看到生成grub.cnf文件的消息,则还需要运行更新命令:
update-grub2 /dev/sda

现在你可以安全地重新启动,然后再次看到熟悉的启动菜单出现。
这个解决方案是我从物理服务器迁移到虚拟机后唯一有效的方法。希望对其他人有所帮助!

/usr/sbin/grub-mkconfig: 252: /usr/sbin/grub-mkconfig: 无法创建/boot/grub/grub.cfg.new:目录不存在 - Quidam
第二个解决方案:root@ubuntu:/# mkdir /mnt/boot/ 无法创建“/mnt/boot/”:没有此类型的文件或文件夹(这不是英文,所以只是粗略翻译)。 - Quidam
可能是因为你没有安装 grub 作为引导加载程序,所以在那个位置你就没有那些文件。关于你的另一个评论:如果你没有 /mnt 文件夹,那就创建一个。它只需要是一个你可以(滥用地)挂载磁盘的文件夹即可。 - Tim B.
@Quidam 首先使用 mkdir /mnt 命令创建 /mnt 目录... 或者使用 mkdir -p /mnt/boot/ 命令自动创建... 如果还是不行,尝试使用 mkdir /tmp 命令... 你可以将它放在任何地方,或者使用一个未使用的现有文件夹。 - Dagelf

遇到了相同的错误。唯一的问题是/cow仍然挂载在/上。

使用sudo umount /cow就解决了问题。


5我收到了umount: /: target is busy.的错误信息,因为/cow被挂载在/上。 - krubo

我知道,这是一个老问题,但今天我在最新版本的mint-linux(基于ubuntu)上遇到了同样的麻烦。我找到了一个非常简单的解决方案!:-) 在第一次安装期间断开互联网连接。这样可以阻止加载不兼容的grub2。在安装完成后进行所有更新。

听起来有点糟糕。希望这不再是一个现在的问题。 - MarkHu

我尝试了所有的解决方案,但仍然无法修复。对我有用的方法是安装Windows 10(它会创建EFI分区),然后删除除EFI以外的所有Windows分区,再安装Linux。这次Linux将成功并自动配置grub。

这不是一个可能的答案,因为这是一个10年前的问题,那个版本的Windows甚至都不存在。 - David
@David,我看到了这篇帖子,因为上周我在一台11年的戴尔Optiplex上安装Linux时遇到了同样的错误。我花了大约4个小时尝试不同的解决方案,因为常规的Linux安装无法安装grub,而grub-install命令一直失败。只有当Windows安装程序创建EFI分区时,我才成功让它工作。当我在Linux安装程序中手动创建时,它就不能正常工作。 - Liubomyr Kushnir

使用光盘时,update-grub 命令会出现错误。我在进行 GRUB 救援时遇到了类似的情况。此外,由于某些原因,grub-install 不在我的路径中,所以我必须使用 /usr/sbin/grub-install 运行它。

grub-install 接受 --boot-directory 选项,可以设置 GRUB 引导到与当前运行系统不同的系统。这是相关的手册页面。


不,你必须把硬盘挂载并切换到其中,就像 @green7 说的那样。 - psusi
我的方法也有效。试一试吧,它更简单。 - aveemashfaq
1你没有一个方法。/usr/sbin已经在路径上了,所以不需要cd到那里。你不能直接从live cd运行grub-install和update-grub(正如你所指出的),因为它试图设置grub来引导当前系统,而这个系统是live cd,而不是安装在硬盘上的操作系统。 - psusi
当然,这行不通。你会得到“无法获取/cow的规范路径”错误。还有关于切换到/usr/sbin目录的事情...哎呀。 - dan3
尝试一下吧,人们。这对我来说一直都有效。 - aveemashfaq
1grub-install 命令接受 --boot-directory 选项,用于设置 GRUB 引导到与当前运行的系统不同的系统。 (不幸的是,此答案未说明如何使用该选项。) - Eliah Kagan