不确定是否应该在Android SE上发布此内容,因为我认为这与 Android 操作系统没有直接关系。在我的系统上,我手动mount
和umount
我的 HTC 设备使用以下选项/etc/fstab
:
UUID=3465-3762 /mnt/htc auto gid=100,umask=002,noauto,user,rw,exec 0 0
Run Code Online (Sandbox Code Playgroud)
这在修改 SD 卡上的少量数据时工作正常,但是每当我从另一台设备复制例如几个以 FLAC 编码的音乐专辑时 - 卸载 SD 卡似乎需要永远:
$ time umount /mnt/htc/
real 1m17.195s
user 0m0.000s
sys 0m0.237s
Run Code Online (Sandbox Code Playgroud)
这个时间和修改的数据量成正比吗?无论如何都要花这么长时间才能卸载它吗?
这与内核进行大量缓冲有关,包括缓冲对设备的写入。
如果您发出:
cp large_file /mnt/htc/
Run Code Online (Sandbox Code Playgroud)
cp
将在完成write
数据后立即返回,但是(对于合理的“慢”设备/连接)在实际写入数据之前很久。(除非cp
您使用的工具本身出现问题fsync
或类似的调用以等待实际数据到达驱动器 - 一些图形文件管理器会这样做,一些工具可以使用选项来控制它们是否这样做。)
unmount
在“分离”设备之前刷新写入缓冲区,这样您就不会丢失数据。如果内核缓冲了大量数据,则可能需要很多时间,而实际写入速度很慢。
尝试在执行复制和 的同时在终端中运行类似iostat 2
(的一部分sysstat
)unmount
,您应该看到写入 I/O,直到该点unmount
返回。