Chroot не удалось выполнить команду bin bash ошибка формата выполняемого файла

Обновлено: 17.05.2024

Chroot — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.

Contents

Причины

Изменение корневого каталога обычно производится для выполнения действий по обслуживанию систем, загрузка и/или вход в которых стали невозможны. В таком режиме, например, могут быть выполнены:

  • Переустановка загрузчика.
  • Пересборка образа initramfs.
  • Обновление или откат пакетов. .

Требования

Монтирование разделов

Корневой раздел среды Linux, в которую вы хотите войти с chroot, должен быть первым делом смонтирован. Чтобы найти имя раздела, выполните:

Затем создайте каталог для монтирования корневого раздела и смонтируйте его:

Если отдельные системные каталоги были вынесены на отдельные разделы, их также нужно смонтировать в файловую систему корневого раздела:

Изменение корневого раздела

Используя arch-chroot

Bash-скрипт arch-chroot является частью пакета arch-install-scripts из официальных репозиториев. Перед тем, как запускать /usr/bin/chroot , этот скрипт монтирует интерфейсные файловые системы вроде /proc и делает /etc/resolv.conf доступным из под окружения chroot.

Запустите arch-chroot с указанием нового корневого каталога:

Чтобы запустить командную оболочку bash вместо sh:

Чтобы запустить mkinitcpio -p linux в окружении chroot минуя создание сеанса в командной оболочке:

Используя chroot

Смонтируйте временные интерфейсные файловые системы:

Чтобы использовать интернет-соединение в chroot может понадобиться скопировать resolv.conf:

Чтобы запустить bash в окружении chroot:

  • chroot: cannot run command '/usr/bin/bash': Exec format error , это значит, что архитектуры основной среды и среды нового корневого каталога не совпадают.
  • chroot: '/usr/bin/bash': permission denied , перемонтируйте раздел с разрешением exec: mount -o remount,exec /mnt/arch .

После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:

Совет: Вы также можете установить другое приглашение командной оболочки для того, чтобы отличать среду chroot от основной:

Используя systemd-nspawn

systemd-nspawn может использоваться для запуска команды или операционной системы в легковесном контейнере. Во многих случаях он похож на chroot, но является более мощным инструментом, так как он полностью эмулирует отдельную иерархию файловой системы и дерево процессов, различные системы межпроцессного взаимодействия, имя хоста и домена.

Перейдите в точку монтирования нового корневого раздела и запустите systemd-nspawn:

Нет необходимости самостоятельно монтировать интерфейсные файловые системы вроде /proc , так как systemd-nspawn запускает новый процесс init в созданной виртуальной среде, который берет на себя эту задачу. Это похоже на загрузку второй операционной системы внутри основной, но без создания виртуальной машины.

Запуск графических приложений в среде chroot

Если у вас есть запущенный X-сервер, вы сможете запускать даже графические приложения в среде chroot.

Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду xhost, которая даст права каждому подключаться к X-серверу пользователя:

Теперь, для соединения приложений с сервером X, установите переменной окружения DISPLAY в сеансе chroot значение, совпадающее с переменной окружения DISPLAY пользователя, от имени которого запущен сервер. То есть, выполните

от имени этого пользователя для того, чтобы узнать значение переменной, и выполните

в среде chroot, установив переменной нужное значение (в данном примере это :0 ).

Выход из среды chroot

После завершения работы, выйдите из сеанса chroot:

Теперь размонтируйте временные файловые системы и корневой раздел:

Примечание: Если возникает ошибка наподобие: umount: /path: device is busy , обычно это значит, что либо какая-то программа в среде chroot все еще запущена, либо что-то пошло не так при размонтировании внутренних по отношению к корневому разделу. Выйдите из программы и используйте команду mount чтобы найти и размонтировать подразделы. Может быть несколько непросто размонтировать некоторые вещи, и вам может посчастливиться форсировать размонтирование опцией umount --force . В качестве последнего средства используйте опцию umount --lazy , которая просто освобождает устройства. В любом случае, чтобы обезопасить себя, перезагрузитесь как можно быстрее.

