btrfs
支持引用链接,XFS
支持引用链接(我认为是 2017 年以来?)。
是否有其他文件系统支持它?
truncate -s 1G test.file;
cp --reflink=always test.file ref.test.file;
Run Code Online (Sandbox Code Playgroud) 我正在阅读rmlint
手册,其中一个重复的处理程序是 clone 和 reflink:
·克隆:仅限btrfs。尝试使用 BTRFS_IOC_FILE_EXTENT_SAME ioctl(3p) 克隆这两个文件。这将物理删除重复的范围。至少需要内核 4.2。
· reflink:尝试将重复文件重新链接到原始文件。另请参阅 man 1 cp 中的 --reflink。如果文件系统不支持,则失败。
这个克隆到底做了什么,它与引用链接有什么不同?BTRFS_IOC_FILE_EXTENT_SAME ioctl 有什么作用?
很明显,cp --reflink foo bar
我可以在 btrfs 上复制文件而不会浪费空间。但是我如何检测这两个文件(此处为 foo 和 bar)使用相同的“空间单位”?
如果它们是硬链接,我将用于[ foo -ef bar ]
比较或stat -c%i foo
获取唯一的 id(在本例中为索引节点)。
btrfs reflinked 文件是否有类似的命令?
我想将其应用到 300G 卷上,由于重复数据删除,该卷的大小实际上为 6T,所以我想避免校验和......
我目前在小型个人 Linux 服务器上设置了 4TB RAID 1,该服务器在 LVM 中格式化为 XFS。我对启用reflink
XFS的功能很感兴趣,但是当我第一次创建文件系统时我没有这样做(我使用了默认值)。
有没有一种方法可以打开该reflink
功能,而无需备份和重新创建文件系统?如果没有,我是否可以期望在未来实现该功能?
我尝试递归地创建目录的快照副本,但如果文件系统(自定义 shfs)不支持reflink
副本,它会为每个文件返回错误:
# cp -a --reflink=always /mnt/user/libvirt /mnt/user/libvirt_copy
cp: failed to clone '/mnt/user/libvirt_copy/libvirt/libvirt.img' from '/mnt/user/libvirt/libvirt.img': Operation not supported
cp: failed to clone '/mnt/user/libvirt_copy/libvirt/test.txt' from '/mnt/user/libvirt/test.txt': Operation not supported
...
Run Code Online (Sandbox Code Playgroud)
由于似乎不可能cp
在第一个错误(?)时停止,这意味着对可能数千个文件的无用循环,因此我喜欢预先检查文件系统是否支持引用链接。
一种想法是搜索单个文件并进行测试复制:
if ! find /mnt/user/libvirt -type f -print -quit | xargs -I {} sh -c 'dst_path=$(dirname $(echo {} | sed "s#^/mnt/user/libvirt#/mnt/user/libvirt_copy#")); mkdir -vp $dst_path && cp -a --reflink=always {} "$dst_path"'; then
echo "Error: Filesystem does not support reflink"
exit
fi
Run Code Online (Sandbox Code Playgroud)
但这留下了目录和一个空文件,之后需要清理:
# find /mnt/user/libvirt_copy/
/mnt/user/libvirt_copy/
/mnt/user/libvirt_copy/libvirt.img …
Run Code Online (Sandbox Code Playgroud) --link
和 和有什么区别--reflink=always
?
我使用以下命令作为mv
替代,我想知道使用是否--reflink
是更好的选择。
command gcp -r --link --archive --verbose "${opts[@]}" "$@"
# delete the sources manually
Run Code Online (Sandbox Code Playgroud)