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 版本,部分原因是上述原因)。
在我的 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 版本,部分原因是上述原因)。