датчик личинки: ошибка: не удалось получить канонический путь / коровы

Если все, что Вы хотите сделать, шпионить за существующим процессом, можно использовать strace -p1234 -s9999 -e write где 1234 является идентификатором процесса. (-s9999 старается не иметь строки, усеченные к 32 символам, и write системный вызов, который производит вывод.), Если Вы хотите просмотреть только данные, записанные на конкретном дескрипторе файла, можно использовать что-то как strace -p1234 -e trace= -e write=3 видеть только данные, записанные в дескриптор файла 3 (-e trace= препятствует тому, чтобы системные вызовы были зарегистрированы). Это не даст Вам вывод, это было уже произведено.

Если вывод прокручивает слишком быстрым, можно передать его по каналу в пейджер такой как less, или отправьте его в файл с strace -o trace.log ….

Со многими программами можно отклонить последующий вывод со взломом ptrace, или к текущему терминалу или к новой экранной сессии. Посмотрите, Как я могу отрицать рабочий процесс и связать его к новой экранной оболочке? и другие связанные потоки.

Обратите внимание, что в зависимости от того, как Ваша система настраивается, Вы, возможно, должны выполнить все они strace команды как корень, даже если процесс работает при Вашем пользователе без дополнительных полномочий. (Если процесс будет работать как другой пользователь или будет setuid или setgid, то необходимо будет работать strace как корень.) Большинство дистрибутивов только позволяет процессу прослеживать своих детей (это предоставляет умеренное преимущество безопасности — это предотвращает некоторую прямую вредоносную инжекцию, но не предотвращает косвенную инжекцию путем изменения файлов). Этим управляют kernel.yama.ptrace_scome sysctl.

13
13.01.2020, 08:38
5 ответов

Выполните эти шаги:

  1. Начальная загрузка в Живую сессию Linux.

  2. Смонтируйтесь / раздел Вашей установленной ОС к /mnt

    sudo mount /dev/sda6 /mnt
    
  3. Настроенный a chroot среда:

    sudo chroot /mnt
    
  4. Вы находитесь теперь в "поддельной" установке Linux, которая рассматривает /mnt как /. Это означает, что все файлы, необходимые для GRUB, находятся в /boot где система ожидает, что они будут, и можно установить GRUB так же, как если бы Вы на самом деле выполняли свою установленную систему:

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

Теперь перезагрузка и Вы должны видеть, что меню GRUB обычно появляется.

10
27.01.2020, 19:53
  • 1
    я пытаюсь установить от USB-устройства. любым путем я попробовал также, не монтируясь - та же ошибка. можно ли объяснить ошибку? –  elyashiv 21.10.2013, 17:11
  • 2
    @elyashiv обновлений по возможности редактирует Ваш вопрос и объясняет, что это - Вы, пытаются. Вы пытаетесь спасти поврежденную систему? Вы загружаете живую систему от USB? Если так, скажите нам. Что ОС Вы используете? Что заставляет Вас думать, что GRUB имеет a root-device опция и что Вы ожидаете ту опцию сделать? Вы настроили a chroot среда? Каждый раз, когда Вы задаете вопрос, необходимо объяснить точно, какой t - Вы, пытаются сделать, мы не можем предположить. –  terdon♦ 21.10.2013, 17:19
  • 3
    ой, я имел в виду - корневой каталог –  elyashiv 21.10.2013, 17:30
  • 4
    @elyashiv, там не --root-directory также. Пойдите читает мой ответ здесь, который объясняет, как переустановить личинку. –  terdon♦ 21.10.2013, 17:34
  • 5
    на первый ответ здесь –  elyashiv 21.10.2013, 18:13

На основе того, что было записано, похоже, что Вы пытаетесь установить GRUB на/dev/sda. Вы не хотите монтировать диск.

Вы, вероятно, ищете: grub-install /dev/sda

Страница справочника GRUB для ссылки, или Вы можете man grub-install от Вашей системы: http://linux.die.net/man/8/grub-install

0
27.01.2020, 19:53

Если grub говорит, что не может разрешить канонический путь чего-либо, это означает, что он не существует или realpath()не удалось.

В этом случае попробуйте:

$ realpath /cow
$ ls -la /cow

Если обе команды говорят «не удается найти файл или каталог», вам необходимо создать его.

Если вторая команда работает, а первая нет, проверьте, почему realpath()не работает. Одной из причин может быть то, что /procне смонтирован. В некоторых реализациях libc /proc/self/fdиспользуется для получения канонического пути к файлу.

1
27.01.2020, 19:53

Я тоже получаю эту ошибку, и я не думаю, что это происходит в 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 -. Я бы порекомендовал это. Я знаю, что это больше информации, чем относится к исходному сообщению, но я думаю, что, скорее всего, эта ошибка возникла. Это эпоха контейнеров.

2
27.01.2020, 19:53

Для тех, кто борется с этим, кто пытается использовать живой USB или другие средства chroot для переустановки или установки grub. -Я имел дело с этим несколько раз и забыл задокументировать это раньше, хотя собирался это сделать.

Проблема, с которой вы столкнулись, заключается в том, что grub не имеет доступа к пути, на который вы ссылаетесь, либо в качестве источника (/boot ), либо в качестве места назначения (ваша система и chroot могут видеть, например, /dev/sda? )или и то, и другое. Когда вы готовитесь к chroot, вы создаете привязки монтирования, которые доступны в среде chroot, или вы делаете это внутри chroot, используя mount -t. В Интернете так много руководств, которые делают это в любом случае.

Вам нужно убедиться, что вы привязываете /dev или только к конкретному разделу (s ), содержащему загрузочные файлы в /boot (, например. /dev/sda1 )./boot — это либо отдельный раздел, либо каталог в /. chroot требуется доступ к диску, на который вы будете (повторно )устанавливать grub, поэтому сделайте fdisk -l в chroot, чтобы убедиться, что вы видите устройство, указанное в выводе. Также обратите внимание, что если у вас нет отдельного загрузочного раздела, но у вас есть загрузочный каталог в /root с загрузочными файлами (, а не просто точка монтирования ), вам нужно монтировать только раздел, содержащий root. Тогда вам не нужно ничего монтировать в /root/boot.

Вам также необходимо убедиться, что вы связываете файловую систему proc и файловую систему sys, но в каждом руководстве, которое я видел, есть эти две. Я только что видел, как /dev иногда пропускал. Могут быть случаи, когда вам это не нужно, но я о них не знаю.

tl;dr :убедитесь, что вы привязали mount /dev

0
27.01.2020, 19:53

Теги

Похожие вопросы