为什么我无法在 Linux 下的 NTFS 分区上创建稀疏文件?

为什么我无法在 Linux 下的 NTFS 分区上创建稀疏文件?

我在 EXT4 分区上有一个非常大的稀疏文件,我想将该文件复制到 NTFS 分区。该文件大小约为 2 TB,但由于它是一个稀疏文件,因此仅占用 700 GB 的磁盘空间。

我想要将该文件复制到的 NTFS 分区只有大约 1.3 TB 的可用空间。因此,如果我可以将稀疏文件复制到那里,它应该可以轻松容纳;但是作为非稀疏文件,它不适合。

我尝试使用一个简单的命令复制文件cp -a,但最终失败,提示“设备上没有剩余空间”。有趣的是,它失败时仍有大约 570 GB 的可用空间。

通过检查文件大小及其报告的磁盘使用情况,我可以看到 NTFS 分区上的文件并不稀疏。

我还尝试使用以下任一命令手动创建稀疏文件:

  • dd if=/dev/zero of=test1.bin bs=1 count=1 seek=100000
  • truncate -s 100000 test2.bin

在 EXT4 分区上,创建的两个文件都很稀疏(du -h显示它们在磁盘上使用 0 字节)。但在 NTFS 分区上,每个文件实际上使用 100 KB 的磁盘空间,根据du -h和也根据ls -lsk

那么:为什么我无法在 NTFS 分区上创建稀疏文件?我该怎么做才能将大文件作为稀疏文件复制到 NTFS 分区?

发生这种情况的系统:

  • Debian 11(Bullseye)x86-64
  • 内核软件包 5.10.92-1
  • ntfs-3g 软件包 1:2017.3.23AR.3-4+deb11u1

根据mount,NTFS 分区的安装方式如下:
/dev/sdg1 on /mnt/loop2 type fuseblk (rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)

我的理解是,该分区是使用 ntfs-3g 驱动程序安装的 - 对吗?并且根据man ntfs-3g该驱动程序支持稀疏文件。我也没有找到任何启​​用或禁用该功能的选项。

我没有自己创建 NTFS 分区,而是使用了购买驱动器时驱动器上的现有分区。

答案1

cp --sparse=always应该可以解决问题,

root@devad22:/t# truncate -s 1G ntfs
root@devad22:/t# mkfs.ntfs ntfs --force
ntfs is not a block device.
mkntfs forced anyway.
The sector size was not specified for ntfs and it could not be obtained automatically.  It has been set to 512 bytes.
The partition start sector was not specified for ntfs and it could not be obtained automatically.  It has been set to 0.
The number of sectors per track was not specified for ntfs and it could not be obtained automatically.  It has been set to 0.
The number of heads was not specified for ntfs and it could not be obtained automatically.  It has been set to 0.
Cluster size has been automatically set to 4096 bytes.
To boot from a device, Windows needs the 'partition start sector', the 'sectors per track' and the 'number of heads' to be set.
Windows will not be able to boot from this device.
Initializing device with zeroes: 100% - Done.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.
root@devad22:/t# mkdir mnt
root@devad22:/t# mount ntfs mnt
root@devad22:/t# truncate -s 10G 10G_sparse_file.ext
root@devad22:/t# cp --sparse=always 10G_sparse_file.ext mnt/should_be_10G_sparse.ext
root@devad22:/t# cd mnt
should_be_10G_sparse.ext
root@devad22:/t/mnt# du -h .
4.0K    .
root@devad22:/t/mnt# du -h --apparent-size .
11G .
root@devad22:/t/mnt# df -h -
df: -: No such file or directory
root@devad22:/t/mnt# df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2      1.0G  5.7M 1019M   1% /t/mnt
root@devad22:/t/mnt# 
root@devad22:/t# dd if=/dev/zero of=10GB_not_sparse.ext bs=1G count=10
10+0 records in
10+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 14.0689 s, 763 MB/s
root@devad22:/t# cp --sparse=always 10GB_not_sparse.ext mnt/10GB_sparse_from_not_sparse.ext
root@devad22:/t# cd mnt
10GB_sparse_from_not_sparse.ext  should_be_10G_sparse.ext
root@devad22:/t/mnt# df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2      1.0G  5.7M 1019M   1% /t/mnt
root@devad22:/t/mnt# du -h .
4.0K    .
root@devad22:/t/mnt# du -h --apparent-size .
21G .
  • 对我来说,复制到cp --sparse=alwaysNTFS 效果很好,无论是从稀疏还是从非稀疏,结果都是稀疏的 :) 使用 Ubuntu 22.04 和 ntfs-3g 2021.8.22

答案2

通常,如果稀疏文件的标称大小超出了可用空间量,则您无法在 Windows 中复制或创建稀疏文件。此外,Windows 文件可能需要由 fsutil 稀疏命令,或者它们并不稀疏。

我建议从 Windows 内部进行复制,也许使用以下实用程序 稀疏.zip,位于文章末尾 面向程序员的 NTFS 稀疏文件

该命令的语法很简单:

cs.exe from-path to-path

如果由于该文件仅在 Linux 上而无法在 Windows 上执行此操作,请尝试tar在 Linux 上访问该文件,然后使用 Windows Subsystem for Linux (WSL) 在目标 Windows 系统上解压它。

相关内容