Grub-Probe: Fehler: Kanonischer Pfad von / cow konnte nicht abgerufen werden

13

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.

elyashiv
quelle
OK, diese Bearbeitung ist ein Schritt in die richtige Richtung. Sollen wir davon ausgehen, dass Sie bereits ein Linux-System installiert haben? Startet es von sda6? Hilft meine Antwort hier ?
Terdon

Antworten:

10

Folge diesen Schritten:

  1. Starten Sie eine Live Linux-Sitzung.

  2. Hängen Sie die /Partition Ihres installierten Betriebssystems an/mnt

    sudo mount /dev/sda6 /mnt
    
  3. Richten Sie eine chrootUmgebung ein:

    sudo chroot /mnt
    
  4. Sie befinden sich jetzt in einer "gefälschten" Linux-Installation, die /mntals behandelt wird /. Dies bedeutet, dass sich alle für GRUB erforderlichen Dateien dort befinden, /bootwo das System sie erwartet, und Sie GRUB so installieren können, als ob Sie Ihr installiertes System tatsächlich ausführen würden:

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

Starten Sie nun neu und Sie sollten sehen, dass das GRUB-Menü normal angezeigt wird.

terdon
quelle
Ich versuche, vom USB-Gerät zu installieren . Jedenfalls habe ich es auch ohne Montage versucht - gleicher Fehler. Kannst du den Fehler erklären?
Elyashiv
@elyashiv Bitte bearbeiten Sie Ihre Frage und erklären Sie, was Sie versuchen. Versuchen Sie, ein kaputtes System zu retten? Booten Sie ein Live-System vom USB? Wenn ja, sagen Sie es uns . Welches Betriebssystem verwenden Sie? Was lässt Sie denken, dass GRUB eine root-deviceOption hat und was erwarten Sie von dieser Option? Haben Sie eine chrootUmgebung eingerichtet? Wann immer Sie eine Frage stellen, müssen Sie genau erklären, was Sie versuchen, wir können nicht raten.
Terdon
oops, ich meinte -root-directory
elyashiv
@elyashiv gibt es auch nicht --root-directory. Go lesen Sie meine Antwort hier , das erklärt , wie grub neu zu installieren.
Terdon
Schauen Sie sich die erste Antwort hier an
elyashiv
1

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:

$ realpath /cow
$ ls -la /cow

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 /procnicht montiert ist. In einigen Implementierungen von libc /proc/self/fdwird verwendet, um den kanonischen Pfad einer Datei abzurufen.

Sauron
quelle
0

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-installvon Ihrem System aus: http://linux.die.net/man/8/grub-install

Tamarintech
quelle
0

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:

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

Und es enthält diese Einstellungen:

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

Dies funktioniert immer noch nicht bei der Verwendung grub-install /dev/sdaoder update-grubfü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, der grub-probeden kanonischen Pfad nicht finden kann.

Nicht nur das, sondern update-grubwird auch sehen und wissen, was die Betriebssysteme sind, aber interessanterweise grub-installerkennt das Debian-Betriebssystem nicht auf USB.

Beispiel

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#

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!

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:/#

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:

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

Von außerhalb des Containers grub-ubootwohlgemerkt , ich führe diesen Befehl mit installiertem auf Raspbian und keinem Grub auf dem USB aus, der debootstrapped Debian enthält.

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#

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-allauf dem Laufwerk auszuführen .

sgdisk --zap-all /dev/sdd

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.

w3techie
quelle
0

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/sdazum 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

user327540
quelle
Warum redest du, chrootwenn es nicht um "chroot" geht?
G-Man sagt "Reinstate Monica"
Das OP sagt "Laufen von einem USB mit Linux Mint". Das wird eine Chroot sein.
Daira Hopwood