Без прав суперпользователя

Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.

PRoot

PRoot может использоваться для изменения корневого раздела и использовать mount --bind без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию --root-id , которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в fakeroot.

Fakechroot

fakechroot является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с fakeroot для создания видимости того, что chroot запускается суперпользователем.

Я знаю, что для выполнения файла я использую команду ., а затем имя файла с пробелом между ними. Но я пытаюсь выполнить файл .jar с помощью ., и он не работает. Я вошел в свойства и пометил его как исполняемый файл и запустил его с помощью Java.

Есть ли способ выполнить файл с Java в Bash Terminal?

Я пытаюсь выполнить файл Minecraft.jar.

Синтаксис . может использоваться только для запуска сценариев оболочки (sourcing).

Вам нужно будет использовать команду java для запуска файла .jar: [ ! d1] java -jar Minecraft.jar

Синтаксис . может использоваться только для запуска сценариев оболочки (sourcing).

Вам нужно будет использовать команду java для запуска файла .jar: [ ! d1] java -jar Minecraft.jar

Вы также можете сделать приятную запись для приложения в Unity. выполните следующие команды:

В появившемся окне скопируйте и вставьте следующее:

[Desktop Entry] Type=Application Name=Minecraft Comment=Click here to play Minecraft Exec=java -jar /path/to/minecraft.jar Icon=/path/to/minecraft/icon.jpg Terminal=false Categories=Game;

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

Откройте командную строку с помощью CTRL + ALT + T Перейдите в каталог файлов .jar. Если ваша версия / аромат Ubuntu поддерживает его, вы можете щелкнуть правой кнопкой мыши по каталогу файла «.jar» и нажать «Открыть в терминале» Введите следующую команду: java -jar jarfilename.jar

Таким образом, ваш " .jar "будет выполнен.

Установите jarwrapper. После этого (и добавив исполняемый бит) вы можете запустить файл jar, просто введя имя jarfile.

sudo apt-get install jarwrapper

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

Linux вполне способен запускать внешний двоичный файл, например JAR-файл. Так работает вино, например. Для запуска JAR-файлов в качестве исполняемого файла выполните следующие действия в консоли

sudo apt-get install binfmt-support

Cd в ваш JAR-файл и измените его на исполняемый файл (вы также можете сделать это с помощью свойств файла в Nautilus)

chmod a+rx myjar.jar

Запустите файл jar так же, как если бы это был любой другой исполняемый файл или сценарий оболочки

, если вы хотите установить свою банку с конкретной версией java. Укажите каталог java также

/scratch/app/product/Software/jdk1.8.0_112/bin/java -jar /path-to-jar/Minecraft.jar

Если это исполняемый jar, то

java -jar Minecraft.jar

Не все jar-архивы содержат исполняемый класс, объявленный для запуска в файле манифеста, но если есть, это будет работать. [ ! d1]

Btw: Вы не запускаете большинство программ из оболочки с точкой. Точка - это ярлык для source, и он работает только в bash и некоторых других оболочках, чтобы включить скрипт в область текущего сеанса.

Скомпилированный двоичный xybin просто начинается с его имени, если он находится в пути:

или, с его абсолютным путем:

или с его относительным путем:

или если вы попали в каталог файла с этим относительным путем:

Файл должен быть (см. chmod). Все вышесказанное верно и для shellscripts, но у них часто есть расширение .sh, и вы можете запустить shellscript, вызвав интерпретатор, и тогда его не нужно отмечать как исполняемый файл:

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

В операционной системе Linux при запуске скаченного файла, либо при запуске самостоятельно скомпилированного файла вы можете столкнуться с ошибкой:


Если у вас англоязычная локаль, то ошибка будет примерно такой:

В самой ошибке вместо /путь/до/файла и ./program будет указан путь до файла программы, который вы хотите запустить.

Причинами данной ошибки могут быть:

  • попытка запустить 64-битный файл на 32-битной системе
  • файл скомпилирован для другой архитектуры (например, для ARM, а вы пытаетесь запустить его на ПК)
  • вы пытаетесь выполнить не исполнимый файл, а ссылку
  • файл размещён в совместной (shared) папке

