根据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 docs,df -i是有效的
df [-Pkmhai] [-B SIZE] [FILESYSTEM...]
-i Inodes

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

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

最佳答案

如果在编译时启用了FEATURE_DF_FANCY,则df在busybox中仅具有-i。

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

FAT32目录可以包含65,536个目录条目。

FAT32没有inode,而是由内核动态地不稳定地生成/仿真并缓存它们。

遵循提供的代码和错误消息。

首先,与您看到的消息相关的错误是按照hereENOSPC No space left on device
FileUtils.set_data调用glib fileutils函数g_file_set_contents(源位于here,Vala提交消息here)

在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,因此返回ENOSPC的函数为write_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,该文档已记录为here,其中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中,通过处于某种错误状态而返回ENOSPC的函数是fat_add_entries,当目录条目数达到一定数量时会执行此操作
    大于FAT32评估为2097152的最大目录大小。

    /source/fs/fat/fatent.c中,直接返回ENOSPC的函数为fat_alloc_clusters,当可用簇数为时执行此操作
    根据 super 块信息,少于请求分配的簇数。

    根据here,使用FAT32文件系统的卷上的最大群集数目为268,435,445。

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

    我不知道您的SD卡有多少个扇区,我无法计算群集总数。

    我不相信您已经超过了最大目录大小(尽管我不确定),所以我相信它与SD卡上的可用集群数有关。

    SD卡合法地不在群集中,或者文件系统仅认为它不在群集中。在文件系统上运行fsck(文件系统检查)可能会有所帮助。

    其他SD卡的行为是否相同?

    09-30 10:49