如何使用 deb 包创建目录并更改其所有者

如何使用 deb 包创建目录并更改其所有者

我需要创建 deb 包来创建日志目录。我想创建目录/var/logs/my_package并将其所有者更改为my_user

文档中有信息我可以创建文件debian/dir。但有信息表明这不是最好的方法。而且没有关于如何更改目录所有者的信息(我正在考虑将chown my_user.my_user /var/logs/my_package其命令放在debian/postinst文件中)。

使用 deb 包创建目录的推荐方法是什么?

答案1

你是对的,你需要一个debian/my_package.postinst文件来执行这样的操作:

#!/bin/sh

#DEBHELPER#

set -e

DIR="/var/log/my_package/"
USER="my_user"

mkdir -p ${DIR}    
if id -u ${USER} > /dev/null 2>&1; then    
    chown ${USER}:${USER} ${DIR}
fi

笔记:脚本在调用之前检查用户是否存在chown

答案2

您不需要创建postinst脚本,但解决方案仍然有点棘手。我dh在以下位置使用通配符debian/rules

#!/usr/bin/make -f
%:
        dh $@

binary:
        dh $@

它完成了所有需要做的事情。但我需要覆盖一些目录的所有权(我们称之为数据)。所以我必须做出一些例外,我使用以下特殊指令:

    override_dh_install:
        dh_install   #calls default *.install and *.dirs installation
        install -d -o www-data -g www-data $(CURDIR)/debian/<package_name>/var/www/<something>/data 

数据目录不需要在*.dirs文件中。但还有一个技巧。Debhelper 包含脚本 dh_fixperms,它会将所有权修复回 root,因此我们也需要覆盖:

override_dh_fixperms:
    dh_fixperms --exclude data

就这些。请记住,数据目录不算作conffile,因此在删除软件包时它将被删除。如果您需要将其设为conffile,那就另当别论了。

答案3

我读到过,如果你必须使用该debian/[<package>.]dirs文件,则意味着你的make install步骤没有正确完成。该步骤应该创建该文件夹。

以下是我发现的问题:

  1. make install无法在除 (对于 Debian 软件包) 之外的目录下安装任何东西,因此如果您想要、等/usr下的目录,它是没用的。/etc/.../var/lib/<package>/...

  2. 如果您mkdir -p ...debian/[<package>.]postinst脚本中使用,则需要使用脚本rmdir ...中的手动将其删除debian/[<package>.].postrm

因此,Marek Šimon 提出的解决方案与我的相同,唯一的区别是我使用chown ...而不是,install -d ...尽管使用install -d ...可以完全避免debian/[<package>.]dirs。就我个人而言,我喜欢在单独的文件中查看我创建的目录列表。它看起来更清晰。

例子

创建目录:

# in debian/package.dirs
/etc/package/magic/configuration
/var/www/package/data

更改所有权:

# in debian/rules
override_dh_fixperms:
    dh_fixperms
    chmod 700 debian/tmp/var/www/package/data
    chown www-data:www-data debian/tmp/var/www/package/data

警告:debian/rules文件使用制表符来缩进目标名称下的代码。这很重要。

如例所示,我也经常更改权限(chmod)。

如果您创建两个或更多包,则需要引入debian/tmp/...器。如果您创建单个包,我不太清楚它是什么(部分原因是我的项目很少有单个包,而且当您添加第二个包时许多路径都会发生变化,所以我总是至少包含一个,package-doc.install即使大部分是空的,这样它就不会改变)。

最后说明

如果您正在创建一个公共 Debian 软件包,并希望 Debian 或 Ubuntu 接受它,那么您可能希望遵循 Sylvain Pineau 的解决方案。请记住,在清除时,您需要删除您的目录(除非用户在其中创建了自己的文件)。

相关内容