chroot в /mnt не удалось, когда не должно было.

Вопрос или проблема

В настоящее время я пытаюсь установить GRUB на образ диска для тестирования в QEMU. Чтобы сгенерировать файл конфигурации GRUB, нужно chroot в /mnt (в соответствии с этим предыдущим ответом), а затем запустить grub-mkconfig, иначе команда попытается прочитать ваш образ ядра и initramfs из вашего реального /boot.

Я подключил свою файловую систему FAT32 к виртуальному устройству /dev/loop1, смонтировал её в /mnt и выполнил следующие дополнительные монтирования:

  • Связывание /dev с /mnt/dev
  • Связывание /usr с /mnt/usr
  • Создание sysfs в /mnt/sys
  • Создание procfs в /mnt/proc

всё без ошибок. Я также создал директорию /mnt/boot и /mnt/boot/grub, содержащие образ ядра и initramfs, а также карту устройств GRUB соответственно. Однако когда я пытаюсь выполнить chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg для генерации конфигурации, это приводит к неясной ошибке:

chroot: не удалось выполнить команду `grub-mkconfig`: Нет такого файла или каталога

Это также происходит, когда я заменяю grub-mkconfig на $(which grub-mkconfig), исходя из возможности, что PATH не экспортирован должным образом. Я проверил, что /mnt/usr/bin/grub-mkconfig существует, благодаря вышеупомянутому связыванию монтирования.

Когда я пытаюсь просто выполнить chroot /mnt, мне выдается аналогичное сообщение, на этот раз с /usr/bin/bash, несмотря на то что /mnt/usr/bin/bash также существует и /mnt/usr/lib и /mnt/usr/lib64 содержат нужные файлы…

Что я сделал не так? Извините, если это тривиальная ошибка.

Вероятно, вам не хватает динамического загрузчика ld.so, который традиционно находится в /lib или подобном (даже на многих дистрибутивах с “объединённым /usr”). Каждый динамически связанный бинарный файл имеет свой путь, встроенный в заголовок ELF, и он работает аналогично #! в скриптах оболочки — ld.so является реальным исполняемым файлом, который запускается с /usr/bin/bash в качестве аргумента.

Используйте file, чтобы определить точный путь; например, бинарные файлы, скомпилированные на Arch Linux x86-64 (Glibc), ожидают, что загрузчик будет находиться по адресу /lib64/ld-linux-x86-64.so.2.

Ответ или решение

При выполнении команды chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg вы встретились с ошибкой "No such file or directory". Это может быть связано с отсутствием динамического загрузчика, который требуется для выполнения динамически скомпилированных бинарных файлов.

Проблема и её анализ

  1. Эксплуатация среды chroot:
    Chroot создает новую корневую файловую систему (/mnt в вашем случае), и когда вы пытаетесь запустить grub-mkconfig, система не может найти необходимый для выполнения файл. Более того, динамически скомпилированные программы требуют, чтобы их зависимости, включая загрузчик, были доступны внутри chroot-окружения.

  2. Отсутствие динамического загрузчика:
    Чтобы запустить бинарный файл, такой как bash или grub-mkconfig, требуется динамический загрузчик, который обычно находится в /lib или в /lib64. Когда вы проверяете, что grub-mkconfig существует, не забывайте о том, что он, скорее всего, требует наличия загрузчика для корректной работы.

Решение проблемы

  1. Проверьте наличие загрузчика:
    Используйте команду file, чтобы определить путь к динамическому загрузчику для вашей системы. Например:

    file /mnt/usr/bin/grub-mkconfig

    Эта команда должна показать, какой динамический загрузчик необходим для работы данной программы.

  2. Копирование загрузчика в chroot:
    После того как вы определили путь к нужному загрузчику (например, /lib/ld-linux-x86-64.so.2), вам необходимо создать соответствующую директорию в вашем chroot-окружении и скопировать туда загрузчик. Выполните следующие команды:

    cp /lib64/ld-linux-x86-64.so.2 /mnt/lib64/

    Убедитесь, что все зависимости также доступны. Для этого можно использовать команды типа ldd для анализа:

    ldd /mnt/usr/bin/grub-mkconfig
  3. Проверьте дополнительные зависимости:
    После проверки загрузчика убедитесь, что все необходимые библиотеки для grub-mkconfig и других используемых вами программ также скопированы в соответствующие директории lib и lib64 в вашем chroot-окружении.

Заключение

Таким образом, успешное выполнение команды chroot зависит от наличия динамического загрузчика и всех необходимых библиотек внутри вашего chroot-окружения. Это типичная проблема, с которой могут столкнуться разработчики и системные администраторы при настройке систем. Убедившись, что все необходимые элементы присутствуют в chroot, вы сможете избежать ошибок и успешно выполнить grub-mkconfig.

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

Оцените материал
Добавить комментарий

Капча загружается...