当我在 USB 读卡器中卸载 SD 闪存卡,然后拔出卡时,文件系统保持“脏”状态。
系统:
- RPi 或 xubuntu 16.04.3
- 读卡器是一些超便宜的中国读卡器。我尝试了几种不同的
- 我尝试过很多不同的 SD 卡。
如何重现:
- 连接读卡器
- 将带有 vfat 的 SD 卡插入第一个分区
- 等待系统检测到SD卡
- 等待系统自动挂载文件系统或手动挂载
- 更新随机文件,我这样做:
date >> /media/mogul/2E3E-AE54/d
- 卸载:
sudo umount /dev/sdd1
- (占位符,这里什么也不做)
- 从读卡器中拔出 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
- 读取SD卡上的随机字节,例如:
dd if=/dev/sdd1 skip=1000000 ibs=1 count=1 of=/dev/null
文件系统似乎仍然存在。
这对我来说似乎有点老套,我是否错过了一些基本的东西?
您有更优雅的解决方案吗?
我不喜欢使用eject
,而只是umount, since
弹出`来关闭读卡器的电源;在我重新插入读卡器之前,系统不会检测到新的 SD 卡。
答案1
作为第 7 步,请尝试以下操作:
echo 1 | sudo tee /sys/block/sdd/device/delete
或者如果您以 root 身份运行,只需
echo 1 > /sys/block/sdd/device/delete
这向内核发出设备/dev/sdd
即将被删除的信号,并且应该触发对卡的任何剩余写入缓冲区的受控刷新,以避免文件系统损坏。
这可能会导致读卡器断电,类似于该eject
命令;如果确实如此,另一种方法是仅刷新缓冲区,而不意味着即将删除设备。这可以通过以下命令来实现blockdev
:
sudo blockdev --flushbufs /dev/sdd
如果这没有帮助,那么恐怕读卡器可能不支持热拔插卡。这对于廉价的读者来说是可能的。使用此类读卡器的唯一安全方法是首先从 USB 端口拔下读卡器,然后才从读卡器中取出卡。
答案2
在步骤 7 中发出命令sync
会将缓冲区高速缓存写入 SD 卡,并生成一个干净的文件系统。