Пришлось обновить 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
Убедитесь, что ваша система установки и носитель, который вы используете для 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.
Если / 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 не существует, или общая библиотека, необходимая для файла или переводчик не найден .
Итак, поехали.