我定期创建整个文件系统快照(使用 BTRFS)。我需要防止我的脚本在系统处于不一致状态时拍摄快照,例如在应用程序安装或完整系统升级过程中。
- 我怎样才能可靠地检测到此类行为?
就像我们不能调用多个apt
实例一样,我也想为apt install
(或任何其他包管理软件)创建一个锁,以确保快照操作已完成(可能需要几秒钟,具体取决于磁盘 IO)。
- 如何暂时阻止任何包管理应用程序运行?
答案1
我怎样才能可靠地检测到此类行为?
/var/lib/dpkg/lock
是apt的锁定文件,通过它可以检测apt操作是否正在进行:
if (( $(sudo lsof -t /var/lib/dpkg/lock | wc -w) > 0 )) ; then
echo "dpkg is running."
fi
如何暂时阻止任何包管理应用程序运行?
防止锁定文件打开,例如。设置不可变属性:
sudo chattr +i /var/lib/dpkg/lock # "chattr -i" to release
或者,老实说,要意识到启动快照的那一刻就定义了快照中的内容。制作快照时,存储性能可能会变差,但启动后所做的更改不会影响快照本身。
事实上,快照是一个相当轻量级的东西 - 它所做的只是说“如果您修改这个数据或元数据块,制作它的副本,将其标记为当前有效的内容并将其标记为对上一个快照有效的内容,并保留它”。这是写时复制文件系统完全正常的操作模式。不同之处在于,当您获得不属于快照的数据时,复制(并修改副本)后的原始数据将返回到可用盘区/元数据块池中。