web-dev-qa-db-ja.com

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ミントを含むUSBから実行されている、壊れたデュアルブートシステムを修復しようとしています。

15
elyashiv

次の手順を実行します:

  1. ライブLinuxセッションを起動します。

  2. インストールしたOSの/パーティションを/mntにマウントします

    Sudo mount /dev/sda6 /mnt
    
  3. chroot環境をセットアップします。

    Sudo chroot /mnt
    
  4. これで、/mnt/として扱う「偽の」Linuxインストールが開始されました。これは、GRUBに必要なすべてのファイルが/bootにあり、システムがそれらを想定しているため、GRUBインストールされたシステムを実際に実行していた:

    Sudo update-grub
    Sudo grub-install /dev/sda
    

再起動すると、GRUBメニューが正常に表示されるはずです。

10
terdon

何かの正規パスを解決できなかったとgrubが言った場合、それは存在しないかrealpath()が失敗したことを意味します。

この場合、次のことを試してください。

_$ realpath /cow
$ ls -la /cow
_

両方のコマンドで「ファイルまたはディレクトリが見つかりません」と表示された場合は、作成する必要があります。

2番目のコマンドが機能しても最初のコマンドが機能しない場合は、realpath()が機能しない理由を確認してください。理由の1つは、_/proc_がマウントされていないことです。 libcの一部の実装では、_/proc/self/fd_を使用してファイルの正規パスを取得します。

1
Sauron

ライブUSBまたはその他の手段でchrootを使用してgrubを再インストールまたはインストールしようとしている、これに苦労している人のために-私はこれに何度か対処し、意図的にドキュメント化するのを忘れていました。

あなたが直面している問題は、grubがソース(/ boot)または宛先(システムとchrootは/dev/sdaを参照できますか?)またはその両方として参照しているパスにアクセスできないことです。 chrootを準備するときは、chroot環境でアクセス可能なバインドマウントを作成するか、mount -tを使用してchroot内で作成します。オンラインには、どちらの方法でも実行できるガイドがたくさんあります。

/ devをバインドするか、/ bootにブートファイルを含む特定のパーティションのみを確認する必要があります(例:/ dev/sda1)。/bootは別のパーティションまたは/のディレクトリです。chrootは、grubを(再)インストールするドライブにアクセスする必要があるため、chrootでfdisk -lを実行して、出力にデバイスが表示されていることを確認します。また、個別のブートパーティションはなく、/ rootにブートファイル(マウントポイントだけでなく)を含むブートディレクトリがある場合は、ルートを含むパーティションをマウントするだけで済みます。その後、/ root/bootに何もマウントする必要はありません。

また、procファイルシステムとsysファイルシステムを確実にバインドする必要がありますが、私が見たすべてのガイドには、これら2つがあります。/devが見逃されているのを見たことがあります。必要ない場合もあるかもしれませんが、わかりません。

tl; dr:必ずマウント/ devをバインドしてください

0
user327540

私もこのエラーを受け取り、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

Debian StretchでデブートストラップされたPi上のUSBにgrub-install /dev/sdaまたはupdate-grubを使用する場合、これはまだ機能しません。 grub-ubootとgrub-efi-armを使用しても、grub-probeが正規のパスを見つけられないというエラーが引き続き発生します。

それだけでなく、update-grubはオペレーティングシステムを確認して認識しますが、興味深いことにgrub-installはDebianオペレーティングシステムがUSB上にあることを認識しません。

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にインストールして実行し、USBにデブートストラップされたDebianを含む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の非公式に入手可能なイメージ のいずれかを使用して発生することはありませんが、明らかに、これはまだブートストラップ解除に利用できないカスタマイズです。

トラブルシューティング

実際には、パスを作成するだけの方が良い場合があります。次の唯一の可能性(およびおそらく)は、GRUBを記述することです。そのために、このページで読みます。

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

この問題について私が共有したいもう1つのことは、機能する可能性があるソリューションですが、microSDカードは非常に敏感であることを理解してください。私は自分のLinuxイメージを構築しており、これをすばやく学びました。最善の方法は、可能な限りQemuを使用することですが、古いパーティションテーブルをクリアするには、ドライブでsgdisk --zap-allを実行してみてください。

sgdisk --zap-all /dev/sdd

実際、最初にエラーが発生し、読み取り専用エラーではない場合は、もう一度実行すると、最終的にすべてのエラーが発生します。新しいまたは古いパーティションテーブル。

また、標準のAMD/IntelベースのPCで Qemuを使用してRaspberry Piをエミュレート を実行できます。私はそれをお勧めします。これは元の投稿に関連する情報よりも多くの情報であることは知っていますが、このエラーがどのようにして導出されたのか、おそらくそうです。コンテナ時代です。

0
w3techie

書き込まれた内容に基づいて、GRUBを/ dev/sdaにインストールしようとしているようです。ディスクをマウントしたくありません。

あなたはおそらく探しています:grub-install /dev/sda

参考のためにGRUB manページ、またはあなたはman grub-installシステムから: http://linux.die.net/man/8/grub-install

0
tamarintech