LINUX.ORG.RU
ФорумAdmin

chroot ругается на отсутствие присутствующего файла

 


0

2
# ls sandbox-centos5/bin/
sh

# md5sum /bin/sh 
4e4083f7e9f39db3099c26116127458b  /bin/sh

# md5sum sandbox-centos5/bin/sh 
4e4083f7e9f39db3099c26116127458b  sandbox-centos5/bin/sh

# chroot sandbox-centos5/ /bin/sh
chroot: failed to run command `/bin/sh': No such file or directory

Я чего-то недопонимаю, видимо? Подскажите, что не так.

Спасибо!

$ mkdir -p box/bin
$ ldd /bin/sh
	linux-vdso.so.1 =>  (0x00007fffd39fe000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f667f970000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f667fd52000)
$ cp /bin/sh box/bin
$ sudo chroot box /bin/sh
chroot: failed to run command ‘/bin/sh’: No such file or directory
$ mkdir -p box/lib/x86_64-linux-gnu
$ mkdir -p box/lib64
$ cp /lib64/ld-linux-x86-64.so.2 box/lib64
$ cp /lib/x86_64-linux-gnu/libc.so.6 box/lib/x86_64-linux-gnu
$ sudo chroot box /bin/sh
#
io ★★
()
Ответ на: комментарий от io

Работает! Сейчас попробовал под strace запустить свою chroot box/bin/bash, чтобы понять, смог ли бы я сам найти проблему, но понятнее не стало:

lstat64("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64("box", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
chroot("box")                           = 0
chdir("/")
execve("/bin/bash", ["/bin/bash", "-i"], [/* 16 vars */]) = -1 ENOENT (No such file or directory) 

Спасибо за помощь!

pianolender ★★★
() автор топика
Ответ на: комментарий от gh0stwizard

Согласен, но я их и не путал. В выхлопе strace, я так думал, должна быть какая-то информация о том, какие конкретно проблемы возникают, ясно же, что не может быть no such file of directory, если файл есть. Но в выхлопе strace я не увидел ничего, что могло бы подтолкнуть меня к решению, предложенному io

pianolender ★★★
() автор топика
Ответ на: комментарий от pianolender

Из текста выше ясно, что execve нетривиальный вызов. Он сам что-то открывает, запускает и т.п. И так как это все происходит за пределами user-кода, то strace показывать не обязан. Однако ничто не мешает воспользоваться последней соломинкой: «если ничего не помогает, таки прочти документацию». Для «man execve», в частности, имеем:

        If  the  executable  is an a.out dynamically linked binary executable
       containing shared-library stubs, the Linux dynamic linker ld.so(8) is
       called  at  the  start  of execution to bring needed shared libraries
       into memory and link the executable with them.

       If the executable is a dynamically linked ELF executable, the  inter‐
       preter  named  in  the  PT_INTERP  segment is used to load the needed
       shared libraries.  This interpreter is  typically  /lib/ld-linux.so.2
       for  binaries linked with glibc 2.  (For binaries linked with the old
       Linux libc5, the interpreter was typically /lib/ld-linux.so.1.)

Для «man 8 ld.so» имеем:

SEE ALSO
       ldd(1), getauxval(3), rtld-audit(7), ldconfig(8), sln(8)

Ну и остается понять как же работает ldd. Оставляю как упражнение.

io ★★
()

Если ты не способен к самообучению, то просто возьми один из скриптов, которые строят чрут. Они исп. ldd и копируют сам бинарник + все нужные ему библиотеки, а так же минимально необходимый набор файлов /etc

jailer - Builds and maintains chrooted environments

makejail - Automatically create chroot jails for programs

schroot - Execute commands in a chroot environment

most-fucktum
()
Ответ на: комментарий от most-fucktum

jailtool - tool to build chroot-jails for daemons

linux-user-chroot - setuid helper for making bind mounts and chrooting

most-fucktum
()
Ответ на: комментарий от io

Да, документация - это хорошо. Особенно интересно читать про низкий уровень.

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

Был сервер с Сentos5 и initrd, который падал в панику при загрузке. Хотелось посмотреть изнутри initrd, что происходит, но вызов /bin/bash, всунутого в перепакованный initrd, ничего не давал. Когда я скопировал в initrd также нужные динамические библиотеки, bash запустился, и я смог понять, что поехали имена md-шных массивов (из-за того, что каким-то образом система стала опредалять кусочки одного массива как кусочки разных), и initrd пытался цеплять не тот массив. Исправил ошибки, всё заработало.

Спасибо ещё раз за просвещение, полезный ресурс. )

pianolender ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.