语境:
想要在特殊备份期间锁定etckeeper/apt挂钩活动。
目标是保持整个包的完整性,例如,等到任何包安装完成,然后在特殊备份完成之前阻止新的安装开始。
在cron下发现 shell 脚本似乎试图锁定
/var/cache/etckeeper/packagelist.pre-install
但实际上它不是原子执行的,所以它是有缺陷的。我认为cron shell 脚本是Ubuntu 16.04安装的一部分,而不是etckeeper版本的一部分。 有缺陷的锁码如下所示。
搜索有关用作锁定文件的etckeeper文档。/var/cache/etckeeper/packagelist.pre-install
找不到任何文档。但是确实找到了一个脚本文件,它写入/var/cache/etckeeper/packagelist.pre-install
而不将其视为锁定文件。此时我假设它/var/cache/etckeeper/packagelist.pre-install
不打算用作etckeeper的锁定文件接口。 Etckeeper 内部脚本不
/var/cache/etckeeper/packagelist.pre-install
视为锁定文件,如下所示。
问题 1:是否有(如果有的话)关于 etckeeper 锁定机制的文档,或开发人员门户以发出澄清请求?
在stackexchange网站上有很多关于使用
/var/lib/apt/lists/lock (we call it apt lock below)
和
/var/lib/dpkg/lock (we call it dpkg lock below)
分别作为apt和dpkg的锁。所有的通信都与卡住的锁有关,如何诊断它们,以及如何解开它们。但是,我发现没有引用官方apt和dpkg文档来指定这些锁定文件用作正式接口。
问题 2:是否有(如果有)关于apt锁定机制和/或dpkg锁定机制作为公共接口的文档?
有缺陷的锁定尝试 shell 脚本,可能由Ubuntu 16.04提供:
$ sudo cat /etc/cron.daily/etckeeper
#!/bin/sh
set -e
if [ -x /usr/bin/etckeeper ] && [ -e /etc/etckeeper/etckeeper.conf ]; then
. /etc/etckeeper/etckeeper.conf
if [ "$AVOID_DAILY_AUTOCOMMITS" != "1" ]; then
# avoid autocommit if an install run is in progress
lockfile=/var/cache/etckeeper/packagelist.pre-install
if [ -e "$lockfile" ] && [ -n "$(find "$lockfile" -mtime +1)" ]; then
rm -f "$lockfile" # stale
fi
if [ ! -e "$lockfile" ]; then
AVOID_SPECIAL_FILE_WARNING=1
export AVOID_SPECIAL_FILE_WARNING
if etckeeper unclean; then
etckeeper commit "daily autocommit" >/dev/null
fi
fi
fi
fi
Etckeeper内部 shell scipt 写入packagelist.pre-install
而不将其视为锁 - 因此我不认为它打算用作锁接口。
$ sudo cat /etc/etckeeper/pre-install.d/10packagelist
#!/bin/sh
# This list will be later used when committing.
mkdir -p /var/cache/etckeeper/
etckeeper list-installed > /var/cache/etckeeper/packagelist.pre-install
etckeeper list-installed fmt > /var/cache/etckeeper/packagelist.fmt
cron 作业被
/var/cache/etckeeper/packagelist.pre-install
视为正在处理安装的证据,因此它不应该立即存档任何内容。该文件不应该是锁定文件,但 cron 作业正在使用它作为替代文件。但是我不会特别担心
etckeeper
它拥有或没有的任何锁定文件。如果您想要托管树的一致备份etckeeper
,请使用 VCS 的功能(但不要忘记任何被忽略的文件)。这些
dpkg
锁被记录为(尽管是简短的)作为公共接口在frontend.txt
(/usr/share/doc/dpkg-dev/frontend.txt
indpkg-dev
)中。