grub-probe: помилка: не вдалося пройти канонічний шлях / корова


15

Я намагаюся знову встановити grub з USB-накопичувача. Я виконую наступне:

sudo mount /dev/sda6 /mnt
sudo grub-install --root-directory=/mnt /dev/sda

Я отримую таку помилку:

grub-probe: error: failed to get canonical path of /cow.

хтось може пояснити помилку, і як її вирішити?

Редагувати

Я намагаюся виправити зламану систему з подвійним завантаженням, що працює на USB-серветі, що містить монетний двір Linux.


Гаразд, це редагування - це крок у правильному напрямку. Чи варто вважати, що у вас вже встановлена ​​система Linux? Це завантажується sda6? Чи допомагає моя відповідь тут ?
terdon

Відповіді:


10

Виконайте такі дії:

  1. Завантажтесь в сеанс Live Linux.

  2. Встановіть /розділ встановленої ОС на/mnt

    sudo mount /dev/sda6 /mnt
    
  3. Налаштування chrootсередовища:

    sudo chroot /mnt
    
  4. Зараз ви перебуваєте у "підробленій" установці Linux, яка розглядає /mntяк /. Це означає, що всі файли, необхідні для GRUB, знаходяться /bootтам, де система очікує їх, і ви можете встановити GRUB так само, як якщо б ви насправді працювали над встановленою системою:

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

Тепер перезавантажте, і ви побачите, що меню GRUB відображається нормально.


Я намагаюся встановити з пристрою usb. будь-який спосіб, я спробував і без монтажу - така ж помилка. чи можете ви пояснити помилку?
еляшів

@elyashiv, будь ласка, відредагуйте своє запитання та поясніть, що це ви намагаєтесь. Чи намагаєтесь ви врятувати зламану систему? Ви завантажуєте живу систему з USB? Якщо так, то скажіть нам . Яку ОС ви використовуєте? Що змушує вас вважати, що GRUB має root-deviceможливість, і що ви очікуєте від цього? Ви створили chrootсередовище? Щоразу, коли ви задаєте питання, вам потрібно пояснити, що саме ви намагаєтеся зробити, ми не можемо здогадатися.
terdon

oops, я мав на увазі -root-directory
elyashiv

@elyashiv немає і --root-directoryтого. Почитайте тут мою відповідь, яка пояснює, як перевстановити grub.
terdon

дивіться першу відповідь тут
elyashiv

1

Якщо grub каже, що він не міг вирішити канонічний шлях чогось, це означає, що воно не існує або realpath()провалюється.

У цьому випадку спробуйте:

$ realpath /cow
$ ls -la /cow

Якщо обидві команди кажуть "не вдається знайти файл чи каталог", тоді вам доведеться створити його.

Якщо друга команда працює, але перша ні, перевірте, чому realpath()вона не працює. Однією з причин може бути те, що /procне встановлено. У деяких реалізаціях libc /proc/self/fdвикористовується для отримання канонічного шляху до файлу.


0

Виходячи з написаного, схоже, ви намагаєтесь встановити GRUB в / dev / sda. Ви не хочете монтувати диск.

Ви, мабуть, шукаєте: grub-install /dev/sda

Довідкова сторінка GRUB для довідок, або ви можете man grub-installзі своєї системи: http://linux.die.net/man/8/grub-install


0

Я також отримую цю помилку, і я не думаю, що це відбувається в chroot.

Фон

Я думаю, що це коли systemd не може знайти шлях, оскільки він встановлений у каталозі. Отже, різниця полягає в тому, що ви встановлюєте chroot, ви вже налаштовуєте доступ до обладнання, включаючи диски.

Хоча ви можете налаштувати цей доступ всередині Systemd, це не означає, що ви можете налаштувати дозволи для цих дисків так само.

Наприклад, я створив цей файл:

/etc/systemd/system/systemd-nspawn@.service.d/override.conf

І він містить ці параметри:

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

Це все ще не працює при використанні grub-install /dev/sdaабо update-grubдля USB на Pi, дезабудованому Debian Stretch. Навіть використовуючи 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, а не Grub на USB, що містить перезавантажений Debian.

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

Ще одна річ, яку я хочу поділитися з цього питання - це рішення, яке може працювати, але розумію, що картки microSD дуже чутливі. Я будував свої власні образи в Linux і швидко вчився цьому. Найкраще зробити це - використовувати Qemu коли завгодно, але намагатися очистити стару таблицю розділів, ви можете спробувати запустити sgdisk --zap-allна диску.

sgdisk --zap-all /dev/sdd

Насправді, іноді, якщо вона вперше дає помилку, і це не помилка лише для читання, ви можете запустити її ще раз, і нарешті всі таблиці розділів нові чи старі.

І ви можете використовувати Qemu для емуляції Raspberry Pi на стандартному ПК на базі AMD / Intel. Я б рекомендував це. Я знаю, що це більше інформації, ніж стосується оригіналу публікації, але я думаю, що, ймовірно, як ця помилка походить. Це вік контейнера.


0

Для тих, хто бореться з цим, хто намагається використати живий USB або інший засіб chroot, щоб перевстановити або встановити grub - я кілька разів займався цим і забув це документувати раніше, хоча і мав намір.

Проблема, з якою ви стикаєтеся з grub, не має доступу до шляху, який ви посилаєтесь ні на джерело (/ завантаження), ні на місце призначення (можуть бачити, /dev/sdaнаприклад, ваша система та chroot ?) Або і те й інше. Коли ви готуєтеся до chroot, ви створюєте прив'язуючі кріплення, доступні в середовищі chroot, або ви робите це в chroot, використовуючи mount -t. В Інтернеті так багато путівників, які роблять це в будь-якому випадку.

Вам потрібно переконатися, що ви прив’язуєте / dev або просто конкретний розділ, що містить завантажувальні файли в / boot (наприклад, / dev / sda1). / boot - це або окремий розділ, або каталог у /. Chroot потребує доступу до накопичувача, на який ви будете (пере) встановлювати grub, щоб зробити fdisk -l в chroot, щоб переконатися, що ви можете бачити пристрій, вказаний у вихідному документі. Також зауважте, якщо у вас немає окремого завантажувального розділу, але у вас є завантажувальний каталог у / root із завантажувальними файлами (а не лише монтовою точкою), вам потрібно лише змонтувати розділ, що містить root. Тоді вам нічого не потрібно монтувати до / root / boot.

Вам також потрібно переконатися, що ви зв’язуєте файлову систему proc і файлову систему sys, але в кожному керівництві, яке я бачив, є ці два. Я щойно бачив / дев пропускав іноді. Можуть бути випадки, коли вам це не потрібно, але я не знаю про них.

tl; dr: переконайтеся, що ви прив’язуєте mount / dev


Чому ви говорите, chrootколи питання не про `` chroot``?
G-Man каже: "Відновіть Моніку"

ОП каже, що "працює від USB, що містить монетний двір Linux". Це буде chroot.
Дайра Хопвуд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.