使用假的“root”创建一个 tarball

使用假的“root”创建一个 tarball

我正在 Makefile 中处理一些类似这样的内容:

压缩包:
        mkdir -p tmp/tarball/etc/service
        mkdir -p tmp/tarball/usr/local
        mkdir -p tmp/tarball/opt/myproject
        cd sensordatad;制作
        cd sensortunneld;制作设备名称
        cp -r 传感器服务 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 列表./

我受到 Go 语言包的启发,它表明应该使用以下命令安装它:

tar -C /usr/local -xzf go1.0.3.linux-amd64.tar.gz

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

tar -C / -xzf myproject.tar.gx

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

当然,使用类似的东西可能更好地实现这一点fpm,我并没有排除这种可能性,但我并不热衷于重量级解决方案,而且我认为不借助 Ruby 就能做到这一点。

我偶然发现了fakechroot,这看起来很有希望,但不奇怪的是,tar 在 chroot 中不存在,当我开始进入那个兔子洞时,我只是认为我做错了什么,应该寻求帮助。

答案1

来自 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/

安装时:

sudo tar --directory / -xzf ./myproject.tar.gz
sudo tar -C / -xzf ./myproject.tar.gz

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

答案2

你为什么要把它弄得这么复杂?

cd tmp/tarball; tar -czvf ../../myproject.tar.gz .

相关内容