我在LVM之上有一个btrf卷。 现在我想在lvm级别上做一个快照(而不是在btrfs级别上)。 但是,每次创buildLVM快照时,btrfs都会将装入的块设备更改为快照,就像我正在使用某种–bind安装选项一样。
情况:
#mount | grep libvirt / var / lib / libvirt / images上的/ dev / dm-4typesbtrfs(rw,relatime,space_cache) #ls -l / dev / mapper | grep dm-4 lrwxrwxrwx 1 root root 7 17:10:17 system-vm_disks - > ../dm-4 #lvcreate -s / dev / system / vm_disks -n vm_backup -L 32G 创build逻辑卷“vm_backup” #mount | grep libvirt / var / lib / libvirt / images上的/ dev / dm-5typesbtrfs(rw,relatime,space_cache) #ls -l / dev / mapper | grep dm-5 lrwxrwxrwx 1 root root 7Mär17 01:18 system-vm_backup - > ../dm-5 #mount / dev / system / vm_backup / mnt / test #touch / mnt / test / touchME #ls -l / var / lib / libvirt / images / touchME -rw-r - r - 1 root root 0 17 17:16 / var / lib / libvirt / images / touchME
当我删除快照时:
#umount / mnt / test #lvremove / dev / system / vm_backup 你真的想删除活跃的逻辑卷vm_backup吗? [y / n]:y 逻辑卷“vm_backup”已成功删除 #mount | grep libvirt / var / lib / libvirt / images上的/ dev / dm-4typesbtrfs(rw,relatime,space_cache) #ls -l / dev / mapper | grep dm-4 lrwxrwxrwx 1 root root 7Mär17 01:21 system-vm_disks - > ../dm-4 #ls -l / var / lib / libvirt / images / touchME -rw-r - r - 1 root root 0 17 17:16 / var / lib / libvirt / images / touchME
我希望我的快照是一个真正的快照,不像一个–bind挂载。 我正在使用LVM快照通过rsync将一致的系统状态备份到我们的备份服务器。 我不想使用btrfs快照出于各种原因:
我的系统:
#uname -a Linux笔记本电脑3.12-1-amd64#1 SMP Debian 3.12.9-1(2014-02-01)x86_64 GNU / Linux #lvm版本 LVM版本:2.02.104(2)(2013-11-13) 资料库版本:1.02.83(2013-11-13) 驱动程序版本:4.26.0 #btrfs --version Btrfs v3.12
我必须使用至less内核3.9或更新版本,因为我使用Linux 3.9或更新版本提供的IPv6 NAT特性(是的,我知道你不应该使用IPv6的NAT,但那是另外一个故事)。
谢谢你的帮助!
编辑:
我用dd和loop设备做了一些实验。 这种行为并不特定于LVM。
testing:
#mkfs.btrfs / dev / loop0 [...] #mount / dev / loop0原来的 #touch original / original_file #ls -l原件 -rw-r - r-- 1 root root 0 Mar 28 21:42 original_file #dd if = / dev / loop1 of = / dev / loop1 509312 + 0条logging 509312 + 0logging出来 260767744字节(261 MB)复制,1.76431 s,148 MB / s #mount / dev / loop1 clone #touch clone / expected_clone_file #ls -l克隆 -rw-r - r-- 1 root root 0 Mar 28 21:44 expected_clone_file -rw-r - r-- 1 root root 0 Mar 28 21:42 original_file #ls -l原件 -rw-r - r-- 1 root root 0 Mar 28 21:44 expected_clone_file -rw-r - r-- 1 root root 0 Mar 28 21:42 original_file #umount克隆 #umount原创 #mount / dev / loop1 clone #ls -l克隆 -rw-r - r-- 1 root root 0 Mar 28 21:42 original_file #umount克隆 #mount / dev / loop0原来的 #ls -l原件 -rw-r - r-- 1 root root 0 Mar 28 21:44 expected_clone_file -rw-r - r-- 1 root root 0 Mar 28 21:42 original_file
因此,无论何时尝试使用已克隆的btrfs文件系统安装新设备,最终都会使用旧的已挂载设备(但mount的输出中没有任何内容正确指示此设置,如您在上面的LVM实验中所见)。 所有的请求因此最终使用旧的设备。 在卸载原始fs之前,您无法挂载克隆的fs(并且在挂载克隆的fs时无法挂载原始fs)。
我现在的问题是:如何将克隆的btrfs的uuid更改为一些新的未使用的uuid。 之后,我可以把克隆的设备与原来的设备一起安装。
我没有大规模地看过这个,但是btrfs作为一个文件系统在磁盘组上工作,而不是在单个设备上工作。
我怀疑当安装发生时,btrfs无法区分装入的快照和真正挂载的文件系统。 实际上可以看到底层子卷的UUID,假设它是原始卷的镜像,并同时写入两个卷。
如果这个问题得到解决,我会感到惊讶,因为大多数意图和目的都是由btrfs快照取代LVM快照。
看来,udev正在造成这种行为。
执行lvcreate(或losetup)将导致“block”系统上的udev“更改”操作:
# udevadm monitor ... UDEV [62084.032411] change /devices/virtual/block/dm-7 (block) UDEV [62084.469374] change /devices/virtual/block/dm-6 (block) UDEV [62084.582549] change /devices/virtual/block/dm-6 (block) UDEV [62084.606191] change /devices/virtual/block/dm-5 (block) ...
这触发(在我的情况下)的规则
/lib/udev/rules.d/64-btrfs.rules
并调用内置的udev命令:
IMPORT{builtin}="btrfs ready $devnode"
它通过src / udev / udev-builtin-btrfs.c:52
err = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args);
登陆内核: http : //lxr.free-electrons.com/source/fs/btrfs/volumes.c#L848导致一个dmesg像:
... [62030.117248] btrfs: device label label devid 1 transid 13 /dev/dm-6 [62030.141242] btrfs: device label label devid 1 transid 13 /dev/dm-5 ...
目前还不清楚究竟是什么造成了“重新安装”或为什么需要。 但是重复的UUID负责的说法似乎并不遥远。
我甚至不确定这种重新安装(改变现有安装点的设备)是想要的还是有用的行为…
如果您想更改行为,则可以修改或删除btrfs-udev规则,但会失去function:热插拔btrfs usb磁盘后不会再进行自动挂载。