#file-copy #cp #file #virtual-filesystem #coreutils #random-access

app xcp

xcp 是 Unix cp 命令的部分克隆,具有更友好的反馈和一些性能优化。有关功能和限制,请参阅 README。

48 个版本 (20 个重大更新)

0.21.2 2024年6月29日
0.20.4 2024年2月23日
0.16.0 2023年12月20日
0.12.2 2023年11月18日
0.1.1-alpha.32018年11月21日

#43文件系统

Download history 25/week @ 2024-05-04 28/week @ 2024-05-11 31/week @ 2024-05-18 23/week @ 2024-05-25 59/week @ 2024-06-01 67/week @ 2024-06-08 79/week @ 2024-06-15 675/week @ 2024-06-22 489/week @ 2024-06-29 178/week @ 2024-07-06 101/week @ 2024-07-13 118/week @ 2024-07-20 113/week @ 2024-07-27 148/week @ 2024-08-03 228/week @ 2024-08-10 52/week @ 2024-08-17

每月下载 579 次

GPL-3.0-only

140KB
2.5K SLoC

xcp: 扩展的 cp

xcp 是 Unix cp 命令的部分克隆。它不是作为一个完整的替代品,而是一个具有更多用户友好反馈和一些在特定任务中合理的优化的辅助工具(见下文)。

Crates.io Github Actions CircleCI Packaging status

警告xcp 目前是 beta 级软件,很可能包含错误和不可预期的或不一致的行为。可能不应该用于任何关键任务。

请注意,从虚拟文件系统(例如,/proc/sys)复制文件存在一些已知问题。有关处理内核生成文件的一些复杂性的概述,请参阅 这篇 LWN 文章。这是依赖于随机访问的文件工具的常见问题;例如,rsync 也有同样的问题。

安装

注意xcp 需要 Rust 1.70 或更高版本。

Cargo

xcp 可以直接从 crates.io 安装。

cargo install xcp

Arch Linux

xcp 在 Arch Linux 用户仓库中可用。如果您使用 AUR 辅助工具,可以执行如下命令

yay -S xcp

NetBSD

xcp 在 NetBSD 的官方仓库中可用。要安装它,只需运行

pkgin install xcp

功能和反功能

功能

  • 显示进度条,适用于目录和单个文件的复制。这可以通过 --no-progress 禁用。
  • 在 Linux 上,它使用 copy_file_range 调用来复制文件。这是 Linux 上文件复制的最有效方法;特别是它具有文件系统意识,可以通过在服务器端执行复制操作来极大地加快网络挂载的复制速度。然而,与 copy_file_range 不同,稀疏文件被检测并适当地处理。
  • 支持现代文件系统功能,例如reflinks
  • 针对“现代”系统进行优化(即多核、大量RAM和固态硬盘,尤其是连接到主系统总线上的硬盘,例如NVMe)。
  • 对于具有并行IO的系统,可选择激进的并行处理。在现代化笔记本电脑上的快速实验表明,在NVMe磁盘上进行并行复制可能会有所裨益。这显然高度依赖于系统。
  • 可切换“驱动程序”,以方便实验复制优化的替代策略。目前有2个驱动程序可用。
    • 'parfile':之前的硬编码xcp复制方法,它并行化树遍历和文件复制。这是默认设置。
    • 'parblock':一个实验性驱动程序,它将块级别的复制并行化。这可能在某些架构上提高性能,但增加了复杂性。欢迎测试。
  • 通过回退操作支持非Linux类Unix操作系统(OS X,*BSD),尽管在此情况下尚不支持稀疏文件。
  • 可选地理解.gitignore文件以限制复制的目录。
  • 可选的本地文件通配符。

(可能的)未来特性

  • 在适当的情况下将文件转换为稀疏文件,就像cp--sparse=always标志一样。
  • 使用lseek进行激进的稀疏性检测。
  • 在非Linux操作系统上,稀疏文件目前不支持,但如果有操作系统支持,则可以添加。

cp的不同之处

  • 默认情况下复制权限、xattrs和ACLs;可以使用--no-perms禁用。
  • 不支持虚拟文件复制;例如/proc/sys文件。
  • 字符文件,如套接字管道,作为设备复制(即通过mknod)而不是作为流复制其内容。
  • --reflink=never选项可能会在无声中执行reflink操作。这是由于使用了copy_file_range,它没有这样的覆盖,并且可能执行其自己的优化。
  • cp的“简单”备份不受支持,只有编号的。
  • 一些cp选项目前不可用,但将来可能添加。

性能

基准测试大多没有意义,但以下结果来自具有NVMe磁盘和单用户模式的笔记本电脑。目标复制目录是Firefox代码库的git检出,最近已完成gc(即单个4.1GB的pack文件)。在每次测试运行之前运行fstrim -vaecho 3 | sudo tee /proc/sys/vm/drop_caches以最小化SSD分配性能干扰。

注意:xcp针对具有大量RAM和固态硬盘的“现代”系统进行了优化。特别是,除非它们是高度并行的阵列,否则它在旋转磁盘上的性能可能较差。

本地复制

  • 单次4.1GB文件复制,每次运行时都会丢弃内核缓存
    • cp:~6.2秒
    • xcp:~4.2秒
  • 单次4.1GB文件复制,缓存预热(每次3次运行)
    • cp:~1.85秒
    • xcp:~1.7秒
  • 目录复制,每次运行时都会丢弃内核缓存
    • cp:~48秒
    • xcp:~56秒
  • 目录复制,缓存预热(每次3次运行)
    • cp:~6.9秒
    • xcp:~7.4秒

NFS复制

xcp 使用了 copy_file_range,它对文件系统有所了解。在NFSv4上,这将导致复制在服务器端发生,而不是通过网络传输。对于大文件来说,这可以带来显著的性能提升

  • 在NFSv4挂载上的单个4.1GB文件
    • cp:6分18秒
    • xcp:0分37秒

依赖项

~20–29MB
~534K SLoC