busybox tar 在 Ubuntu 上忽略 fakeroot 但它在 OS X 上有效

busybox tar ignores fakeroot on Ubuntu but it works on OS X

在我的 mac machine 上,这按预期工作:

#!/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 machine 上我得到:

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

为什么 ubuntu 上的 busybox 不是 "fall" 伪造的所有权?

当我使用 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.

我猜为什么它不起作用:

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

解决方法

我在我的 Ubuntu 机器上安装了 fakeroot-ng,现在它可以正常工作了。

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

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

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