busybox tar忽略了Ubuntu上的fakeroot,但它适用于OS X

时间:2017-08-02 18:57:02

标签: macos ubuntu busybox fakeroot

在我的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

为什么ubuntu上的busybox没有"掉线"伪造的所有权?

当我使用tar代替busybox tar时,它适用于ubuntu。

其他信息:

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 个答案:

答案 0 :(得分:1)

最有可能的原因是您的busybox是静态链接的。 Fakeroot使用LD_PRELOAD,它在从程序传递到运行时库(glibc)时拦截调用。静态链接的可执行文件对LD_PRELOAD是不可见的,因此对于fakeroot是不可见的。

Fakeroot-ng使用ptrace机制,当它们从程序传递到内核时拦截系统调用。因此,fakeroot-ng可以捕获由静态链接程序执行的系统调用(这是我首先创建fakeroot-ng的原因之一)。

在Mac上,不允许静态链接运行时库。它们甚至不提供运行时库的静态版本。因此,fakeroot没有问题拦截系统调用(这是一件好事,因为fakeroot-ng没有OS-X版本,部分原因是上述原因)。

答案 1 :(得分:0)

我猜到它为什么不起作用:

也许Ubuntu上的busybox使用open() fakeroot无法拦截。

解决方法

我在我的Ubuntu机器上安装了fakeroot-ng,现在它按预期工作了。