Tôi có một khối lượng btrf trên LVM. Bây giờ tôi muốn chụp nhanh ở cấp lvm (KHÔNG PHẢI ở cấp btrfs). Nhưng mỗi khi tôi tạo ảnh chụp nhanh LVM, btrfs sẽ thay đổi thiết bị khối được gắn thành ảnh chụp nhanh giống như tôi đang sử dụng một số loại tùy chọn gắn kết --bind.

Tình hình:

# mount | grep libvirt
/dev/dm-4 on /var/lib/libvirt/images type btrfs (rw,relatime,space_cache)
# ls -l /dev/mapper | grep dm-4
lrwxrwxrwx 1 root root       7 Mär 17 01:18 system-vm_disks -> ../dm-4
# lvcreate -s /dev/system/vm_disks -n vm_backup -L 32G
  Logical volume "vm_backup" created
# mount | grep libvirt
/dev/dm-5 on /var/lib/libvirt/images type btrfs (rw,relatime,space_cache)
# ls -l /dev/mapper | grep dm-5
lrwxrwxrwx 1 root root       7 Mär 17 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 Mär 17 01:26 /var/lib/libvirt/images/touchME

Khi tôi xóa ảnh chụp nhanh:

# umount /mnt/test
# lvremove /dev/system/vm_backup 
Do you really want to remove active logical volume vm_backup? [y/n]: y
  Logical volume "vm_backup" successfully removed
# mount | grep libvirt
/dev/dm-4 on /var/lib/libvirt/images type btrfs (rw,relatime,space_cache)
# ls -l /dev/mapper | grep dm-4
lrwxrwxrwx 1 root root       7 Mär 17 01:21 system-vm_disks -> ../dm-4
# ls -l /var/lib/libvirt/images/touchME
-rw-r--r-- 1 root root 0 Mär 17 01:26 /var/lib/libvirt/images/touchME

Tôi hy vọng ảnh chụp nhanh của mình là ảnh chụp nhanh thực sự chứ không phải thứ gì đó giống như một --bind mount. Tôi đang sử dụng ảnh chụp nhanh LVM để sao lưu trạng thái hệ thống nhất quán qua rsync vào máy chủ sao lưu của chúng tôi. Và tôi không muốn sử dụng ảnh chụp nhanh btrfs vì nhiều lý do:

  • Tôi muốn sao lưu mọi subvolume và mọi ảnh chụp nhanh btrfs bên trong vm_disks LV (và tôi không biết có bao nhiêu và những snapshot / subvolumes nào tồn tại)
  • Chiến lược sao lưu của tôi không nên phụ thuộc vào hệ thống tệp. Tốt nhất là không cần thay đổi bất kỳ thứ gì khác khi thay đổi hệ thống tệp tại / var / lib / libvirt / images

Hệ thống của tôi:

# uname -a
Linux laptop 3.12-1-amd64 #1 SMP Debian 3.12.9-1 (2014-02-01) x86_64 GNU/Linux
# lvm version
  LVM version:     2.02.104(2) (2013-11-13)
  Library version: 1.02.83 (2013-11-13)
  Driver version:  4.26.0
# btrfs --version
Btrfs v3.12

Tôi phải sử dụng ít nhất kernel 3.9 hoặc mới hơn vì tôi sử dụng các tính năng NAT của IPv6 được cung cấp bởi Linux 3.9 hoặc mới hơn (vâng, tôi biết bạn không nên sử dụng NAT với IPv6, nhưng đó là một câu chuyện khác).

Cảm ơn bạn đã giúp đỡ!

Chỉnh sửa:

Tôi đã thực hiện một số thí nghiệm bằng cách sử dụng thiết bị dd và vòng lặp. Hành vi này không dành riêng cho LVM.

Kiểm tra:

# mkfs.btrfs /dev/loop0
[...]
# mount /dev/loop0 original
# touch original/original_file
# ls -l original
-rw-r--r-- 1 root root 0 Mar 28 21:42 original_file
# dd if=/dev/loop0 of=/dev/loop1
509312+0 records in
509312+0 records out
260767744 bytes (261 MB) copied, 1.76431 s, 148 MB/s
# mount /dev/loop1 clone
# touch clone/expected_clone_file
# ls -l clone
-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 original
-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 clone
# umount original
# mount /dev/loop1 clone
# ls -l clone
-rw-r--r-- 1 root root 0 Mar 28 21:42 original_file
# umount clone
# mount /dev/loop0 original
# ls -l original
-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

Vì vậy, bất cứ khi nào bạn cố gắng gắn kết một thiết bị mới với hệ thống tệp btrfs được sao chép bên trong, bạn sẽ sử dụng thiết bị cũ đã được gắn kết (nhưng không có gì trong đầu ra của mount chỉ ra điều này một cách chính xác, như bạn có thể thấy trong thử nghiệm LVM ở trên). Do đó, tất cả các yêu cầu đều sử dụng thiết bị cũ. Bạn không thể gắn fs nhân bản cho đến khi bạn ngắt kết nối fs ban đầu (và bạn không thể gắn fs ban đầu trong khi gắn kết fs nhân bản).

Câu hỏi của tôi bây giờ là: Làm cách nào để thay đổi uuid của btrfs nhân bản thành một số uuid mới chưa được sử dụng. Sau đó, tôi sẽ có thể gắn thiết bị nhân bản cùng với thiết bị gốc, tôi nghi ngờ.

answer

Tôi chưa xem xét nhiều về vấn đề này nhưng btrfs như một hệ thống tệp hoạt động trên các nhóm đĩa, không phải thiết bị riêng lẻ.

Tôi nghi ngờ rằng không có cách nào để btrfs phân biệt giữa ảnh chụp nhanh được gắn kết và hệ thống tệp được gắn kết thực sự khi xảy ra gắn kết. Trên thực tế, có thể thấy UUID của ổ phụ bên dưới, giả sử nó là bản sao của ổ gốc và ghi vào cả hai ổ cùng một lúc.

Tôi sẽ ngạc nhiên nếu điều này từng được sửa chữa vì đối với hầu hết các ý định và mục đích ảnh chụp nhanh btrfs thay thế ảnh chụp nhanh LVM.

Có vẻ như udev đang gây ra hành vi này.

Thực hiện lvcreate (hoặc losetup) gây ra các hành động "thay đổi" udev trên hệ thống "khối":

# 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)
...

mà kích hoạt (trong trường hợp của tôi) các quy tắc từ

/lib/udev/rules.d/64-btrfs.rules

và gọi lệnh udev nội trang:

IMPORT{builtin}="btrfs ready $devnode"

chuyển qua src / udev / udev-builtin-btrfs.c: 52

err = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args);

Để hạ cánh trong hạt nhân tại: http://lxr.free-electrons.com/source/fs/btrfs/volumes.c#L848 gây ra một dmesg như:

...
[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
...

Không rõ chính xác điều gì đang gây ra "số tiền còn lại" hoặc tại sao nó lại cần thiết. Nhưng các nhận xét mà UUID trùng lặp chịu trách nhiệm dường như không được tìm nạp xa.

Tôi thậm chí không chắc rằng loại số tiền còn lại này (thay đổi thiết bị của điểm gắn kết hiện có) là hành vi mong muốn hay hữu ích ...

Nếu bạn muốn thay đổi hành vi, bạn có thể sửa đổi hoặc loại bỏ các quy tắc btrfs-udev khi mất chức năng: không còn tự động gắn kết sau khi cắm nóng đĩa usb btrfs.