根据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。
在像这样的评论中建议将inode检查为Barmar会导致
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的方法吗?
更新[2012年11月15日]:我认为问题可能是每个文件夹的文件太多,所以我修改了代码,每小时打开一个新文件夹而不是每天,但是在保存44354后它仍然死亡 使用16.7 64 GB SD卡均匀分布在7个文件夹中的图像。
答案 0 :(得分:7)
df在busybox中只有-i,如果在编译时启用了FEATURE_DF_FANCY
。
对于FAT32卷,可以存储在a中的最大文件数 文件夹是65,534。
FAT32目录可以有65,536个目录条目。
FAT32没有inode,而是由内核动态生成/模拟并缓存。
按照提供的代码和错误消息。
首先,根据here,与您看到的消息相关联的错误为ENOSPC 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
,它会在空闲集群数量时执行此操作
根据超级块信息少于请求分配的簇数。
根据here,使用FAT32文件系统的卷上最大可能的群集数为268,435,445。
您发布的format命令使用每个群集2个扇区的mkdosfs默认值。指定各种选项(包括-s,-R)可能会更改可用的群集数量,但我所看到的唯一用途是与128KB块对齐以增加磁盘吞吐量。
我不知道您的SD卡有多少扇区,我无法计算群集总数。
我不相信你已超过最大目录大小(虽然我不能确定),所以我认为这与SD卡上的免费群集数量有关。
您的SD卡合法地不在群集中,或者文件系统只是认为它不在群集中。在文件系统上运行fsck(文件系统检查)可能会有所帮助。
另一张SD卡的行为方式是否相同?