LVM 快照如何在 PE 级别工作?什么存储在哪里?当快照用尽 COW 空间时会丢失哪些数据?
(以下描述+解释)
我在 VirtualBox 上试验了 LVM 和快照,注意到了一些奇怪的行为。我想看看系统在各种情况下会如何反应,所以我在虚拟机上安装了 Lubuntu 13.04,并选中了 LVM 选项。安装完系统后,我又在虚拟机上添加了另一个 8GB 驱动器,用于将vgcreate
卷组扩展lubuntu-vg
到,然后使用/dev/sdb
拍摄了 的快照,大小为 6.74G (请注意,下面记录的命令是在我创建快照之前运行的)lubuntu-vg/root
lvcreate
lubuntu-vg/rootsnap
lvdisplay
用户@user-VirtualBox:~$ sudo fdisk /dev/sda 命令(m 获取帮助):p 磁盘 /dev/sda:8589 MB,8589934592 字节 255 个磁头,63 个扇区/磁道,1044 个磁柱,总共 16777216 个扇区 单位 = 1 * 512 = 512 字节的扇区 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标识符:0x000c4cee 设备启动开始结束块ID系统 /dev/sda1 * 2048 499711 248832 83 Linux /dev/sda2 501758 16775167 8136705 5 扩展 /dev/sda5 501760 16775167 8136704 8e Linux LVM 命令(m 获取帮助):q 用户@用户-VirtualBox:~$ sudo lvdisplay --- 逻辑卷 --- LV 路径 /dev/lubuntu-vg/root LV 名称根 VG 名称 lubuntu-vg LV UUID JeyQ7Z-dtu1-Yr5R-hTTU-6Vya-Dr67-qSXwTf LV 写访问 读/写 LV 创作主机,时间 lubuntu,2013-05-02 18:09:41 -0500 LV 状态可用 # 打开 1 LV 大小 6.73 GiB 当前 LE 1723 段 1 分配继承 自动预读扇区 - 目前设置为 256 块设备 252:0 --- 逻辑卷 --- LV 路径 /dev/lubuntu-vg/swap_1 LV 名称 swap_1 VG 名称 lubuntu-vg LV UUID ZkyAxG-mFB0-zhDH-GjfK-CHlz-RbMc-ilumbj LV 写访问 读/写 LV 创作主机,时间 lubuntu,2013-05-02 18:09:41 -0500 LV 状态可用 # 打开 2 LV 尺寸 1020.00 MiB 当前 LE 255 段 1 分配继承 自动预读扇区 - 目前设置为 256 块设备 252:1 用户@用户-VirtualBox:~$ sudo vgdisplay --- 卷组 --- VG 名称 lubuntu-vg 系统 ID 格式化 lvm2 元数据区域 2 元数据序列号 8 VG 访问 读/写 VG 状态可调整大小 最高等级 0 当前 LV 2 打开 LV2 最大 PV 0 电流 PV 2 幕 PV 2 VG 大小 15.75 GiB PE 大小 4.00 MiB 总 PE 4033 分配 PE / 大小 1978 / 7.73 GiB 空闲 PE / 大小 2055 / 8.03 GiB VG UUID 2ZEhCz-Q988-oBAc-nE14-MdUs-j7un-2oicHD 用户@用户-VirtualBox:~$ sudo pvdisplay --- 物理体积 --- PV 名称 /dev/sda5 VG 名称 lubuntu-vg PV 大小 7.76 GiB / 不可用 2.00 MiB 可分配 是 PE 大小 4.00 MiB 1986 年体育总成绩 免费 PE 8 分配 PE 1978 PV UUID OYCQrn-p7PH-4D52-4xRR-xphi-9DyL-Klys3t --- 物理体积 --- PV 名称 /dev/sdb VG 名称 lubuntu-vg PV 大小 8.00 GiB / 不可用 4.00 MiB 可分配 是 PE 大小 4.00 MiB 总 PE 2047 免费 PE 2047 分配的 PE 0 PV UUID ErizVU-o1Vf-73GO-Pkwf-PeM9-xoWo-snSmm2
然后我下载了一些更新来填充/var/cache/apt/archives
,然后关闭系统。为了模拟驱动器故障,我从 VirtualBox 设置中删除了 /dev/sdb,然后重新启动机器。它无法挂载,因为它找不到lubuntu-vg/root
。此时,我试图弄清楚我的系统的 LE 和 PE 配置“是什么样子”。
我试图想象我的 LVM 设置的布局会是什么样子;在 上/dev/sda
,它会在开始时分配一些 PE 用于交换,然后将其余的 PE 分配给lubuntu-vg/root
。然后我扩展lubuntu-vg
到/dev/sdb
,并拍摄快照,我想象它会将大部分 PE 分配给/dev/sdb
。我猜现在使用与最初lubuntu-vg/rootsnap
相同的 PE ,现在(使用 中的缓存 .debs )混合使用旧 PE 和新分配的 PE以实现 COW 目的。所以对我来说,当我删除(据说是 COW PE)时,机器无法启动,因为它找不到。lubuntu-vg/root
lubuntu-vg/root
/var/cache/apt/archives
/dev/sdb
/dev/sdb
lubuntu-vg/root
然后我重新添加/dev/sdb
、启动并删除了快照。此时,我预计如果我/dev/sdb
再次删除,系统将无法启动,因为 COW PE 位于该驱动器上。但是,当我尝试这样做时,系统能够成功启动,并且 .debs 仍然在 中 /var/cache/apt/archives
,尽管/dev/sdb
没有附加。
这怎么可能?我以为 COW PE 位于 上,但我删除了它。当我删除快照时,/dev/sdb
LVM 是否将 COW PE 移动到,还是在我创建快照时进行了其他一些奇特的移动?/dev/sda
我有一个想法,也许当 LVM 分配 PE 时,它会虚拟地进行分配,而不会在创建 LV 时实际物理保留它们,从而允许 LV 的 PE 相互交错。如果是这样,为什么在/dev/sdb
移除后系统无法启动?那么 COW PE 不会打开吗/dev/sda
?
答案1
创建快照时,会分配 PE 来保存 COW 块。如果 PE 已满或无法访问,则死的是快照,而不是原点。您的系统应该能够在没有 /dev/sdb 的情况下正常启动,因为启动不需要快照。如果不能,那么某处就有错误。
另外你不必想象PE分配在哪里,你可以运行pvdisplay -m
去看看。