该dh_usrlocal手册页听起来有点神秘的对我说:
它在包构建目录中找到 usr/local 的子目录,并删除它们,用维护者脚本片段(除非使用 -n )替换它们以在安装时创建目录,并在删除包时以某种方式删除它们符合 Debian 政策。这些片段由 dh_installdeb 插入到维护者脚本中。有关 debhelper 维护者脚本片段的说明,请参阅 dh_installdeb(1)。
Mainainer 脚本,片段,-n... 好的,但目的是什么?它真的只是创建(空?)目录吗?
好心人能不能用更实际的方式给我解释一下?我应该阅读政策的哪一部分?我应该关心我的应用程序是否安装PREFIX=/usr?
目的是通过该包帮助遵守政策。根据 Debian 政策(以及 IIRC、文件系统层次标准或FHS),官方 Debian 软件包不允许拥有以下文件或目录/usr/local- 该目录树属于本地系统管理员。
从https://www.debian.org/doc/debian-policy/ch-opersys.html#s9.1.2:
(粗体是我加的)
9.1.2. 特定于站点的程序
根据 FHS 的要求,包不得将任何文件放在 /usr/local 中,无论是将它们放入文件系统存档中以供 dpkg 解压缩,或者通过在维护者脚本中操作它们。
但是,该包可能会在 /usr/local 下创建空目录,以便系统管理员知道将特定于站点的文件放在哪里。这些不是 /usr/local 中的目录,而是 /usr/local 中目录的子目录。如果这些目录 (/usr/local/*/dir/) 为空,则应在删除软件包时将其删除。
请注意,这仅适用于 /usr/local 下的目录,而不适用于 /usr/local 中的目录。包不得在目录 /usr/local 本身中创建子目录,FHS 第 4.5 节中列出的除外。但是,您可以根据需要在它们下面创建目录。您不得删除 4.5 中列出的任何目录,即使它们是您创建的。
由于 /usr/local 可以从远程服务器以只读方式挂载,因此这些目录必须由 postinst 和 prerm 维护者脚本创建和删除,并且不能包含在 .deb 存档中。如果这些操作中的任何一个失败,这些脚本不得失败。
例如,emacsen-common 包可能包含类似
Run Code Online (Sandbox Code Playgroud)if [ ! -e /usr/local/share/emacs ]; then if mkdir /usr/local/share/emacs 2>/dev/null; then if chown root:staff /usr/local/share/emacs; then chmod 2775 /usr/local/share/emacs || true fi fi fi在它的 postinst 脚本中,以及
Run Code Online (Sandbox Code Playgroud)rmdir /usr/local/share/emacs/site-lisp 2>/dev/null || true rmdir /usr/local/share/emacs 2>/dev/null || true在 prerm 脚本中。(注意,这种形式是为了保证如果脚本中断,目录/usr/local/share/emacs 仍然会被删除。)
如果您确实在 /usr/local 中为包的本地添加创建了一个目录,则应确保 /usr/local 中的设置优先于 /usr 中的等效项。
但是,由于 /usr/local 及其内容仅供本地管理员使用,因此包不能依赖于 /usr/local 中文件或目录的存在与否才能正常运行。
/usr/local 目录本身和包创建的所有子目录应该(默认情况下)具有权限 2775(组可写和设置组 ID)并且由 root:staff 拥有。
另见https://wiki.debian.org/FilesystemHierarchyStandard
dh_usrlocal按照策略中给出的示例,从包中删除任何此类目录,并用包脚本(.postinst和.prerm脚本)中的代码替换它们,以在安装/卸载时创建/删除它们。
这似乎没有什么实际区别,因为目录仍然在安装时创建并在卸载时删除,但是 Debian 认为一个包不符合策略与任何其他错误一样严重 - 一致和严格遵守策略是Debian 软件包质量保证的一个主要因素。
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |