2017-08-02 33 views
-1

在我的Mac機這只是按預期工作:busybox的焦油忽略的fakeroot在Ubuntu,但它適用於OS X

#!/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不會「僞造」所有權?

它適用於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. 

回答

1

最有可能的原因是你的busybox是靜態鏈接。 fakeroot的使用LD_PRELOAD,因爲它們從程序傳遞到運行時間庫(glibc的),其截取的呼叫。靜態鏈接的可執行文件對LD_PRELOAD不可見,因此對fakeroot不可見。

fakeroot的-NG使用ptrace的機構,其攔截系統時,他們從程序內核傳遞呼叫。這樣,fakeroot的-NG,可以捕獲通過靜態鏈接程序(這是我首先創建的fakeroot-NG的原因之一)執行的系統調用。

在Mac上,靜態鏈接的運行時庫是不允許的。他們甚至不提供運行時庫的靜態版本。因此,fakeroot在攔截那裏的系統調用時沒有問題(這是一件好事,因爲fakeroot-ng沒有OS-X版本,部分由於上述原因)。

0

我有一個猜測爲什麼它不工作:

也許busybox的Ubuntu上使用open()fakeroot無法攔截。

解決方法

我我的Ubuntu機器上安裝fakeroot-ng,現在它按預期工作。