umount sdcard 使 fat-fs 不干净

mog*_*gul 3 linux unmounting usb-drive

当我在 USB 读卡器中卸载 SD 闪存卡,然后拔出卡时,文件系统保持“脏”。

系统:

  • RPi 或 xubuntu 16.04.3
  • 读卡器是一些超级便宜的中国读卡器。我尝试了一些不同的
  • 我尝试了一堆不同的 SD 卡。

如何重现:

  1. 连接读卡器
  2. 在第一个分区插入带有 vfat 的 SD 卡
  3. 等待系统检测到 SD 卡
  4. 等待系统自动挂载文件系统或手动挂载
  5. 更新一个随机文件,我这样做: date >> /media/mogul/2E3E-AE54/d
  6. 卸载: sudo umount /dev/sdd1
  7. (占位符,在这里什么也不做)
  8. 从读卡器中拔出 SD 卡

现在从第 2 步开始重复。注意你的 dmesg,它会说:

[357207.805594] FAT-fs (sdd1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

(较新的 linux 支持dmesg -w

现在,如果我在 umount

  1. 读取 SD 卡上的随机字节,例如: dd if=/dev/sdd1 skip=1000000 ibs=1 count=1 of=/dev/null

文件系统似乎幸存下来。

这对我来说似乎有点骇人听闻,我是否缺少一些基本的东西?

你有更优雅的解决方案吗?

我不喜欢使用eject,但也只使用umount, sinceeject` 来关闭读卡器的电源;在我重新插入读卡器之前,系统不会检测到新的 SD 卡。

tel*_*coM 5

作为您的第 7 步,请尝试以下操作:

echo 1 | sudo tee /sys/block/sdd/device/delete
Run Code Online (Sandbox Code Playgroud)

或者如果您以 root 身份运行,只需

echo 1 > /sys/block/sdd/device/delete
Run Code Online (Sandbox Code Playgroud)

这会向内核发出设备/dev/sdd即将被移除的信号,并且应该触发对卡的任何剩余写入缓冲区的受控刷新,以避免文件系统损坏。

这可能会导致读取器与eject命令类似的断电;如果是这样,另一种方法是只刷新缓冲区而不意味着即将移除设备。这可以通过以下blockdev命令实现:

sudo blockdev --flushbufs /dev/sdd
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,那么恐怕读卡器可能不支持热拔卡。这对于廉价的读者来说是可能的。使用这种读卡器的唯一安全方法可能是首先从 USB 端口拔下读卡器,然后才从读卡器中取出卡。