简而言之
请注意:当您对可移动设备(如 USB 记忆棒)执行“安全删除”操作时,请不要担心将其从端口移除。
更长的故事
上周末,我拿着 U 盘去找姐姐看我的一些照片,结果让我大吃一惊。我们一直在看这些照片,突然在幻灯片播放到 40% 左右时,出现了一条消息,说电视无法读取文件。剩下的 60% 的照片也出现了同样的情况。遗憾的是,我们停了下来。回到家后,我检查了一下,发现其余文件确实已损坏。
我尝试复制这个多次:
- 开始将文件复制到 USB 记忆棒(约 3.5GB 的照片)。
- 等到复制通知100%完成。
- 在 KDE 的 Dolphin 文件资源管理器中,单击 USB 记忆棒上的“安全删除”。
- 从端口移除 USB 记忆棒(轰!数据丢失)。
我简直不敢相信,但这种行为是一致的。起初我使用的是没有使用 LED 指示灯的 USB 记忆棒,所以我无法判断它在硬件层面上是否处于繁忙状态。然后我换了一个带 LED 指示灯的旧金士顿 USB 记忆棒,然后完成第 3 步(单击 USB 上的“安全移除”)后,使用情况 LED 闪烁几分钟!!!
原因
我在网上搜索过,这个问题似乎与 Linux 内核如何缓冲对可移动设备的写入操作有关。目前有建议主要降低dirty_bytes
内核参数值,但我认为这不是一个解决方案。给用户一种印象,现在他可以安全地移除该设备,而实际上复制过程正在进行中,这是一种不行!KDE 显然从内核那里得到了一个错误信号,表示复制过程已完成。但这只是从 shell 的角度来看才算完成。在 shell 通知完成 100% 时,它刚刚完全移至写入缓存。然后内核以实际的 USB 棒传输速度缓慢地写入,直到真正完成。
临时解决方案
目前我发现唯一可行的解决方案是sync
命令。在拔出 USB 之前,只需sync
在命令行中调用。这会刷新所有缓冲区并等待真正做到了sync
。我通过金士顿棒上的使用 LED 指示灯确认了这一点。命令返回后,LED 立即停止闪烁。
解决方案
这是我的问题:发生了什么事?是我遗漏了什么吗?还是现在每个(缺乏经验的)Linux 用户都会开始担心数据丢失?