
フルコピーと記録中にコピー「コピー」を制御するcp
オプションがあることを知っています。--reflink
ls
btrfsでファイルが他のファイルといくつかのリポジトリを共有するか(記録中のコピーの意味で)確認するために(または他のコマンド)を使用できますか?
編集:@StéphaneChazelasが私に指摘しましたがfilefrag
失敗しました。
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
答え1
アップデート(2021年1月):@bitinerantのコメントをご覧ください。"btrfs-debug-treeは廃止されました。btrfs inform-internal dump-treeを使用してください。"
コマンドで見つける方法がわかりませんls
。でも本当に欲しいなら使えますbtrfs-progs/btrfs-デバッグ-ツリー。
そして引用リンク=常に、ファイルは共通データブロックを共有します。この共通データブロック(拡張とも呼ばれる)への参照数が1を超えています。
まず、ファイル1とファイル2のobjectidを見つける必要があります。
#./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>
上から我々はそれを見ることができます259(1)そして260(2)。
今、その参照を見つけます。範囲木から。次のコマンドは、2つのファイル間で共有されるデータブロックを探します。
# ./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
ボーナス:別の参照を作成してください。
# cp --reflink=always one three
参照数が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
このデータブロックは、objectid が指す 3 つのファイル間で共有されます。259,260,261。
答え2
ちょうど使用:
$ btrfs filesystem du .
Total Exclusive Set shared Filename
1.11GiB 1.11GiB - ./file1
1.12GiB 1.12GiB - ./file2
1.31GiB 0.00B - ./file3
3.54GiB 2.23GiB 1.31GiB .
この例では、「file3」は専用スペースを占有しないため、参照リンクのコピーです。
答え3
@pwaller回答2つのファイルが同じ範囲を共有していることを確認するために、各ファイルに対して比較できるデータ範囲のリストを表示します。これは(ほぼ)包装filefrag
で可能です。 FILE1とFILE2の範囲が等しいかどうかが表示され、この場合は互いに再リンクされます。e2fsprogs
filefrag -v FILE1 FILE2
filefrag
ファイル名が出力されるため、スクリプトでプログラム的にこれを行うのは難しいです。これには、filefrag
2つの変更を含むパッチのコピーがあります。
- 出力デバイスID
- ファイル名を1つだけ指定した場合、ファイル名は出力されません。
filefrag
これらの変更により、2 つの呼び出しの出力を比較できます。同じ場合、2つのファイルは互いに参照リンクです。
最後の警告: `出力がfilefrag
regexと一致すると、inline|unknown_loc|delalloc
ファイルにデータブロックがないため、ファイルを再接続できません。これを処理するためにパターンをチェックし、パターンがfilefrag
見つかったら、ファイル名自体を出力に追加してパッチをラップしました(他のファイル名の一致の出力と異なることを防ぐために、出力を各ファイル名に対して一意にするため)。 )。 @ StéphaneChazelasでコメントを見るここ詳細については。
プルリクエストを送信しました(https://github.com/tytso/e2fsprogs/pull/87)と質問(https://github.com/tytso/e2fsprogs/issues/88)これのために。
答え4
少なくともxfs
ファイルが変更されていない場合は、filefrag
フラグがshared
設定されます。
たとえば、
>filefrag -e foobar
Filesystem type is: 58465342
File size of filesystems.docker is 1344 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 348117738.. 348117738: 1: last,eof
foo: 1 extent found
>cp --reflink=auto foo bar
>filefrag -e foo
Filesystem type is: 58465342
File size of filesystems.docker is 1344 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 348117738.. 348117738: 1: last,shared,eof
foo: 1 extent found
警告:ファイルの一部が変更され、一部のブロックのみが公開されるとどうなるかわかりません。
警告2:これがbtrfsに適用されるかどうかわかりません(該当する場合はコメントを付けるか編集してください)