참조 링크에 대한 btrfs-send 데이터가 너무 많은 이유는 무엇입니까?

참조 링크에 대한 btrfs-send 데이터가 너무 많은 이유는 무엇입니까?

Btrfs "보내기" 파일 참조 링크와 관련하여 매우 이상한 문제가 발생했으며 여러 번 시도한 후에 세부 정보를 찾았습니다.

먼저 "1"이라는 하위 볼륨을 만들었습니다.

btrfs subvolume create 1

그 안에 파일을 추가하세요:

dd if=/dev/urandom of=1/a bs=64 count=3110017

이제 읽기 전용 스냅샷을 만든 sudo btrfs subvolume snapshot -r 1 1_ro0후 다음을 실행하여 cp --reflink=always 1/a 1/bro 스냅샷을 다시 만듭니다 sudo btrfs subvolume snapshot -r 1 1_ro1. 이제 "btrfs send"의 데이터 크기를 계산합니다.

sudo btrfs send -p 1_ro0 1_ro1 | wc -c

64864765약 61.9MiB를 출력합니다 . 이것은 매우 특이한 현상입니다. 방금 reflink를 사용하여 복사했는데 "btrfs send"가 왜 그렇게 많은 데이터를 출력하는지 모르겠습니다.

그러나 count위의 내용을 (3110017-1) dd로 바꾼 3110016다음 wc -c"btrfs send"를 사용하여 위 루틴을 다시 실행하면 604(604 B)를 얻을 수 있으며, 이는 내가 예상한 대로 604바이트만 얻을 수 있습니다.

또한 다음 두 가지 테스트를 수행하기 위해 bash 스크립트를 만들었습니다.

#!/bin/bash

btrfs subvolume create 1

rm -rf 1/*
dd if=/dev/urandom of=1/a bs=64 count=3110017
sudo btrfs subvolume snapshot -r 1 1_ro0
cp --reflink=always 1/a 1/b
sudo btrfs subvolume snapshot -r 1 1_ro1
sudo btrfs send -p 1_ro0 1_ro1 | wc -c
sudo btrfs subvolume delete 1_ro0 1_ro1


rm -rf 1/*
dd if=/dev/urandom of=1/a bs=64 count=3110016
sudo btrfs subvolume snapshot -r 1 1_ro0
cp --reflink=always 1/a 1/b
sudo btrfs subvolume snapshot -r 1 1_ro1
sudo btrfs send -p 1_ro0 1_ro1 | wc -c
sudo btrfs subvolume delete 1_ro0 1_ro1

rm -r 1

wc -c"btrfs send" 출력 데이터를 확인 하는 대신 btrfs receive --dumpdd 3110016값을 사용하면 다음과 같은 일부 "clone" 항목이 출력됩니다.

clone           ./1_ro1/b                       offset=0 len=134217728 from=./1_ro1/a clone_offset=0
clone           ./1_ro1/b                       offset=134217728 len=64823296 from=./1_ro1/a clone_offset=134217728
...

그러나 dd 값 3110017의 경우 다음과 같이 출력됩니다.

write           ./1_ro1/b                       offset=197918720 len=49152
write           ./1_ro1/b                       offset=197967872 len=49152
write           ./1_ro1/b                       offset=198017024 len=49152
write           ./1_ro1/b                       offset=198066176 len=49152
write           ./1_ro1/b                       offset=198115328 len=49152
write           ./1_ro1/b                       offset=198164480 len=49152
... (so many more)

여기에는 "쓰기" 항목이 많이 포함되어 있습니다.

나는 또한 이 웹사이트를 검색하고 발견했습니다:https://www.spinics.net/lists/linux-btrfs/msg105951.html, 파일 취약점에 대해 이야기하는 것과 같지만 제가 아는 한 분명히 불가능합니다.

이건 너무 이상해서 내가 무엇을 놓치고 있는지 모르겠습니다.

btrfs-progs버전은 5.18.1-1입니다.

설치 옵션 /proc/mount:rw,relatime,space_cache=v2,subvolid=5,subvol=/

감사해요!

관련 정보