创建一个带有假“root”的压缩包

Lee*_*ley 5 tar chroot

我正在 Makefile 中的一些东西看起来像这样:

压缩包:
        mkdir -p tmp/tarball/etc/service
        mkdir -p tmp/tarball/usr/local
        mkdir -p tmp/tarball/opt/myproject
        cd 传感器数据;制作
        cd 传感器隧道;制作设备名称
        cp -r sensorservices tmp/tarball/etc/service
        # 在这里制作一个 tarball,例如:
        # chroot tmp/tarball;tar -czvf myproject.tar.gz 。

这个想法是,我将能够进入该./tmp/tarball目录,并创建一个 tarball,当在系统上解压缩时,它会将自身解压缩到/etc/service,/usr/local/opt/myproject.

经典方法似乎是使用,tar -czvf -C tmp/tarball .但这会导致以 .tar 开头的条目的 tar 列表./

我的灵感来自 Go 语言的包,这表明它应该安装:

tar -C /usr/local -xzf go1.0.3.linux-amd64.tar.gz
Run Code Online (Sandbox Code Playgroud)

这对我的用例来说是理想的,我希望能够做到:

tar -C / -xzf myproject.tar.gx
Run Code Online (Sandbox Code Playgroud)

这反过来会将最初的文件提取~/some-working-directory/tmp/tarball/_____/_____,这意味着我可以简单地伪造安装结构。

当然,这可能会更好地通过类似fpm.

我偶然发现了fakechroot,这似乎很有希望,但并不令人惊讶,chroot 中不存在 tar,当我开始进入那个兔子洞时,我只是假设我做错了什么,应该寻求帮助。

Lee*_*ley 3

来自 GNU tar 手册:

tar从存档中提取存档成员时,它会从成员名称中删除所有前导斜杠(“/”)。这会导致存档中的绝对成员名称被视为相对文件名。这允许您将此类成员提取到您想要的任何位置,而不是仅限于在存档中指定的确切目录中提取成员。例如,如果存档成员的名称为“ /etc/passwd”,tar 将提取它,就好像该名称确实是“ etc/passwd”一样。

因此我的 tar 创建看起来像这样:

tar -czvf myproject.tar.gz -C tmp/tarball ./
./
./etc/
./etc/service/
./etc/service/sensorservices/
./usr/
./usr/local/
./opt/
./opt/myproject/
Run Code Online (Sandbox Code Playgroud)

安装时:

sudo tar --directory / -xzf ./myproject.tar.gz
sudo tar -C / -xzf ./myproject.tar.gz
Run Code Online (Sandbox Code Playgroud)

然后一切都会按预期进行,无论好坏。