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)が得られます。
また、次の2つのテストを実行するために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
dd3110016
値を使用すると、次のようないくつかの "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=/
ありがとうございます!