chroot: не удалось запустить команду '/ bin / bash': нет такого файла или каталога

55

Когда я запускаю chrootкоманду, выдается ошибка:

failed to run command ‘/bin/bash’: No such file or directory 
USER3254789
источник
1
Можно ли считать вопрос чистым дубликатом unix.stackexchange.com/questions/76490/… ? Ответы на вопросы представляют собой возможное решение проблемы, безусловно, стоит ссылки, но это не делает вопрос дубликатом этого.
Карл Рихтер
1
Для меня проблема заключалась в том, что я использовал 32-битный Live CD для монтирования 64-битного диска ОС и подключения к нему. 32-битное ядро ​​не может работать с 64-битным bash. Решением было получить 64-битный Live CD. (Связанный дубликат совершенно не связан.)
Leons
Это не дубликат, несмотря на то, что объяснение источника проблемы применимо к обоим вопросам. Вопрос, помеченный как дубликат, касается отсутствующих библиотек при обычной установке, тогда как этот вопрос касается именно ошибки, возникающей в среде chroot.
bschlueter

Ответы:

34

Эта ошибка означает, что внутри chroot нет /bin/bashкаталога . Убедитесь, что вы указали, где (или другой оболочкой) исполняемый файл находится в каталоге.bashchroot

Если у вас есть, /mnt/somedir/usr/bin/bashто выполнитеchroot /mnt/somedir /usr/bin/bash

phoops
источник
2
В папке
rootfs находится
2
Это может быть вызвано ошибкой в ​​командной строке /root/.bashrcили /root/.bash_profileв вашей chroot. Можете ли вы временно переименовать эти файлы? Также вы можете убедиться, что bashисполняемый ( chmod +x /chroot/bin/bash)?
Фоп
aspade @ home-ba: ~ / DebianArm $ sudo chmod + x rootfs / bin / bash. aspade @ home-ba: ~ / DebianArm $ sudo chroot rootfs. chroot: не удалось выполнить команду '/ bin / bash': нет такого файла или каталога
USER3254789
38
Я понял. bin / bash есть, но у меня не было / lib и / lib64 внутри. / bin / bash зависит (ofc) от libc, ld-linux, libdl и т. д ... Итак, достаточно простого cp -a / usr rootfs /, cp -a / lib rootfs /, cp -a / lib64 rootfs /. (Вы можете монтировать-связывать эти ofc, но я скопировал их, потому что я хочу запустить что-то опасное, что может повредить эти файлы в rootfs.) Сообщение от chroot может быть более наглядным. «нет такого файла или каталога» действительно означает «я не могу запустить этот sh ...».
Далибор Филус
1
@EmilVatai добавил :-)
Далибор Филус
13

Я имел /bin/bashвнутри chrooted каталог, но у меня не было / lib и / lib64 внутри него. Сообщение от chroot может быть более наглядным. «нет такого файла или каталога» действительно означает «я не могу запустить это ...».

/bin/bashзависит, конечно, от libc, ld-linux, libdl и т. д., вы можете использовать, ldd /bin/bashчтобы увидеть, какие библиотеки ему требуются.

1) Вы можете mount -o bindэти каталоги в chroot 2) Или вы можете скопировать эти библиотеки в chroot, если вы не доверяете chrooted env, чтобы не повредить их, вот так:

cp -a /usr rootfs/
cp -a /lib rootfs/
cp -a /lib64 rootfs/
Далибор Филус
источник
это создаст дубликаты .. которые не оптимизируются, когда у нас много настроек
yellowandred
1
Это не создает дубликаты, если вы используете первый метод (помеченный как 1). Второй вариант полезен, если вы используете chroot для ненадежной среды. Например, у вас есть раздел с трояном или чем-то еще.
Далибор Филус
4

chrootпытается запустить оболочку, установленную в $SHELLпеременной среды по умолчанию, но ищет ее в новом корневом каталоге, который, похоже, не содержит /bin/bash, поэтому не может запуститься.

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

chroot /your/new/root /bin/foo --options...

Обратите внимание, что путь к команде интерпретируется внутри вашего нового корня, поэтому в этом примере вызываемая программа фактически находится в/your/new/root/bin/foo

crater2150
источник
2
В файле rootfs есть файл / bin / bash, так что в чем проблема
USER3254789
1
для тех, кто отрицал голосование: хотя это и не было проблемой в случае автора плаката, это правильное и неопровержимое объяснение ошибки в вопросе. Если вы видите какую-либо другую проблему, пожалуйста, оставьте комментарий, когда вы что-то отрицаете.
crater2150
2

Я получал ту же ошибку при попытке ssh к учетной записи chrooted на удаленном сервере. В моем случае я пропустил следующий файл в удаленном каталоге lib64. Сервер Centos6.9

ld-linux-x86-64.so.2

Это было исправлено путем выполнения следующего:

cp /lib64/ld-linux-x86-64.so.2 /secure/jail/lib64/
Shawn
источник
не cp -r /lib /lib64 /secure/jailисправил это для меня, но выполнил исправление, мне нужно было что-то из lib и lib64, и я не удосужился выяснить, что именно. (вероятно, потому что у меня был включен multiarch)
hanshenrik
0

вам нужно запустить ldd для bash ldd $(which bash), тогда вы можете найти недостающую зависимость, например, если вы не монтировали / не копировали lib64, для 64 систем это произойдет из-за этой ошибки.

ошибка
источник
0

Если вы выполняете кросс-компиляцию, вам нужно использовать симулятор qemu, который может запустить / mnt / somedir / bin / bash, как только вы скопируете qemu-arm-static (я делаю это для armhf) в / mnt / somedir / usr / bin вы сможете делать chroot.

Проверьте это для более подробной информации: https://blog.lazy-evaluation.net/posts/linux/debian-armhf-bootstrap.html

Джайнам МД
источник
1
Нет никаких признаков того, что это то, что пытается сделать пользователь.
Кусалананда
Ошибки одинаковы для обоих случаев. Если кто-то, кто делает кросс-компиляцию, сталкивается с этой проблемой, он может найти ответ здесь.
Джайнам МД