Чтобы получить информацию о файле, который вы пытаетесь запустить, можно использовать утилиту file, после которой укажите путь до файла:

Здесь мы видим, что файл предназначен для 64-битной системы, об этом говорит запись 64-bit, для процессора с архитектурой x86-64.

Ещё один пример:

Этот файл для 32-битных систем, для процессора с архитектурой ARM EABI4.

Если вы не знаете, какой битности ваша система, то выполните команду:

Для 64-битных систем будет выведено x86_64, а для 32-битных – x86.

О разрядности дистрибутивов Linux и о программ

На компьютер с 32-битным процессором вы можете установить только 32-битную операционную систему и в ней запускать только 32-битные программы.

На компьютер с 64-битным процессором вы можете установить как 64-битную ОС, так и 32-битный Linux. В случае, если вы установили 64-битный дистрибутив Linux, то в нём вы можете запускать и 64-битные программы и 32-битные. А если вы установили 32-битный дистрибутив, то в нём возможно запускать только 32-битные программы.

Итак, если у вас 32-битная система, а файл для 64-битной системы или даже для ARM архитектуры, то у вас следующие варианты:

  • скачать файл подходящей для вас битности и архитектуры
  • если вы самостоятельно компилировали файл из исходного кода, то заново скомпилируйте для процессора вашей архитектуры

Запуск ARM файлов в Linux

Часто можно запустить исполнимые образы ARM на amd64 системах если установить пакеты binfmt-support, qemu, и qemu-user-static:

Заключение

Итак, ошибка формата выполняемого файла с невозможностью запустить бинарный файл возникает из-за несоответствия программы операционной системе или архитектуре процессора. Эта проблема не должна возникать, если вы установили программу из исходных репозиториев (кроме случаев неправильной настройки источников репозитория). При возникновении этой проблемы поищите файл, подходящий для вашей архитектуры или скомпилируйте файл из исходных кодов под архитектуру вашей операционной системы.

My environment is i686 packages on fully updated Arch Linux install.

The context of the error is precisely as follows, at the end:

I verified bash is at /bin/bash

The wiki article directories appear to vary slightly from the downloaded iso, but I adjusted to them, I hope, correctly.

Is it even possible to follow the wiki section "Modifying the X86_64 system" on a i686 install?

I hope I have not overlooked something simple.

Any pointers or tips appreciated as always.
Steve.

Last edited by stevepa (2015-03-15 01:31:20)

I believe you need to boot into an i686 install to chroot into an i686 system.

falconindy Developer From: New York, USA Registered: 2009-10-22 Posts: 4,111 Website

I believe you need to boot into an i686 install to chroot into an i686 system.

Last edited by falconindy (2015-03-13 23:00:14)

stevepa Member From: Texas USA Registered: 2012-02-12 Posts: 113

Thank you Mr. Falcon. That was my suspicion.

I did not see that proviso on the wiki page but maybe it was common sense.

jasonwryan Anarchist From: .nz Registered: 2009-05-09 Posts: 29,730 Website

Oh, so it is Mr Falcon now?

Online

Raynman Member Registered: 2011-10-22 Posts: 1,337

Thank you Mr. Falcon. That was my suspicion.

I did not see that proviso on the wiki page but maybe it was common sense.

Requirements:
Matching architecture environments; i.e. the chroot from and chroot to. The architecture of the current environment can be discovered with: uname -m (e.g. i686 or x86_64).

karol Archivist Registered: 2009-05-06 Posts: 25,440 stevepa Member From: Texas USA Registered: 2012-02-12 Posts: 113

If I may update my experience about archiso.

Update 2: Just thought I would add some build times on a modern laptops

Lenovo Thinkpad T440p i5 4GB SSD profile=releng

Lenovo X220 i5 8GB SSD profile=baseline

Lenovo X220 i5 8GB SSD profile=releng (stock)

Last edited by stevepa (2015-03-15 04:09:17)

Читайте также: