我正在为嵌入式 Linux 系统制定一个更新协议,但我想为用户提供回滚更新的选项,如果它扰乱了他们的系统,特别是对于 alpha/beta 版本。所以我发现了 cp 命令选项来自动备份被覆盖的文件。
这太棒了!但必须有一种简单的方法来使用自动备份文件回滚这些更改,对吗?我不想强迫用户自己去查找所有已更改文件的备份。
先谢谢您的帮助!
答案1
如果您有空间拥有两个并行的文件系统树,您可能会有类似/bin
和 的东西/bin.old
。对所有顶级目录重复此操作。
安装将是创建/bin.new
、从实时系统复制、覆盖新文件,然后切换/bin
到/bin.old
/ /bin.new to
bin` 等的情况。回滚将是切换回来。
# Prepare a new filesystem tree
#
rm -rf /*.new /*.old
for item in /*
do
cp -al "$item" "$item.new" # Links avoid using too much disk space
done
# Overlay. Because we linked in the previous step, we must remove
# (or rename) each file that we're going to change. Do not change
# or replace any file in situ
#
# If you have space for two full filesystem trees you could just copy
# instead of linking, which could simplify this update code section.
#
echo installation code goes here
# Switch over
#
OPATH="$PATH" PATH="/bin.old:/bin:/bin.new:$PATH"
for item in /*.new
do
live="${item%.new}"
mv -f "$live" "$live.old"
mv -f "$item" "$live"
done
# Post-installation steps (rebuild kernel links, etc.)
#
echo post-installation code goes here
您可能希望将重要的系统二进制文件放在无法更新的位置,以便回滚不会被糟糕的 shell 烧毁。然而,这有点像先有鸡还是先有蛋的情况,根据定义,您无法更新此代码。棘手。