5

根据 df 的说法,设备上有足够的空间(大约 50G)。

/ # df db
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mmcblk0p3        61812032  11308736  50503296  18% /db

为什么这个 vala 代码可能另有说明?

try 
{
    FileUtils.set_data(bmp_path, bmp);
} 
catch (Error e)
{
    printf("Error! FileUtils.set_data %s\n%s\n", bmp_path, e.message);
}                             

当然,代码会打印出来

Error! FileUtils.set_data /db/20121112/165206.0.bmp
Failed to create file '/db/20121112/165206.0.bmp.9X8PNW': No space left on device

GLib.FileUtils 在一个目录中可以处理的文件数量是否有限制?/db/20121112 包含 27220 个文件(一半 jpeg 和一半 bmp)。

mmcblk0p3 是这样创建的

echo -e "n\np\n3\n66\n\nt\n3\nc\nw" | fdisk /dev/mmcblk0

并像这样格式化

mkfs.vfat -n DB -F 32 /dev/mmcblk0p3

这可能无关紧要,但该设备是 64G SD 卡,mmcblk0p1 和 mmcblk0p2 用于引导和 rootfs。

像 Barmar 在这样的评论中建议的那样检查 inode 会导致

df: invalid option -- 'i'
BusyBox v1.18.2 (2012-11-09 13:08:26 EST) multi-call binary.

这很奇怪,因为根据BusyBox 文档, df -i 是有效的

df [-Pkmhai] [-B SIZE] [FILESYSTEM...]
-i Inodes

还有另一种检查inode的方法吗?

更新 [11-15-2012]:我认为问题可能是每个文件夹中的文件太多,所以我修改了代码以每小时而不是每天打开一个新文件夹,但是在使用 16.7 保存大约均匀分布在 7 个文件夹中的 44354 张图像后它仍然死机64 GB SD 卡。

4

1 回答 1

8

df 只有在busybox 中有-i,如果FEATURE_DF_FANCY在编译时启用。

对于 FAT32 卷,一个文件夹中可以存储的最大文件数为 65,534。

一个 FAT32 目录可以有 65,536 个目录条目。

FAT32 没有 inode,而是由内核不稳定地生成/模拟并缓存。

按照提供的代码和错误消息。

首先,与您看到的消息相关的错误是 ENOSPC No space left on device这里。

FileUtils.set_data调用 glib fileutils 函数g_file_set_contents(源代码位于此处,Vala 提交消息位于此处

在 Linux 上(Windows 具有基于 ifdef 遵循的附加逻辑)

g_file_set_contents在同一源文件 gfileutils.c 中调用以下函数

  • write_to_temp_file
  • rename_file
  • g_unlink

正如您的错误消息中提到db/20121112/165206.0.bmp.9X8PNW的那样/db/20121112/165206.0.bmp,返回的函数ENOSPCwrite_to_temp_file

从错误消息的另一部分 ( Failed to create file) 我们知道导致错误的函数调用g_mkstemp_full是响应设置文件描述符 fd 的初始值的函数调用。

这个调用get_tmp_file,这个调用wrap_g_open,也就是GTmpFileCallback,用来判断文件描述符的值fd

wrap_g_open调用g_open(位于gstdio.c中)与其名称相符。

g_open此处open记录的调用以及 ENOSPC 描述为.pathname was to be created but the device containing pathname has no room for the new file

在 FAT 的内核源代码中,只有两个源文件返回ENOSPC,/source/fs/fat/dir.c/source/fs/fat/fatent.c.

在通过处于某种错误状态/source/fs/fat/dir.c 返回的函数中,当目录条目的数量大于 FAT32 的最大目录大小时,它会执行此操作,该大小被评估为 2097152。ENOSPCfat_add_entries

在直接/source/fs/fat/fatent.c返回的函数中是,当根据超级块信息的空闲簇数小于请求分配的簇数时执行此操作。ENOSPCfat_alloc_clusters

根据此处,使用 FAT32 文件系统的卷上的最大可能簇数为 268,435,445 。

您发布的 format 命令使用 mkdosfs 默认值,即每个集群 2 个扇区。指定包括 -s 、 -R 在内的各种选项可能会改变可用集群的数量,尽管我看到它的唯一用途是与 128KB 块对齐以增加磁盘吞吐量。

我不知道你的SD卡有多少个扇区,我无法计算出簇的总数。

我不相信你已经超过了最大目录大小(虽然我不能确定),所以我相信这与 SD 卡上的空闲集群数量有关。

要么您的 SD 卡合法地不在集群中,要么文件系统只是认为它不在集群中。在文件系统上运行 fsck(文件系统检查)可能会有所帮助。

不同的 SD 卡的行为方式是否相同?

于 2012-11-29T20:43:56.720 回答