Chroot не находит `/ bin / bash`

Пришлось обновить Cygwin bash из соображений безопасности.

старый bash = 4.1.10 (4) -release (i686-pc-cygwin) около 2009 г.

$ echo $PS1

\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$

новый bash = 4.4.12 (3) -release (i686-pc-cygwin) около 2016 г.

Чтобы получить тот же внешний вид, пришлось добавить к .bashrc :

#

GREEN="\[$(tput setaf 2)\]"

YELLOW="\[$(tput setaf 3)\]"

RESET="\[$(tput sgr0)\]"

PS1="\n${GREEN}\u@\h ${YELLOW}\w${RESET}\n$ "

cd $HOME

#

примечание: включая cd $ HOME

6
18.01.2017, 12:33
2 ответа

Убедитесь, что ваша система установки и носитель, который вы используете для chroot, имеют одинаковую арку.

Раздел, который вы монтируете в / mnt, является вашим разделом / из установочной системы?

Я исключаю этот путь.

Для файловой системы ext *.

sudo mount / dev / sdxY / mnt

Для отдельного раздела / boot в режиме BIOS

sudo mount / dev / sdzY / mnt / boot

Для режима efi

sudo mount / dev / sdwY / mnt / boot / efi

Смонтировать файловые системы vituelle

для каталога в / dev / dev / pts / proc / sys / run; выполните sudo mount --bind $ dir / mnt / $ dir; done

Для доступа к сети

cp -a /etc/resolv.conf /mnt/etc/resolve.conf

then

sudo chroot / mnt / bin / bash

Но я использую только его с Debian и Ubuntu.

4
27.01.2020, 20:21

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

В моей системе:

$ ldd $( command -v bash )
/usr/local/bin/bash:
        Start            End              Type Open Ref GrpRef Name
        0000115f08700000 0000115f08a0c000 exe  1    0   0      /usr/local/bin/bash
        00001161f6a2e000 00001161f6c88000 rlib 0    1   0      /usr/lib/libtermcap.so.14.0
        00001161bc41e000 00001161bc629000 rlib 0    1   0      /usr/local/lib/libintl.so.6.0
        000011614b1de000 000011614b4dd000 rlib 0    2   0      /usr/local/lib/libiconv.so.6.0
        00001161bd091000 00001161bd35b000 rlib 0    1   0      /usr/lib/libc.so.89.2
        000011612ef00000 000011612ef00000 rtld 0    1   0      /usr/libexec/ld.so

В отличие от:

$ ldd $( command -v sh )
/bin/sh:
        Start            End              Type Open Ref GrpRef Name
        000007ca3c446000 000007ca3c6c6000 dlib 1    0   0      /bin/sh

Я использую OpenBSD. Формат вывода ldd будет отличаться в системе Linux, но та же самая важная информация (какие библиотеки используются совместно и где они) также должна отображаться в Linux.

Когда я пытаюсь использовать очень упрощенный chroot, который содержит только / bin / sh и / bin / bash ( doas - это OpenBSD " sudo replace"):

$ doas chroot -u kk t /bin/sh
/bin/sh: No controlling tty (open /dev/tty: No such file or directory)
/bin/sh: warning: won't have full job control
$ /bin/bash
Abort trap

Обратите внимание, что я получил оболочку ( / bin / sh ), но / bin / bash не работает. Ошибка отличается от вашей, но, как я полагаю, имеет ту же причину. Выполнение / bin / bash напрямую с помощью команды chroot просто дает однословное сообщение «Прервать», опять же, предположительно из-за той же проблемы с библиотеками.

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

Объяснение ошибки «Нет такого файла или каталога» в Linux:

Я был немного сбит с толку, почему в Linux возникла ошибка «Нет такого файла или каталога», поэтому я провел тест через strace .

Вызов execve () , который должен был запустить оболочку, возвращает ENOENT:

execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)

... так что я подумал, что что-то не так с нахождением / bin / bash . Однако, прочитав руководство execve (2) , я увидел:

ENOENT Имя файла файла или скрипт или интерпретатор ELF не существует, или общая библиотека, необходимая для файла или переводчик не найден .

Итак, поехали.

14
27.01.2020, 20:21

Теги

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