我以前也遇到过类似的问题,但我不记得我是如何解决的。
当我尝试使用 FAT 将某些内容复制到 USB 记忆棒时,它会在接近尾部时停止,有时会停止到 100%。当然,当我将记忆棒转移到其他地方时,它不包含完整的文件。 (文件是电影!)
我尝试使用 mount -olush 安装设备,但遇到同样的问题。
另外,我确实使用新的 FAT 分区格式化了 USB 记忆棒...
知道我会做什么冷吗?
ps 我相信它与操作系统无关,即 Debian,并且我相信从 SSD 驱动器应对不会使其卡住。
答案1
发生这种情况的原因是程序说“写入此数据”,Linux 内核将其复制到排队进入磁盘的内存缓冲区中,然后说“确定,完成”。所以程序认为它已经复制了所有内容。然后程序关闭该文件,但突然内核让它等待,直到该缓冲区被推送到磁盘。
因此,不幸的是,程序无法告诉您刷新缓冲区需要多长时间,因为它不知道。
vm.dirty_bytes
如果您想尝试一些高级用户技巧,您可以通过将内核参数设置为类似15000000
(15 MB)来减小 Linux 使用的缓冲区大小。这意味着应用程序无法提前获得超过 15MB 的实际进度。 (您可以动态更改内核参数,sudo sysctl vm.dirty_bytes=15000000
但要使它们在重新启动后保持不变,需要更改配置文件,例如/etc/sysctl.conf
可能特定于您的发行版的配置文件。)
副作用是,使用此设置,您的计算机可能具有较低的数据写入吞吐量,但总的来说,我发现看到程序在写入大量数据的同时运行很长时间与拥有一个程序的混乱相比很有帮助。程序似乎已经完成了它的工作,但是当内核执行实际工作时,系统严重滞后。设置dirty_bytes
为相当小的值还可以帮助防止系统在可用内存不足并运行突然写入大量数据的程序时变得无响应。
但是,不要设置得太小!我使用 15MB 作为粗略估计,内核可以在 1/4 秒或更短的时间内将缓冲区刷新到普通硬盘驱动器。它使我的系统不会感到“滞后”。
答案2
虽然迟到了,但我用来将大文件复制到 USB 记忆棒的解决方法是rsync
.
我总是成功使用的基本语法如下:
rsync -avh /home/user/Documents /media/user/myusbstick
警告:如果你想复制整个文档文件夹,使用语法就可以了。但如果你想复制仅有的该文件和不是文件夹你必须添加一个斜杠。像这样:
rsync -avh /home/user/Documents/ /media/user/myusbstick
当然如果你想复制文件:
rsync -avh /home/user/Documents/file1 /media/user/myusbstick
对于多个文件
rsync -avh /home/user/Documents/file1 /home/user/Documents/file2 /media/user/myusbstick
该语法适用于您要复制的任何文件夹/文件。
我知道这不是真正的解决方案,但这是避免恼人问题的一种简单而安全的方法。
答案3
老问题,但似乎问题仍然出现。按照建议将缓冲区设置为 15MB这里在 Ubuntu 19.04 上无法运行,导致我的系统陷入瘫痪。
我试图将 1.5GB 文件复制到空的(新格式化的)FAT32 16GB 驱动器上。我让它运行了大约 10 分钟,只是为了看看它是否能完成,但没有成功。
重新格式化为 NTFS 让操作在 10 秒内完成。我不知道为什么这很重要,因为 FAT32 应该允许任何大小低于 4GB 的单个文件,但它似乎工作得很好。对于您想要与 MacOS 一起使用的驱动器来说,这不是一个理想的解决方案,但对于所有其他用例来说,这是一个简单的解决方法。我想 exFAT 也会有类似的效果,但我没有测试它。