Chroot не удалось выполнить команду bin bash ошибка формата выполняемого файла
I also tried copying /bin to /tmp/chrootTest/bin and giving it full permissions. However, this doesn't work either.
I would not be entirely surprised to see an error message informing me that /bin/bash can't work in its very rudimentary chroot as other files can't be found. However, the error message printed is surprising as the file clearly exists.
Why does this happen? What is necessary to successfully open a bash in a chroot?
Is /bin/bash a static binary, or does it have shared library dependencies (not available in chroot)? See with ldd /bin/bash .
bind mounting essential system directories insides a chroot environment defeats the security purposes of doing chroot.
Depending on version, distro, configuration and moon phases of Jupiter, chroot uses varying entry points to the VFS. The correct solution has always been to first cd / and then sudo chroot /tmp/chrootTest bin/bash . Notice the relative lookup of bash . Also notice that dependencies of bash still have to be accessible from inside the chroot environment.
@RuiFRibeiro chroot isn't good for added security, there are methods to break out of a chroot . It is useful for creating a sandbox for applications though, so you can be more sure what files/libraries/binaries it uses.
3 Answers 3
If /bin/bash is a binary with shared library dependencies, these dependencies needs to be able to be resolved within the chroot.
I'm on OpenBSD. The format of the output of ldd will be different on a Linux system, but the same essential information (what libraries are shared, and where they are) ought to be displayed on Linux as well.
When I try with a very simplistic chroot that only contains /bin/sh and /bin/bash ( doas is OpenBSD's " sudo replacement"):
Notice that I do get a shell ( /bin/sh ), but that /bin/bash fails. The error is different from yours but it has, I assume, the same cause. Executing /bin/bash directly with the chroot command just gives a one-word "Abort" message, again, presumably due to the same issue with libraries.
Conclusion: The chroot needs to contain at least a minimal installation of a system, including device files and libraries that are needed to run the executables within it.
Explanation of the "No such file or directory" error on Linux:
I was a bit confused as to why the error was "No such file or directory" on Linux, so I ran a test through strace .
The execve() call that ought to have executed the shell returns ENOENT:
. so I thought it was something wrong with finding /bin/bash . However, upon reading the execve(2) manual, I saw:
ENOENT The file filename or a script or ELF interpreter does not exist, or a shared library needed for file or interpreter cannot be found.
Я вижу, что они теперь предлагают только файл tar.gz, для которого принятые действия не работают. Это сработало для меня, выделите все строки и сдвиньте + вставьте их в свой терминал:
Это будет загружать любую новую версию и исправлять разрешения. Вам нужно вручную перейти в «Настройки», «Диспетчер окон», чтобы выбрать одну из тем X-Areo.
54 ответа
В моем случае я пытался перекопать в 64-разрядную версию Linux, но мой текущий Linux был 32-разрядным.
Я установил образ диска (главное изображение, для репликации на несколько машины).
Я думаю, что это BUG.
Действительно, это 64-битная 32-битная несовместимость.
chroot в порядке, все команды по-прежнему не работают. Вам придется копировать их по всему.
У меня была такая же проблема при создании изображения арки арфы. Мне пришлось установить qemu-user-static , а затем скопировать его в папку chroot bin.
Ошибка означает, что ваша тюрьма ( / mnt / temp ) не содержит оболочки bash или не содержит библиотек, необходимых для запуска оболочки bash.
If вы создали свою тюрьму, используя что-то вроде этого:
Вы, вероятно, хотели это сделать:
Однако, как технический ответ на вашу проблему, попробуйте:
Это должно позволить вам успешно провести chroot, и в этот момент вы можете делать другие вещи.
Есть около миллиона вещей, которые неправильно делают это, хотя, и почти наверняка вы делаете не хочу этого делать. Используйте minbase при создании вашей тюрьмы или установите ubuntu на пустую цель (например, виртуальную машину) и создайте tar-архив всей системы, который затем распакуйте в / mnt / temp .
Убедитесь, что вы используете правильный Live CD. Например, убедитесь, что вы не используете 32-битный компакт-диск вместо 64-битного компакт-диска.
Предполагая, что вы подключили свою систему к chrooted в / media / sda1, чтобы определить архитектуру, вы можете:
ls / media / sda1 / *
, если вы видите lib64 в выводе, это, вероятно, 64-битная система
У меня была такая же проблема при создании изображения арки арфы. Мне пришлось установить qemu-user-static , а затем скопировать его в папку chroot bin.
Убедитесь, что вы используете правильный Live CD. Например, убедитесь, что вы не используете 32-битный компакт-диск вместо 64-битного компакт-диска.
Предполагая, что вы подключили свою систему к chrooted в / media / sda1, чтобы определить архитектуру, вы можете:
ls / media / sda1 / *
, если вы видите lib64 в выводе, это, вероятно, 64-битная система
Ошибка означает, что ваша тюрьма ( / mnt / temp ) не содержит оболочки bash или не содержит библиотек, необходимых для запуска оболочки bash.
If вы создали свою тюрьму, используя что-то вроде этого:
Вы, вероятно, хотели это сделать:
Однако, как технический ответ на вашу проблему, попробуйте:
Это должно позволить вам успешно провести chroot, и в этот момент вы можете делать другие вещи.
Есть около миллиона вещей, которые неправильно делают это, хотя, и почти наверняка вы делаете не хочу этого делать. Используйте minbase при создании вашей тюрьмы или установите ubuntu на пустую цель (например, виртуальную машину) и создайте tar-архив всей системы, который затем распакуйте в / mnt / temp .
В моем случае я пытался перекопать в 64-разрядную версию Linux, но мой текущий Linux был 32-разрядным.
Я установил образ диска (главное изображение, для репликации на несколько машины).
Я думаю, что это BUG.
Действительно, это 64-битная 32-битная несовместимость.
chroot в порядке, все команды по-прежнему не работают. Вам придется копировать их по всему.
Убедитесь, что вы используете правильный Live CD. Например, убедитесь, что вы не используете 32-битный компакт-диск вместо 64-битного компакт-диска.
Предполагая, что вы подключили свою систему к chrooted в / media / sda1, чтобы определить архитектуру, вы можете:
ls / media / sda1 / *
, если вы видите lib64 в выводе, это, вероятно, 64-битная система
Ошибка означает, что ваша тюрьма ( / mnt / temp ) не содержит оболочки bash или не содержит библиотек, необходимых для запуска оболочки bash.
If вы создали свою тюрьму, используя что-то вроде этого:
Вы, вероятно, хотели это сделать:
Однако, как технический ответ на вашу проблему, попробуйте:
Это должно позволить вам успешно провести chroot, и в этот момент вы можете делать другие вещи.
Есть около миллиона вещей, которые неправильно делают это, хотя, и почти наверняка вы делаете не хочу этого делать. Используйте minbase при создании вашей тюрьмы или установите ubuntu на пустую цель (например, виртуальную машину) и создайте tar-архив всей системы, который затем распакуйте в / mnt / temp .
Надо настроить qemu-arm chroot. Прочел штук 5 документаций - в теории все понятно. Собираю qemu со static-user флагом. Указываю чем выполнять бинарники для arm ( /proc/sys/fs/binfmt_misc/register). Файлик arm появился. qemu-arm hаботает - отработал бинарник для arm-a (hello word, компиленый criossdev-ом).
qemu-arm из остновной системы скопировал в гостевую , по тому-же пути ( /usr/bin/qemu-arm )
Дальше по инструкции:
mount -o bind /dev /guest_fs/dev
mount -o bind /sys /guest_fs/sys
mount -o bind /proc /guest_fs/proc
chroot: не удалось выполнить команду «/bin/bash»: Ошибка формата выполняемого файла
ls -la /proc/sys/fs/binfmt_misc/
drwxr-xr-x 2 root root 0 авг. 5 19:06 .
dr-xr-xr-x 1 root root 0 авг. 5 16:57 ..
-rw-r--r-- 1 root root 0 авг. 5 19:29 arm
--w------- 1 root root 0 авг. 5 19:29 register
-rw-r--r-- 1 root root 0 авг. 5 19:06 status
А вот если посмотреть в гостевую ОС.
ls -la /guest_fs/proc/sys/fs/binfmt_misc/
то там пусто о_0. Мож потому и ругается, что не знает чем обработать такой бинарник ?
вот и бьюсь уже не первый день.. и никак =( Ув. форумчане, помогите - оч надо.
/proc/sys/fs/binfmt_misc тоже надо отдельно примонтировать, например, внутри chroot:
примонтировал, не помогло.
Мож я не ту доку юзаю - мож ошибка где-то в мелочи.
Посоветуйте кто-то инструкцию для внимательного прочтения, желательно под gentoo, следуя которой у кого-нить получилось зачрутиться.
руки.doc не предлагать - сам продаю =)
я нарыл проблему: скопировал в корень guest_fs тот самый hello_world , компилированый под arm . Написал такое chroot /guest_fs /hello_world . и все получилось..
Также получилось df:
chroot /guest_fs /bin/df /bin/df: Предупреждение: не удалось прочитать таблицу смонтированных файловых систем: Нет такого файла или каталога Файловая система 1K-блоков Использовано Доступно Использовано% Cмонтировано в - 31263552 6587160 24676392 22% /
Но вот bash и sh за одно с ним не запускается:
/bin/sh: /bin/sh: не могу запустить бинарный файл
Может busybox ? или bash пересобрать как-то или stage3 у меня говняный ( stage3-armv7a_hardfp-20130209.tar.bz2 ) почему-то на зеркалах сегодня стейжа ваще нету .
Ту команду надо было из-под chroot запускать, чтобы примонтировало, но я забыл, что в chroot оно вообще не заходит, тогда извне это будет так:
В идеале надо собрать в chroot окружении gentoo под arm ( beaglebobe black ) .
Мож не тем путём иду ? where is the gentoo-way ??
я сделал правильно - учел свои пути и выполнял до chroot. Из chroot я ничего не могу сделать - bash\sh не запускается
В операционной системе 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:
Заключение
Итак, ошибка формата выполняемого файла с невозможностью запустить бинарный файл возникает из-за несоответствия программы операционной системе или архитектуре процессора. Эта проблема не должна возникать, если вы установили программу из исходных репозиториев (кроме случаев неправильной настройки источников репозитория). При возникновении этой проблемы поищите файл, подходящий для вашей архитектуры или скомпилируйте файл из исходных кодов под архитектуру вашей операционной системы.
имеется арч, i3wm. Смонтировал псевдосистемы командами:
Хотел засадить систему на флешку через 'chroot', но выдает ошибку
bash обычно динамически слинкован, все библиотеки скопировали в chroot?
А либы свои bash из астрала возьмет?
Из мана по установке с арчевики.
Radjah ★★★★★ ( 06.03.17 07:44:26 )
Последнее исправление: Radjah 06.03.17 07:46:04 (всего исправлений: 2)
ну так я то из системы, как я тебе pacstrap сделаю?
какие либы нужно скопить?
Никакие, используй тот shell, что там есть. Т.е. заместо
kostik87 ★★★★★ ( 06.03.17 08:40:31 )
Последнее исправление: kostik87 06.03.17 08:40:46 (всего исправлений: 1)
ёпрст, вы неверна меня не поняли, флешка пустая. я хочу на флешку из системы поставить систему.
chroot нужно куда-то делать, т.е. не в пустую директорию, а в директорию где есть какая-то базовая система Linux.
Если у вас arch linux, то почитайте инструкцию по его установке, в начале вам надо скачать архив базовой системы, распаковать его на подготовленную файловую систему и уже затем согласно документации делать chroot.
Просто так скопировать в пустую директорию bash и потом сделать туда chroot у вас не получится.
хммм. ясна. спс, буду знать
Если нет в системе, то поставь. Логика работает?
Radjah ★★★★★ ( 06.03.17 08:59:04 )
Последнее исправление: Radjah 06.03.17 09:05:42 (всего исправлений: 1)
хочу на флешку из системы поставить систему
Зочем тебе чрут? Ставь прямо из той системы, которая загружена. man pacman, ключи -b и -r.
хмммм а ведь и правда, спс.
да, нашел спс. единственное не понятна, где енти скрипты находятся на установочном образе арча? уже распаковал initramfs с образа, нету ни pacstrap ни arch-chroot.
Останется только добавить загрузчик.
да да, я уже понял.
ну вот я имею ввиду, чо в обычном образе есть же все енти команды, а где они находятся?
ХЗ, я не использую Arch Linux, у меня Gentoo, я тебе дал ссылку на git витку, в которой исходники этих утилит, выполни make install.
Читайте также: