Ich versuche, grub von einem USB-Laufwerk neu zu installieren. Ich führe folgendes aus:
sudo mount /dev/sda6 /mnt
sudo grub-install --root-directory=/mnt /dev/sda
Ich erhalte folgenden Fehler:
grub-probe: error: failed to get canonical path of /cow.
Kann jemand den Fehler erklären und wie man ihn löst?
Bearbeiten
Ich versuche, ein kaputtes Dual-Boot-System zu reparieren, das von einem USB-Stick mit Linux Mint ausgeführt wird.
sda6
? Hilft meine Antwort hier ?Antworten:
Folge diesen Schritten:
Starten Sie eine Live Linux-Sitzung.
Hängen Sie die
/
Partition Ihres installierten Betriebssystems an/mnt
Richten Sie eine
chroot
Umgebung ein:Sie befinden sich jetzt in einer "gefälschten" Linux-Installation, die
/mnt
als behandelt wird/
. Dies bedeutet, dass sich alle für GRUB erforderlichen Dateien dort befinden,/boot
wo das System sie erwartet, und Sie GRUB so installieren können, als ob Sie Ihr installiertes System tatsächlich ausführen würden:Starten Sie nun neu und Sie sollten sehen, dass das GRUB-Menü normal angezeigt wird.
quelle
root-device
Option hat und was erwarten Sie von dieser Option? Haben Sie einechroot
Umgebung eingerichtet? Wann immer Sie eine Frage stellen, müssen Sie genau erklären, was Sie versuchen, wir können nicht raten.--root-directory
. Go lesen Sie meine Antwort hier , das erklärt , wie grub neu zu installieren.Wenn grub sagt, dass es den kanonischen Pfad von etwas nicht auflösen konnte, bedeutet dies, dass es nicht existiert oder
realpath()
fehlgeschlagen ist.Versuchen Sie in diesem Fall:
Wenn beide Befehle "Datei oder Verzeichnis können nicht gefunden werden" anzeigen, müssen Sie eine erstellen.
Wenn der zweite Befehl funktioniert, der erste jedoch nicht, überprüfen Sie, warum er
realpath()
nicht funktioniert. Einer der Gründe kann sein, dass/proc
nicht montiert ist. In einigen Implementierungen von libc/proc/self/fd
wird verwendet, um den kanonischen Pfad einer Datei abzurufen.quelle
Basierend auf dem, was geschrieben wurde, sieht es so aus, als würden Sie versuchen, GRUB in / dev / sda zu installieren. Sie möchten die Festplatte nicht mounten.
Sie suchen wahrscheinlich:
grub-install /dev/sda
GRUB-Manpage als Referenz, oder Sie können
man grub-install
von Ihrem System aus: http://linux.die.net/man/8/grub-installquelle
Ich bekomme diesen Fehler auch und ich glaube nicht, dass er in einer Chroot passiert.
Hintergrund
Ich denke, dies ist, wenn systemd den Pfad nicht finden kann, weil er in einem Verzeichnis gemountet ist. Der Unterschied besteht also darin, dass Sie beim Einrichten einer Chroot bereits den Zugriff auf Hardware, einschließlich Laufwerke, konfigurieren.
Obwohl Sie diesen Zugriff in Systemd konfigurieren können, bedeutet dies nicht, dass Sie die Berechtigungen für diese Laufwerke auf dieselbe Weise konfigurieren können.
Zum Beispiel habe ich diese Datei erstellt:
Und es enthält diese Einstellungen:
Dies funktioniert immer noch nicht bei der Verwendung
grub-install /dev/sda
oderupdate-grub
für ein USB - auf Pi debootstrapped mit Debian Stretch. Selbst bei Verwendung von grub-uboot und grub-efi-arm gibt es immer noch diesen Fehler, dergrub-probe
den kanonischen Pfad nicht finden kann.Nicht nur das, sondern
update-grub
wird auch sehen und wissen, was die Betriebssysteme sind, aber interessanterweisegrub-install
erkennt das Debian-Betriebssystem nicht auf USB.Beispiel
Interessant, wenn ich eine Chroot erstelle und ausführen kann
update-grub
, obwohl ich auf dem Betriebssystem bin, das ich auf den USB-Stick debootstrapped habe, sieht es kein eigenes Betriebssystem!Es sieht nur Raspbian. Dies geschieht nur, wenn versucht wird, GRUB im Container zu installieren und zu aktualisieren, aber wenn ich die Chroot beende.
Sehen Sie, wie es jetzt funktioniert, weil ich die Chroot-Verzeichnisse nicht ausgehängt habe:
Von außerhalb des Containers
grub-uboot
wohlgemerkt , ich führe diesen Befehl mit installiertem auf Raspbian und keinem Grub auf dem USB aus, der debootstrapped Debian enthält.Dies geschieht nicht mit einem der inoffiziell verfügbaren Images für Debian ARM , aber dies ist offensichtlich immer noch eine Anpassung, die für das Debootstrapping noch nicht verfügbar ist.
Fehlerbehebung
Es gibt wirklich Zeiten, in denen es besser ist, nur einen Pfad zu erstellen. Die einzige nächste Möglichkeit (und eine wahrscheinliche) besteht darin, einfach GRUB zu schreiben. Und dafür werde ich nur auf dieser Seite lesen.
https://www.dedoimedo.com/computers/grub-2.html
Eine andere Sache, die ich über dieses Problem mitteilen möchte, ist eine Lösung, die möglicherweise funktioniert, aber erkennt, dass microSD-Karten sehr empfindlich sind. Ich habe meine eigenen Linux-Images erstellt und dies schnell gelernt. Verwenden Sie am besten Qemu, wann immer Sie können. Um jedoch zu versuchen, eine alte Partitionstabelle zu löschen, können Sie versuchen, sie
sgdisk --zap-all
auf dem Laufwerk auszuführen .In der Tat, manchmal, wenn es das erste Mal einen Fehler gibt und es kein schreibgeschützter Fehler ist, können Sie es erneut ausführen und es werden schließlich alle Partitionstabellen neu oder alt.
Mit Qemu können Sie Raspberry Pi auf einem Standard-AMD / Intel-basierten PC emulieren . Ich würde es empfehlen. Ich weiß, dass dies mehr Informationen sind als der ursprüngliche Beitrag, aber ich denke, dass dieser Fehler wahrscheinlich so abgeleitet wird. Es ist das Containerzeitalter.
quelle
Für alle, die damit zu kämpfen haben und versuchen, einen Live-USB oder andere Chroot-Methoden zu verwenden, um grub neu zu installieren oder zu installieren - ich habe mich ein paar Mal damit befasst und vergessen, es vorher zu dokumentieren, obwohl ich es beabsichtigt hatte.
Das Problem, mit dem Sie konfrontiert sind, ist, dass grub keinen Zugriff auf den Pfad hat, den Sie entweder als Quelle (/ boot) oder als Ziel (können Ihr System und chroot
/dev/sda
zum Beispiel sehen?) Oder beides haben. Wenn Sie sich auf das Chroot vorbereiten, erstellen Sie Bindungs-Mounts, auf die in der Chroot-Umgebung zugegriffen werden kann, oder Sie tun dies innerhalb der Chroot mit mount -t. Es gibt so viele Online-Anleitungen, die dies so oder so tun.Sie müssen sicherstellen, dass Sie / dev oder nur die spezifischen Partitionen binden, die die Startdateien in / boot enthalten (z. B. / dev / sda1). / boot ist entweder eine separate Partition oder ein Verzeichnis in / Die Chroot benötigt Zugriff auf das Laufwerk, auf dem Sie grub (neu) installieren. Führen Sie daher fdisk -l in der Chroot aus, um sicherzustellen, dass das in der Ausgabe aufgeführte Gerät angezeigt wird. Beachten Sie auch, dass Sie nur die Partition bereitstellen müssen, die root enthält, wenn Sie keine separate Boot-Partition haben, aber ein Boot-Verzeichnis in / root mit den Boot-Dateien (nicht nur ein Mount-Punkt). Sie müssen dann nichts an / root / boot mounten.
Sie müssen auch sicherstellen, dass Sie das proc-Dateisystem und das sys-Dateisystem binden, aber jede Anleitung, die ich gesehen habe, hat diese beiden. Ich habe gerade gesehen / Entwickler manchmal verpasst. Es kann Fälle geben, in denen Sie es nicht benötigen, aber ich kenne sie nicht.
tl; dr: Stellen Sie sicher, dass Sie mount / dev binden
quelle
chroot
wenn es nicht um "chroot" geht?