克隆文件或目录
备注
私有部署 克隆的源和目的地必须位于同一分区。JuiceFS 5.3 及之前的版本不支持跨分区克隆。
juicefs clone(别名 juicefs snapshot)会对指定数据进行克隆,创建克隆时不会实际拷贝对象存储数据,而是仅拷贝元数据,因此不论对多大的文件或目录进行克隆,都非常快。对于 JuiceFS,这个命令是 cp 更好的替代,甚至对于 Linux 客户端来说,如果所使用的内核支持 copy_file_range,那么调用 cp 时,实际发生的也是同样的元数据拷贝,调用将会格外迅速。
克隆结果是纯粹的元数据拷贝,实际引用的对象存储块和源文件相同,因此在各方面都和源文件一样,可以正常读写。有任何一方文件数据被实际修改时,对应的数据块变更会以写入时重定向(ROW,Redirect on Write)的方式,写入到新的数据块,并将指针指向新的数据块。而其他未经修改的文件区域,由于对象存储数据块仍然相同,所以引用关系依然保持不变。如果对快照文件进行随机写、覆盖写等操作,和普通的 JuiceFS 文件一样,快照文件也会产生文件碎片,文件碎片会通过后台任务中的碎片合并功能进行合并,来提升读取效率。
使用这个命令需要注意:
- 虽然不会拷贝对象存储内容,但是克隆产生的元数据,也同样占用文件系统存储空间(包括 inode)以及元数据引擎的存储空间,会增加计费用量,因此对庞大的目录进行克隆操作时请格外谨慎;
- 拷贝大目录需要耗费一些时间,在这个过程中如果文件被删除或者移动,命令会提示文件不存在(
no such file),是正常现象; - JuiceFS 文件系统之间是隔离的,无法跨文件系统创建克隆。
juicefs clone SRC DST
# 克隆文件
juicefs clone /mnt/jfs/file1 /mnt/jfs/file2
# 克隆目录
juicefs clone /mnt/jfs/dir1 /mnt/jfs/dir2
# DST 以斜杠结尾时被视为已存在的目录,克隆会以源的 basename 创建在其中
# (这里生成 /mnt/jfs/backup/file1)
juicefs clone /mnt/jfs/file1 /mnt/jfs/backup/
# 源为目录时同理(这里生成 /mnt/jfs/backup/dir1)
juicefs clone /mnt/jfs/dir1 /mnt/jfs/backup/
# 保留源文件的 UID、GID 和权限模式
juicefs clone -p /mnt/jfs/file1 /mnt/jfs/file2
# 删除克隆(自 5.4 起已弃用,建议改用 rmr 或 rm -r)
juicefs clone -d /mnt/jfs/file2
# 推荐使用 rmr 删除克隆
juicefs rmr /mnt/jfs/file2
# 或使用 rm -r
rm -r /mnt/jfs/file2


