我即将在我的 CentOS 5 服务器上进行实验性升级。如果升级失败,我希望能够撤消对文件系统的更改。这种情况似乎类似于LVM HOWTO 的第 3.8 节用于 LVM2 读写快照 - 但示例在实际操作方面却有所欠缺。
我该如何提交更改并将它们合并回原始分区?
我该如何恢复更改,将文件系统恢复到其原始状态?如果不直接重启,我是否应该假设我需要重新启动几个服务?
是否可以仅对分区上的某些目录进行快照,或者这是分区范围的操作?
答案1
如果您运行的是 Linux 2.6.33+ 并使用 LVM 2.0.58+,则可以使用 LVM2 / 设备映射器快照合并功能:
lvconvert --merge
请参阅此帖子:http://www.jonnor.com/2010/02/lvm-snapshot-merging-avaliable/
它引用http://kernelnewbies.org/Linux_2_6_33(查看第 5 节,MD/DM)和 2.0.58 版的 LVM 更新日志:ftp://sources.redhat.com/pub/lvm2/WHATS_NEW
但我还不能告诉你如何正确使用它;-)
答案2
我刚刚尝试使用 Ubuntu 进行基于快照的升级。是的,我需要重启几次。首先将原始 root-lv 重命名为其他名称,这样您就可以为快照赋予原始名称(因为升级会产生很多更改,并且快照上的更改比原始更改更快):
# lvrename lvm root root-old
# lvcreate -n root -s lvm/root-old -L 10G
大小应选择适当。然后重新启动,这样“新”lvm/ubuntu 就会以 root 身份挂载,然后您就可以执行升级了。现在您可以测试新版本,甚至通过以下方式切换到旧系统:
# lvrename lvm root root-new
# lvrename lvm root-old root
# reboot
如果您想放弃升级,只需运行(从旧系统)
# lvremove lvm/root-new
如果您想提交更改,只需运行(从旧系统)
# lvconvert --merge lvm/root-new
或者,从新系统
# lvrename lvm root root-new
# lvconvert --merge lvm/root-new
# lvrename lvm root-old root
然后重新启动。由于卷已打开,系统将拒绝立即进行合并。因此,合并将在启动期间启动,并在您已可以使用系统时继续。
哦,顺便说一句:在系统之间切换时,请记住使用适当的内核。由于 /boot 不是 lvm 的一部分,因此新旧内核将并排放置在那里。
答案3
好的,我认为我通过重新阅读 HOWTO 3.8 已经弄清楚了。
- 只读快照(如 LVM1)包含快照创建后的块级差异 - 原始数据仍会发生变化,但快照会保留原始数据的表示。读取从这快照呈现当时出现的数据。
- 读写快照(LVM2 中的默认设置)可以写入:它们是叉原始分区。写入到这快照不改变原来的样子。
快照的工作方式是将原始数据进行块级更改。因此,当原始数据被写入时,会发生以下情况:
- 有东西试图写入原文。
- 读取原始数据,并将原始数据中的块复制到快照。
- 原文发生了改变。
- 快照包含“反向差异”——使原始内容看起来像创建快照时一样的变化。
因此,丢弃快照根本不会对原始内容产生影响 - 因为原始内容已被更改,而快照仅包含这些更改的列表。
回答我自己的问题:
使用 LVM 创建新快照。如果可以将更新配置为写入快照挂载点,请使用 R/W 快照。否则,RO 或 R/W 都可以。
然后:
- 如果写信给读/写快照挂载点,犯罪将快照写入原始文件,然后恢复扔掉快照。
- 如果写信给原来的挂载点,犯罪丢掉快照,然后恢复通过从快照写入原始内容。
我还没有找到专门用于执行此合并的工具 - 而且,鉴于我的场景并不完全符合快照的预期用途,可能没有这样的工具。这听起来像是 rdiff 的工作。
答案4
- 没有理由合并一些。只需删除快照,源 LV 保持更改
- 需要合并才能恢复更改
lvconvert --merge <snapshot name>
- LVM 与块设备配合使用。任何与 FS 相关的更改都应根据 FS 类型通过特殊实用程序(xfs_growfs、e2fsck 等)完成
快照“冻结”原始 LV 的状态。删除快照意味着忘记该状态。合并快照意味着返回到该状态
但在 LVM 内部,它将重写的数据保存在快照中:确保快照大小满足 LV 和快照上预期的更改量