我需要创建 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
步骤没有正确完成。该步骤应该创建该文件夹。
以下是我发现的问题:
make install
无法在除 (对于 Debian 软件包) 之外的目录下安装任何东西,因此如果您想要、等/usr
下的目录,它是没用的。/etc/...
/var/lib/<package>/...
如果您
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 的解决方案。请记住,在清除时,您需要删除您的目录(除非用户在其中创建了自己的文件)。