每次我卸载在 DSLR 上使用的 SD 卡的文件系统时,我都必须等待几秒钟才能umount
完成命令 - 即使我刚刚将 FS 安装为只读并立即卸载它。挂载命令很简单:
mount /dev/sdd1 /mnt/tmp -oro
我尝试设置vm.block_dump=1
看看发生了什么,这是我发出时看到的umount /mnt/tmp
:
$ tail -n9999 /var/log/kern.log | grep sdd1
<...>
Jul 7 16:56:42 IntegralH kernel: [143924.204781] umount(16203): READ block 1635 on sdd1 (1 sectors)
Jul 7 16:56:42 IntegralH kernel: [143924.210786] umount(16203): READ block 1636 on sdd1 (1 sectors)
Jul 7 16:56:42 IntegralH kernel: [143924.216805] umount(16203): READ block 1637 on sdd1 (1 sectors)
Jul 7 16:56:42 IntegralH kernel: [143924.222841] umount(16203): READ block 1638 on sdd1 (1 sectors)
Jul 7 16:56:42 IntegralH kernel: [143924.228867] umount(16203): READ block 1639 on sdd1 (1 sectors)
<...>
Jul 7 16:57:34 IntegralH kernel: [143976.105848] umount(16203): READ block 9006 on sdd1 (1 sectors)
Jul 7 16:57:34 IntegralH kernel: [143976.111932] umount(16203): READ block 9007 on sdd1 (1 sectors)
Jul 7 16:57:34 IntegralH kernel: [143976.117915] umount(16203): READ block 9008 on sdd1 (1 sectors)
块 1639 之后的跳过部分由 1639 到 9006 之间每个块的单块读取组成。为了确保我的怀疑是正确的,我检查了 FS 的第一个扇区:
$ sudo head -c 40 /dev/sdd1 | xxd -g1
0000000: eb 00 90 43 41 4e 4f 4e 45 4f 53 00 02 40 62 06 ...CANONEOS..@b.
0000010: 02 00 00 00 00 f8 00 00 3f 00 ff 00 00 20 00 00 ........?.... ..
0000020: 00 18 9a 03 cf 1c 00 00 ........
您可以看到保留扇区的数量(表示 FAT 的第一个扇区;偏移量 0x0E 处的 2 个字节)为 0x662,即 1634。FAT 的大小(偏移量 0x24 处的 4 个字节)为 0x1ccf,即 7375 =9008+1-1634。即驱动程序读取除第一个扇区之外的整个 FAT。
我现在想知道,为什么驱动程序需要读取整个 FAT 来卸载文件系统?又该如何避免这种耗时的操作呢?