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/b
ro 스냅샷을 다시 만듭니다 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 --dump
dd 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=/
감사해요!