如何检测系统在任何给定时刻是否正在被更改?

如何检测系统在任何给定时刻是否正在被更改?

我定期创建整个文件系统快照(使用 BTRFS)。我需要防止我的脚本在系统处于不一致状态时拍摄快照,例如在应用程序安装或完整系统升级过程中。

  1. 我怎样才能可靠地检测到此类行为?

就像我们不能调用多个apt实例一样,我也想为apt install(或任何其他包管理软件)创建一个锁,以确保快照操作已完成(可能需要几秒钟,具体取决于磁盘 IO)。

  1. 如何暂时阻止任何包管理应用程序运行?

答案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

或者,老实说,要意识到启动快照的那一刻就定义了快照中的内容。制作快照时,存储性能可能会变差,但启动后所做的更改不会影响快照本身。

事实上,快照是一个相当轻量级的东西 - 它所做的只是说“如果您修改这个数据或元数据块,制作它的副本,将其标记为当前有效的内容并将其标记为对上一个快照有效的内容,并保留它”。这是写时复制文件系统完全正常的操作模式。不同之处在于,当您获得不属于快照的数据时,复制(并修改副本)后的原始数据将返回到可用盘区/元数据块池中。

相关内容