busybox tar игнорирует fakeroot в Ubuntu, но работает в OS X

На моем Mac-компьютере это работает как положено:

#!/bin/sh -euf
touch test.sh
chown 888:888 test.sh
busybox tar -czvf out.tar.gz test.sh

Призвание:

$ fakeroot -- ./generateArchive.sh
$ busybox tar -tzvf out.tar.gz
-rw-r--r-- 888/888         0 2017-08-02 20:52:50 test.sh

Но на моей виртуальной машине с Ubuntu я получаю:

$ fakeroot -- ./generateArchive.sh
$ busybox tar -tzvf out.tar.gz
-rwxrwxr-x marco/marco       215 2017-08-02 20:53:32 test.sh

Почему busybox на Ubuntu не "поддался" поддельной собственности?

Он работает на Ubuntu, когда я использую tar вместо busybox tar,

Дополнительная информация:

Mac (10.12.5): 
    fakeroot version 1.20.2
    BusyBox v1.20.0.git (2017-05-17 10:01:40 CEST) multi-call binary.
Ubuntu (14.04.5 LTS):
    fakeroot version 1.20
    BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) multi-call binary.

2 ответа

Решение

Скорее всего, причина в том, что ваш busybox был статически связан. Fakeroot использует LD_PRELOAD, который перехватывает вызовы при их передаче из программы в библиотеку времени выполнения (glibc). Статически связанные исполняемые файлы невидимы для LD_PRELOAD и, следовательно, для fakeroot.

Fakeroot-ng использует механизм ptrace, который перехватывает системные вызовы при их передаче из программы в ядро. Таким образом, fakeroot-ng может перехватывать системные вызовы, выполняемые статически связанными программами (что является одной из причин, по которой я изначально создал fakeroot-ng).

На Mac статическое связывание библиотеки времени выполнения не допускается. Они даже не предоставляют статическую версию библиотеки времени выполнения. Таким образом, у fakeroot нет проблем с перехватом системных вызовов (что хорошо, потому что у fakeroot-ng нет версии OS-X, частично по причине, указанной выше).

Я догадываюсь, почему это не работает:

Возможно busybox в Ubuntu использует open() который fakeroot не может перехватить.

Обходной путь:

Я установил fakeroot-ng на моей машине с Ubuntu и теперь она работает как положено.

Другие вопросы по тегам