btrfs卷的LVM快照更改挂载的设备

我在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快照出于各种原因:

  • 我想备份vm_disks LV中的每个子卷和每个btrfs快照(并且我不知道存在多less和哪些快照/子卷)
  • 我的备份策略不应该依赖于文件系统。 理想情况下,在/ var / lib / libvirt / images中更改文件系统时,不需要更改其他任何内容

我的系统:

 #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磁盘后不会再进行自动挂载。