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から実行されている、壊れたデュアルブートシステムを修復しようとしています。
次の手順を実行します:
ライブLinuxセッションを起動します。
インストールしたOSの/
パーティションを/mnt
にマウントします
Sudo mount /dev/sda6 /mnt
chroot
環境をセットアップします。
Sudo chroot /mnt
これで、/mnt
を/
として扱う「偽の」Linuxインストールが開始されました。これは、GRUBに必要なすべてのファイルが/boot
にあり、システムがそれらを想定しているため、GRUBインストールされたシステムを実際に実行していた:
Sudo update-grub
Sudo grub-install /dev/sda
再起動すると、GRUBメニューが正常に表示されるはずです。
何かの正規パスを解決できなかったとgrubが言った場合、それは存在しないかrealpath()
が失敗したことを意味します。
この場合、次のことを試してください。
_$ realpath /cow
$ ls -la /cow
_
両方のコマンドで「ファイルまたはディレクトリが見つかりません」と表示された場合は、作成する必要があります。
2番目のコマンドが機能しても最初のコマンドが機能しない場合は、realpath()
が機能しない理由を確認してください。理由の1つは、_/proc
_がマウントされていないことです。 libcの一部の実装では、_/proc/self/fd
_を使用してファイルの正規パスを取得します。
ライブ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をバインドしてください
私もこのエラーを受け取り、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をエミュレート を実行できます。私はそれをお勧めします。これは元の投稿に関連する情報よりも多くの情報であることは知っていますが、このエラーがどのようにして導出されたのか、おそらくそうです。コンテナ時代です。
書き込まれた内容に基づいて、GRUBを/ dev/sdaにインストールしようとしているようです。ディスクをマウントしたくありません。
あなたはおそらく探しています:grub-install /dev/sda
参考のためにGRUB manページ、またはあなたはman grub-install
システムから: http://linux.die.net/man/8/grub-install