Làm thế nào để tìm hiểu xem một tập tin trên btrfs là copy-on-write?


7

Tôi biết rằng cpcó một --reflinktùy chọn để kiểm soát các bản sao đầy đủ so với "bản sao" trên bản sao.

Trên btrfs, tôi có thể sử dụng ls(hoặc một số lệnh khác) để tìm hiểu xem một tệp có chia sẻ (theo cảm giác sao chép khi ghi) một số lưu trữ với một tệp khác không?

EDIT: @ StéphaneChazelas chỉ cho tôi filefrag, nhưng điều đó không thành công với tôi:

root@void:/tmp/mount# mount | tail -1
/tmp/back on /tmp/mount type btrfs (rw,relatime,space_cache)
root@void:/tmp/mount# df -h | tail -1
/dev/loop0       32M   13M   20M  38% /tmp/mount
root@void:/tmp/mount# ls -lh
total 8.0M
-rw-r--r-- 1 root root 8.0M Jan 19 08:43 one
root@void:/tmp/mount# cp --reflink=always one two
root@void:/tmp/mount# sync
root@void:/tmp/mount# ls -lh
total 16M
-rw-r--r-- 1 root root 8.0M Jan 19 08:43 one
-rw-r--r-- 1 root root 8.0M Jan 19 08:45 two
root@void:/tmp/mount# df -h | tail -1
/dev/loop0       32M   13M   20M  38% /tmp/mount
root@void:/tmp/mount# filefrag -kvx one 
Filesystem type is: 9123683e
File size of one is 8388608 (8192 blocks of 1024 bytes)
FIEMAP failed with unknown flags 2
one: FIBMAP unsupported
root@void:/tmp/mount# uname -a
Linux void 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l GNU/Linux

2
Với filefrag -v, bạn có thể kiểm tra xem hai tệp có dữ liệu chung hay không.
Stéphane Chazelas

1
@ StéphaneChazelas: Thất bại cho tôi, xem chỉnh sửa của tôi.
không phải người dùng

Câu trả lời:


5

Tôi không biết làm thế nào để tìm thấy nó thông qua lslệnh. Nhưng nếu bạn thực sự muốn nó, bạn có thể sử dụng btrfs-pross / btrfs-debug-tree .

Với Reflink = always , các tệp sẽ chia sẻ một khối dữ liệu chung. Khối dữ liệu chung này (còn gọi là phạm vi) có nhiều hơn 1.

  1. Trước tiên, bạn cần tìm objectid cho các tệp một và hai

    #./btrfs-debug-tree  /dev/xvdc
    (Check under FS_TREE)
      <snip>
        item 8 key (256 DIR_INDEX 4) itemoff 15842 itemsize 33
            location key (259 INODE_ITEM 0) type FILE
            namelen 3 datalen 0 name: one
        item 9 key (256 DIR_INDEX 5) itemoff 15809 itemsize 33
            location key (260 INODE_ITEM 0) type FILE
            namelen 3 datalen 0 name: two
      </snip>
    

Từ trên chúng ta có thể thấy 259 (một)260 (hai) .

  1. Bây giờ tìm refs của nó. từ phạm vi cây. Lệnh dưới đây sẽ tìm thấy khối dữ liệu được chia sẻ giữa hai tệp.

    # ./btrfs-debug-tree  /dev/xvdc | grep -A2 "refs 2"
            extent refs 2 gen 9 flags DATA
            extent data backref root 5 objectid 260 offset 0 count 1
            extent data backref root 5 objectid 259 offset 0 count 1
    

Phần thưởng: Tạo một tài liệu tham khảo khác:

# cp --reflink=always one three

xác minh số tiền được tăng thêm 1.

# ./btrfs-debug-tree   /dev/xvdc | grep -A3 "refs 3"
        extent refs 3 gen 9 flags DATA
        extent data backref root 5 objectid 260 offset 0 count 1
        extent data backref root 5 objectid 261 offset 0 count 1
        extent data backref root 5 objectid 259 offset 0 count 1

Ở đây, khối dữ liệu được chia sẻ giữa ba tệp được trỏ đến bởi objectid 259,260,261 .


Cảm ơn, tốt để biết về btrfs-debug-tree.
không phải người dùng

1

Tôi vừa phát hành một chương trình có tên fienode(← link) tính toán hàm băm SHA1 của các mức độ vật lý của một tệp. Bản sao CoW giống hệt nhau có cùng hàm băm.

Ngoài ra còn có một câu trả lời chi tiết hơn ở đây, giải thích tại sao điều này là cần thiết.

Tuy nhiên, lưu ý rằng BTRFS có quyền tự do thay đổi phạm vi vật lý. Tôi đã quan sát thấy một tệp lớn bị phản xạ thay đổi phạm vi vật lý của nó mà không bị khiêu khích, làm cho fienodeđầu ra khác đi, mặc dù phần lớn các phạm vi vật lý vẫn được chia sẻ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.